问题 使git跟踪自动生成的文件但忽略diff


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

一方面,我希望通过跟踪文档 git 如果它发生变化,我希望它被提交/推送到服务器,因为它具有可浏览和最新文档,并且由github很好地显示。

另一方面,在输出期间看到自动生成的文件是非常烦人的 git diff 命令。例如,如果在两次提交之间更改了一行源代码,那么 git diff 不仅输出这一行,而且还输出所有自动生成的文档,因为整个自动生成的文档已经更改。

有没有办法告诉git跟踪文档但是将其排除在外 diff 默认?如果git将所有文档文件视为blob,我也会对我好。然后至少 diff 只会声称文件已更改,但不会显示所有文档每行。


8984
2018-06-28 12:58


起源



答案:


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

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子模块更新后--init),你可以在主仓库中工作,并随时生成文档:git diff只显示主(父)仓库的差异,而不是(仓库)子模块) doc/

但是当你推动主仓库时,你必须先添加,提交和推送 doc/ (子模块),在添加,提交和推送主回购之前。
那是因为 doc/ 被主要的回购看作是一个 gitlink (一个SHA1, 索引中的特殊条目),当你提交时会改变 doc/,需要由引用它的主回购记录。


1
2018-06-28 13:10



但如果我正确理解了解决方案,之后 --assume-unchanged 这些文件不包含在 commit 或者直到我撤消对索引的更改 --no-assume-unchanged。我对么?因此,我必须保证在每次之前和之后直接打电话 git diff。所以这只是暂时关闭的解决方法 git diff 对于一个子树,但它不是一个永久的解决方案。 - user2690527
@ user2690527我同意。这是基于我能想到的Git的一种解决方法,但不是永久的解决方案。 - VonC
我一直在寻找一种更“永久”的解决方案。一种解决方案,适用于每个用户在没有特别注意的情况下检出存储库,并且也可以在Github中运行。目前我无法真正使用Github的“显示历史/差异”功能,因为Github在处理了一定数量的文件后停止显示差异,不幸的是它只显示了自动生成的文档中不相关的更改部分,但没有在实际重要的文件中。 - user2690527
@ user2690527好的。我在编辑的答案中提出了另一种选择。 - VonC
这就是我需要的。谢谢! - user2690527


答案:


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

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子模块更新后--init),你可以在主仓库中工作,并随时生成文档:git diff只显示主(父)仓库的差异,而不是(仓库)子模块) doc/

但是当你推动主仓库时,你必须先添加,提交和推送 doc/ (子模块),在添加,提交和推送主回购之前。
那是因为 doc/ 被主要的回购看作是一个 gitlink (一个SHA1, 索引中的特殊条目),当你提交时会改变 doc/,需要由引用它的主回购记录。


1
2018-06-28 13:10



但如果我正确理解了解决方案,之后 --assume-unchanged 这些文件不包含在 commit 或者直到我撤消对索引的更改 --no-assume-unchanged。我对么?因此,我必须保证在每次之前和之后直接打电话 git diff。所以这只是暂时关闭的解决方法 git diff 对于一个子树,但它不是一个永久的解决方案。 - user2690527
@ user2690527我同意。这是基于我能想到的Git的一种解决方法,但不是永久的解决方案。 - VonC
我一直在寻找一种更“永久”的解决方案。一种解决方案,适用于每个用户在没有特别注意的情况下检出存储库,并且也可以在Github中运行。目前我无法真正使用Github的“显示历史/差异”功能,因为Github在处理了一定数量的文件后停止显示差异,不幸的是它只显示了自动生成的文档中不相关的更改部分,但没有在实际重要的文件中。 - user2690527
@ user2690527好的。我在编辑的答案中提出了另一种选择。 - VonC
这就是我需要的。谢谢! - user2690527


如果git会考虑所有文档,我也会对我好   文件为blob。

您可以使用属性。只需创建一个文件 doc/.gitattributes 其中包含 * -diff,然后该路径下的所有内容将被视为差异的二进制。看到 man gitattributes 详情。

您可以使用 git diff --text 当你想要看到他们的差异时覆盖它。


8
2017-09-10 20:35



简洁大方,谢谢! - Dziamid
这似乎比接受的答案更直接。回到这一点可能是合理的,并且如果有的话,可以添加与接受的答案相关的任何缺陷或缺点。 - dreftymac