C 如何配置Git以忽略自动生成代码中的细微更改(例如时间戳)?
我正在使用一个自动生成大量C代码的工具。该工具在每次运行时为一批.c和.h文件生成代码。由于某些原因,该工具不够智能,无法识别文件何时没有实质性更改,因此在许多情况下,它只是更新每个文件顶部注释中的时间戳。否则,文件将保持不变 在这种情况下,当我运行C 如何配置Git以忽略自动生成代码中的细微更改(例如时间戳)?,c,git,C,Git,我正在使用一个自动生成大量C代码的工具。该工具在每次运行时为一批.c和.h文件生成代码。由于某些原因,该工具不够智能,无法识别文件何时没有实质性更改,因此在许多情况下,它只是更新每个文件顶部注释中的时间戳。否则,文件将保持不变 在这种情况下,当我运行git status时,有时会看到几十个或数百个文件发生了更改。但是当我查看对单个文件的更改时,大多数文件都没有真正的更改—只是对时间戳的更新。我必须逐一检查每个文件,以确定是否有任何实际更改要提交 是否有一种方法可以配置Git,以便它可以忽略不重要
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文件中的时间戳更新,但它可以很容易地适应其他情况和语言:
Git difftool--dir diff--no symlinks
命令(例如,dtd
)添加Git别名git dtd
进行目录差异。Beyond Compare将打开并显示更改前后的文件夹比较*生成时间:
开头,请将其输入“文本来源”框。选中“在行尾停止”复选框git dtd
命令重新打开它参考资料:GIT无法理解什么是“琐碎的变化”。文件是否已更改。GIT不理解C(或任何其他语言),它只看到哈希不匹配的文本文件。因此,没有GIT解决方案(至少是现成的)可以做到这一点。您可能会编写一个git钩子,但这里的解决方案似乎是修复“工具”而不是git。不幸的是,我们不拥有该工具,因此我们在这方面受到限制。有没有一种方法可以创建一个钩子来查找特定的文本更改并忽略它们?很可能,但我不认为这会很容易,请阅读这里的更多内容有一些正当的理由说明为什么您希望在git存储库中自动生成源文件,但您确定要这样做吗?是的,在我们的例子中,我们确实需要跟踪自动生成的文件,因为我们对它们进行了大量的配置,以使它们在我们的项目中工作。