让git跟踪自动生成的文件但忽略差异

14

我有一个包含源代码(主要是*.php*.js)和文档文件(主要是*.md*.html*.svg)的存储库,这些文档文件是从注释自动生成的。所有文档都保存在存储库的一个单独子目录(./doc)中。

一方面,我希望通过git跟踪文档,并且如果更改,它将被提交/推送到服务器,因为这样非常方便,可以浏览最新的文档,并且由Github很好地显示。

另一方面,在运行git diff命令时看到自动生成的文件非常烦人。例如,如果在两个提交之间更改了一行源代码,则git diff不仅输出此单行,而且还会输出整个自动生成的文档,因为整个自动生成的文档已更改。

有没有办法告诉git跟踪文档但默认情况下将其排除在diff之外?我也可以接受git将所有文档文件视为blob。那么至少diff只会声明文件已更改,而不会逐行显示所有文档。

2个回答

21

如果git将所有文档文件都视为二进制数据也可以接受。

您可以使用属性来完成此操作。只需创建一个名为doc/.gitattributes的文件,其中包含* -diff,然后该路径下的所有内容都将被视为二进制文件进行比较。有关详细信息,请参见man gitattributes

当您确实想要查看其差异时,您可以使用git diff --text来覆盖上述设置。


这似乎比被接受的答案更直接。如果有任何缺陷或不足相对于被接受的答案,回来补充也是合理的。 - dreftymac
恰好是我想要的,谢谢! - Ravan Scafi

1

我最初提出的解决方案涉及本地修改(更新doc/文件的索引(git update-index)以便不检测任何差异)。

cd doc
git ls-files -z | xargs -0 git update-index --assume-unchanged

但是,OP正确地指出:

在使用--assume-unchanged之后,这些文件也不会被提交,除非我通过--no-assume-unchanged撤消对索引的更改。
因此,在每个git diff之前和之后,我必须确保直接调用这两个命令。

我正在寻找一种更加“永久”的解决方案。一种适用于每个用户的解决方案,无需特别注意即可检出存储库,并且在Github中也可以使用。
目前,我无法真正使用Github的“显示历史记录/差异”功能,因为Github在处理一定数量的文件后停止显示差异,并且不幸的是,它只在自动生成的文档中显示与实际重要文件无关的更改部分,而不是实际重要文件。

我同意。
然后,另一个选项是通过将所有那些doc/文件隔离到它们自己的存储库中来解决:

这样,您就可以在主要存储库中工作,并在需要时生成文档:git diff仅会显示主要(父)存储库的差异,而不是doc/中的差异(即子模块)。

但是,在推送主要存储库之前,您必须先添加、提交并推送doc/(子模块),然后再添加、提交并推送主要存储库。
这是因为doc/被主要存储库视为一个git链接(一个SHA1,索引中的特殊条目),当您在doc/中提交更改时,它将发生变化,需要由引用它的主要存储库记录。


但是如果我正确理解了这个解决方案,在使用 --assume-unchanged 之后,文件也不会被包含在提交中,直到我通过 --no-assume-unchanged 撤消对索引的更改。我是正确的吗?因此,在每次 git diff 之前和之后,我必须确保直接调用这两个命令。因此,这只是一个临时关闭子树的 git diff 的解决方法,而不是永久性的解决方案。 - user2690527
@user2690527 我同意。这是我能想到的基于Git的一种解决方法,但并不是永久性的解决方案。 - VonC
我正在寻找一种更加“永久”的解决方案。一种适用于每个检出存储库的用户,而不需要特别注意,并且在Github内也可以使用的解决方案。目前,我无法真正使用Github的“显示历史记录/差异”功能,因为Github在处理一定数量的文件后停止显示差异,不幸的是它只显示自动生成文档中的无关部分的更改,而不是实际重要文件的更改。 - user2690527
@user2690527 好的。我在我的编辑答案中提出了一种替代方案。 - VonC
那正是我所需要的。谢谢! - user2690527

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接