如果存在不同扩展名的文件,如何在Git中忽略一个文件

12

在处理器涉及的项目中,一些源代码是程序的产物。例如,yacc会根据一个 .yy文件生成一个实现处理器的源代码文件。

由于在 .yy 文件中进行小的修改可能会导致编译后对应的源代码文件发生大的变化,并且生成的源代码文件(几乎)永远不会被修改。因此,这种源代码文件非常适合放在 .gitignore 列表中。

现在,当然可以手动将这些文件添加到列表中:

lexer1.cpp
parser1.cpp
lexer2.cpp
parser2.cpp

但是当一个人建立一个新的解析器时,很可能会忘记将文件添加到列表中。

是否有一种方式可以指定一个模式,以便按以下方式操作:

假设存在一个名为foo.ext1的文件,则忽略foo.ext2

其中提供了ext1ext2。对于词法/语法分析器而言,这意味着对于.xx/.cpp.yy/.cpp应用此模式。

这可能不能通过.gitignore直接实现,但也许已经有一些钩子可以实现这个功能?


1
据我所知,没有简单的方法来实现这个。将.yy文件和其对应的.cpp文件移动到子目录中,然后忽略目录中的所有.cpp文件,这是一个选择吗? - Chris
@Chris:那是一个选项,但如果能够生成一种通用的方式来忽略编译器产品而不必担心文件结构,当然更加优雅。 - Willem Van Onsem
文件名是否按照像上面的示例那样的某种模式命名?您可以忽略 lexer*.cppparser*.cpp - Chris
2
或者,如果您使用的是Linux,您可以编写一个Bash脚本来更新.gitignore。 - user4516901
2个回答

9
我能看到三种方法来做到这一点——直接回答问题,不,忽略处理只查询有关路径名的信息,而不查询环境中的其他任何内容。
  1. Put your generated source in a generated folder you ignore.

    Me, I like this one best, I know I'm in a minority but I don't like build detritus in my source directories.

  2. Have your makefile targets also update the .gitignore, with

    grep -qs ^target$ .gitignore || echo target >>.gitignore
    

    where target is the generated source file, as part of the recipe.

  3. put some marker in the generated filenames themselves, scanner.generated.c or something.

由于某些原因,我非常不喜欢 pre-commit 钩子清除不需要的源代码,Git 自己删除提交中的东西只会让人感到不安。


OP提出的解决方案1可能不够优雅,但我认为它是最优雅的。文件夹应该围绕一个根据逻辑分组文件的系统进行结构化。例如,许多人将.h和.cpp文件分开,因为一个主要涉及接口,另一个涉及实现,这样做还可以使包含只有一个参考点。分离自动生成的源文件可以避免OP的问题,并意味着开发人员可以在一个不混乱的文件夹中工作,其中只包含他们将要编辑的源文件。 - JBentley

0
我的建议是创建一个脚本来更新.gitignore文件。 我不知道有没有现成的,但你可以寻找一种解决方案,在提交之前自动运行此脚本。
编辑:我谷歌搜索并找到了这个:https://github.com/observing/pre-commit - 可能需要进行一些测试。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接