C-我如何配置git以忽略自动生成代码中的琐碎更改(例如时间戳)



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

在这种情况下运行git status时,有时会看到数十个或数百个文件更改。但是,当我查看对单个文件的更改时,其中大多数没有真正的更改 - 只是时间戳的更新。我必须一对一地浏览每个文件才能确定是否有任何实际更改。

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

感谢您的帮助。

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

是;这是A filter

的目的

您可能已经熟悉Git的"清洁"one_answers"污迹"过滤器的概念,这就是处理线路结束转换的方式。当您在Windows计算机上并在工作目录中具有Windows风格的线路结尾时,您可能会设置一个.gitattribute,例如* text=auto,指示您希望将文件选中到存储库中,并带有"归一化" Unix-style style style Line endings。在这种情况下,文件将应用"干净"过滤器将rn线结尾转换为n样式线结尾。同样,在结帐时将"弄脏"文件,以从n转换为rn on disk。

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

*.c filter=autogen

,然后您可以配置自动源过滤器,并在"清洁"(进入存储库)和"污迹"(进入工作目录)方向上运行命令。

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

(就过滤器而言,使用CAT是" NOOP")。

Pro Git Book具有创建您自己的过滤器的更详细的示例。

我有一个文件 xxx.pro.user 使用时间戳,并希望git忽略时间变化:

<!-- Written by QtCreator 9.0.1, 2023-06-29T10:47:99. -->
....

(1)将过滤器放入 .git/config 文件位于存储库的根部(在[branch'master; master&quot;] ...)...):

...
[filter "ignore_ts"]
    clean = sed '/Written by QtCreator/d'
    smudge = cat

(2)在目录中 xxx.pro.user 是,添加文件 .gitattributes 将过滤器应用于目标文件:

xxx.pro.user filter=ignore_ts
    

(3)验证过滤器:

$ git check-attr --all xxx.pro.user
xxx.pro.user: filter: ignore_ts

另外,将您的过滤器当作命令直接测试,以查看预期的效果:

$ cat xxx.pro.user | sed '/Written by QtCreator/d' > testfile
$ diff xxx.pro.user testfile
< <!-- Written by ...-->

(4)更改 xxx.pro.user 的时间戳,然后运行 git状态。注意:如果已经修改,请使用 git还原 git add git commit 。然后,将忽略随后的时间戳的修改。

()奖金,您可以将 diff 过滤器添加到 .git/config

[diff "ignore_ts_diff"]
    textconv = sed '/Written by QtCreator/d'

.gitattributes 中激活不同的目标文件:

xxx.pro.user filter=ignore_ts diff=ignore_ts_diff
xxx.pro.user2 filter=ignore_ts diff=ignore_ts_diff

现在, git diff xxx.pro.user2 将忽略时间戳差异。

我发现了一种解决"超越比较"的微不足道更改问题的方法。我将描述该过程,因为它涉及忽略自动生成的C文件中的时间戳更新,但可以很容易地适应其他情况和语言:

  1. 配置超出比较为git difftool。有关如何执行此操作的具体详细信息,请参见此处。
  2. (可选但有用)添加git difftool --dir-diff --no-symlinks命令的GIT别名(例如,dtd)。
  3. 进行一些更改(例如自动生成文件),然后运行git dtd进行目录差异。超越比较将打开并向您显示更改之前/之后的文件夹比较。
  4. 打开一个文本比较您更改的文件之一的会话窗口。打开工具菜单,然后选择文件格式
  5. 打开语法选项卡,删除"注释"语法元素。
  6. 添加一个新的语法元素,并给它一个有意义的名称,例如"生成时间评论"。
  7. 对于类别,选择"划界"语法元素。在"来自"框的"文本"中,输入您要忽略的文本。例如,如果自动生成的代码中的时间戳以字符串* Generation Time:开始,请将其输入"来自"框的"文本"。检查"线路结束"复选框。
  8. 单击"保存"按钮,然后返回您的文本比较会话窗口。
  9. 打开会话菜单,然后选择会话设置。打开重要性 TAB。
  10. 寻找您的新语法元素(例如"生成时间评论")并取消选中。这将表明将其视为不重要的变化。
  11. 打开比较选项卡,选择基于规则的比较
  12. 将对话框底部的下拉列表更改为更新会话defaults
  13. 关闭超越比较,然后通过运行git dtd命令再次重新打开它。
  14. 文件夹比较会话中的所有文件,除了对时间戳的更新外,任何内容都不会显示出不重要的差异。如果要完全隐藏具有不重要差异的文件,请在 view 菜单中切换

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