如何在自动生成的代码中配置Git忽略琐碎的更改(例如时间戳)?

时间:2019-02-15 16:08:19

标签: c git

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

在那种情况下运行git status时,有时会看到数十个或数百个文件已更改。但是,当我查看单个文件的更改时,它们中的大多数并没有真正的更改-只是时间戳的更新。我必须一个接一个地浏览每个文件,以确定是否有任何实际更改要提交。

有没有一种方法可以配置Git,以便它可以忽略无关紧要的更改,例如标题注释中的时间戳?否则我将如何处理这种情况?

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

  

有没有一种方法可以配置Git,以便它可以忽略无关紧要的更改,例如标题注释中的时间戳?否则我将如何处理这种情况?

是;这是过滤器的目的。

您可能已经熟悉git的“干净”和“涂抹”过滤器概念,这就是它处理行尾转换的方式。如果您使用Windows计算机,并且在工作目录中具有Windows样式的行尾,则可以设置.gitattribute之类的* text=auto来表示您希望文件以“规范化”的Unix样式检入到存储库中行尾。在这种情况下,文件将应用“干净”过滤器,以将\r\n行尾转换为\n样式行尾。同样,文件将在结帐时“弄脏”,以从磁盘上的\n转换为\r\n

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

*.c filter=autogen

然后您可以配置自动生成过滤器,并使用在“干净”(进入存储库)和“涂抹”(进入工作目录)方向运行的命令。

git config --global filter.autogen.clean remove_metadata
git config --global filter.autogen.smudge cat

(就过滤器而言,使用cat是“小睡”)。

Pro Git book包含创建您自己的过滤器的更详细的示例。

答案 1 :(得分:0)

我发现了一种使用Beyond Compare解决小变化的方法。我将描述与忽略自动生成的C文件中的时间戳更新有关的过程,但是可以很容易地将其适应于其他情况和语言:

  1. 将Beyond Compare配置为Git difftool。有关如何执行此操作的特定详细信息,请参见here
  2. (可选,但有帮助)为git difftool --dir-diff --no-symlinks命令添加一个Git别名(例如dtd)。
  3. 进行一些更改(例如,自动生成文件),然后运行git dtd进行目录差异。 “超越比较”将打开,并向您显示更改之前/之后的文件夹比较。
  4. 为已更改的文件之一打开“文本比较”会话窗口。打开工具菜单,然后选择文件格式
  5. 打开语法标签,删除“注释”语法元素。
  6. 添加一个新的语法元素,并为其赋予一个有意义的名称,例如“ Generation Time Comment”。
  7. 对于类别,选择“定界”语法元素。在“文字来源”框中,输入您要忽略的文字。例如,如果自动生成的代码中的时间戳以字符串* Generation Time:开头,则将其输入“文本自”框中。选中“在行尾停止”复选框。
  8. 单击“保存”按钮,然后返回到“文本比较”会话窗口。
  9. 打开会话菜单,然后选择会话设置。打开重要性标签。
  10. 寻找新的语法元素(例如“ Generation Time Comment”),然后取消选中它。这将告诉Beyond Compare将其视为不重要的更改。
  11. 打开比较标签,选择基于规则的比较
  12. 将对话框底部的下拉菜单更改为更新会话默认设置
  13. 关闭“比较之外”,然后通过运行git dtd命令再次将其重新打开。
  14. “文件夹比较”会话中的所有文件(仅包含时间戳记更新)仅包含不重要的差异,将以不重要的差异显示。如果要完全隐藏不重要的差异文件,请在“查看” 菜单中关闭忽略不重要的差异

参考:https://www.scootersoftware.com/support.php?zz=kb_unimportantv3