C 如何配置Git以忽略自动生成代码中的细微更改(例如时间戳)?

C 如何配置Git以忽略自动生成代码中的细微更改(例如时间戳)?,c,git,C,Git,我正在使用一个自动生成大量C代码的工具。该工具在每次运行时为一批.c和.h文件生成代码。由于某些原因,该工具不够智能,无法识别文件何时没有实质性更改,因此在许多情况下,它只是更新每个文件顶部注释中的时间戳。否则,文件将保持不变 在这种情况下,当我运行git status时,有时会看到几十个或数百个文件发生了更改。但是当我查看对单个文件的更改时,大多数文件都没有真正的更改—只是对时间戳的更新。我必须逐一检查每个文件,以确定是否有任何实际更改要提交 是否有一种方法可以配置Git,以便它可以忽略不重要

我正在使用一个自动生成大量C代码的工具。该工具在每次运行时为一批.c和.h文件生成代码。由于某些原因,该工具不够智能,无法识别文件何时没有实质性更改,因此在许多情况下,它只是更新每个文件顶部注释中的时间戳。否则,文件将保持不变

在这种情况下,当我运行
git status
时,有时会看到几十个或数百个文件发生了更改。但是当我查看对单个文件的更改时,大多数文件都没有真正的更改—只是对时间戳的更新。我必须逐一检查每个文件,以确定是否有任何实际更改要提交

是否有一种方法可以配置Git,以便它可以忽略不重要的更改,例如标题注释中的时间戳?或者我该如何处理这种情况

谢谢你的帮助

是否有一种方法可以配置Git,以便它可以忽略不重要的更改,例如标题注释中的时间戳?或者我该如何处理这种情况

对,;这就是过滤器的用途

您可能已经熟悉git的“干净”和“污迹”过滤器的概念,这就是它处理行尾转换的方式。当您在Windows计算机上,并且工作目录中有Windows样式的行尾时,您可以设置一个
.gittattribute
,如
*text=auto
,指示您希望文件以“标准化”Unix样式的行尾签入存储库。在这种情况下,文件将应用“清除”过滤器,以将
\r\n
行结尾转换为
\n
样式行结尾。同样,文件在签出时将被“涂抹”,以便从磁盘上的
\n
转换为
\r\n

在工作目录和存储库之间进行转换时,您可以创建自己的“清除”和“涂抹”过滤器来删除(或添加)数据。对于这些文件,可以添加一个属性:

*.c filter=autogen
然后,您可以配置autogen过滤器,使用命令在“清理”(进入存储库)和“涂抹”(进入工作目录)方向运行

git config --global filter.autogen.clean remove_metadata
git config --global filter.autogen.smudge cat
(就过滤器而言,使用cat是一个“noop”)


中有创建自己的过滤器的更详细示例。

我发现了一种方法,可以使用来解决琐碎更改的问题。我将描述这个过程,因为它涉及到忽略自动生成的C文件中的时间戳更新,但它可以很容易地适应其他情况和语言:

  • 将Beyond Compare配置为Git difftool。有关如何执行此操作的具体详细信息,请参阅
  • (可选但有帮助)为
    Git difftool--dir diff--no symlinks
    命令(例如,
    dtd
    )添加Git别名
  • 进行一些更改(例如,自动生成文件),然后运行
    git dtd
    进行目录差异。Beyond Compare将打开并显示更改前后的文件夹比较
  • 打开其中一个已更改文件的文本比较会话窗口。打开工具菜单并选择文件格式
  • 打开语法选项卡,删除“Comments”语法元素
  • 添加一个新的语法元素,并给它一个有意义的名称,如“生成时注释”
  • 对于Category,选择“Delimited”语法元素。在“文本来源”框中,输入要忽略的文本。例如,如果自动生成的代码中的时间戳以字符串
    *生成时间:
    开头,请将其输入“文本来源”框。选中“在行尾停止”复选框
  • 单击“保存”按钮并返回文本比较会话窗口
  • 打开会话菜单并选择会话设置。打开重要性选项卡
  • 查找您的新语法元素(例如“生成时注释”),然后取消选中它。这将告诉我们,将其视为一个不重要的变化是无法相比的
  • 打开比较选项卡,选择基于规则的比较
  • 将对话框底部的下拉列表更改为更新会话默认值
  • 关闭Beyond Compare,然后通过运行
    git dtd
    命令重新打开它
  • 文件夹比较会话中只包含时间戳更新的所有文件将显示不重要的差异。如果要完全隐藏不重要差异的文件,请在查看菜单中关闭忽略不重要差异

  • 参考资料:

    GIT无法理解什么是“琐碎的变化”。文件是否已更改。GIT不理解C(或任何其他语言),它只看到哈希不匹配的文本文件。因此,没有GIT解决方案(至少是现成的)可以做到这一点。您可能会编写一个git钩子,但这里的解决方案似乎是修复“工具”而不是git。不幸的是,我们不拥有该工具,因此我们在这方面受到限制。有没有一种方法可以创建一个钩子来查找特定的文本更改并忽略它们?很可能,但我不认为这会很容易,请阅读这里的更多内容有一些正当的理由说明为什么您希望在git存储库中自动生成源文件,但您确定要这样做吗?是的,在我们的例子中,我们确实需要跟踪自动生成的文件,因为我们对它们进行了大量的配置,以使它们在我们的项目中工作。