【问题标题】:Gitignore a file if file with different extension exists如果存在具有不同扩展名的文件,则忽略文件
【发布时间】:2015-04-04 04:48:22
【问题描述】:

在涉及解析器的项目中,某些源代码是程序的产物。例如,yacc 生成 - 基于 .yy 文件 - 实现解析器的源代码文件。

由于.yy 文件中的小修改可能导致编译后相应源代码文件发生较大更改,并且生成的源代码(几乎)在生成后从未更改。此类源代码文件非常适合 .gitignore 列表。

现在当然可以手动将此类文件写入列表:

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

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

有没有办法指定一个如下行为的模式:

给定文件foo.ext1 存在,忽略foo.ext2

因此提供ext1ext2。对于词法分析器/解析器,这意味着将这种模式应用于.xx/.cpp.yy/.cpp

.gitignore 直接可能无法做到这一点,但也许已经为此实现了一些钩子?

【问题讨论】:

  • 据我所知,没有简单的方法可以做到这一点。是否将您的.yy 和相应的.cpp 文件移动到子目录中,然后忽略目录中的所有.cpp 文件?
  • @Chris:这是一种选择,但如果可以生成一种通用方法来忽略编译器-编译器产品而不必担心文件结构,那当然会更优雅。
  • 文件实际上是根据上面示例中的某种模式命名的吗?你可以忽略lexer*.cppparser*.cpp
  • 如果你使用的是 linux,你可以编写一个更新 .gitignore 的 bash 脚本。

标签: git wildcard gitignore githooks


【解决方案1】:

我的建议是创建一个脚本来更新 .gitignore。 我不知道,但是您可以寻找在提交之前自动运行此脚本的解决方案。

编辑:我用谷歌搜索了这个:https://github.com/observing/pre-commit - 可能需要一些测试。

【讨论】:

    【解决方案2】:

    我可以看到三种方法来做到这一点 - 直接回答问题,不,忽略处理只咨询有问题的路径名,而不是关于环境的任何其他内容。

    1. 将您生成的源代码放在您忽略的generated 文件夹中。

      我,我最喜欢这个,我知道我是少数,但我不喜欢在我的源目录中构建碎屑。

    2. 让你的makefile目标也更新.gitignore,用

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

      其中target 是生成的源文件,作为配方的一部分。

    3. 在生成的文件名本身中添加一些标记,scanner.generated.c 或其他内容。

    出于某种原因,我真的不喜欢 pre-commit 钩子清除不需要的源,git 从提交中删除所有内容本身就是令人不安的。

    【讨论】:

    • OP 建议的解决方案 1 不优雅,但我认为它是最优雅的。文件夹应围绕根据逻辑分组分隔文件的系统构建。例如。许多人将 .h 和 .cpp 文件分开,因为一个(在大多数情况下)与接口有关,一个与实现有关,这带来了额外的好处,即能够为包含提供单一参考点。分离自动生成的源文件避免了 OP 的问题,这意味着开发人员可以在一个整洁的文件夹中工作,该文件夹只包含他们将要编辑的源文件。
    猜你喜欢
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-10
    • 1970-01-01
    相关资源
    最近更新 更多