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

Make git to track auto-generated files but ignore from diff

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

一方面,我希望通过 git 跟踪文档,如果它发生变化,我希望它 committed/pushed 到服务器,因为拥有它会很舒服github.

很好地展示了可浏览的最新文档

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

有什么方法可以告诉 git 跟踪文档但默认将其从 diff 中排除?如果 git 将所有文档文件视为 blob,我也可以。那么至少 diff 只会声称文件已更改,但不会逐行显示所有文档。

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

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

但是,OP 正确地评论道:

After --assume-unchanged, the files are not included into a commit either until I undo the change to the index via --no-assume-unchanged.
Hence, I must assure to call both directly before and after each git diff.

I was looking for a solution that is more kind of "permanent". A solution that works for every user who checks out the repository without paying particular attention and that also works within Github.
At the moment I cannot really use the "show history/difference" feature of Github, because Github stops to show the differences after processing a certain number of files and unfortunately it only shows the irrelevant part of changes in the auto-generated documentation but not in the actually important files

我同意。
然后另一种选择是通过以下方式将所有这些 doc/ 文件隔离在他们自己的仓库中:

  • creating a submodule from the subfolder doc/,
  • 在您当前的存储库中引用该子模块(这意味着 GitHub 会将文档显示为 gitlink,请参阅“gray subfolder in GitHub”)

这样(在 git 子模块更新 --init 之后),您可以在主仓库中工作,并在需要时生成文档:git diff 只会显示 diff主要(父)回购,而不是(子模块)doc/.

但是当你推送你的主仓库时,你必须先添加、提交和推送 doc/(子模块),然后再添加、提交和推送主仓库。
这是因为 doc/ 被主 repo 视为 gitlink (a SHA1, special entry in the index),当你在 doc/ 中提交时它会改变,并且需要由主 repo 记录回购引用它。

I would also be OK for me if git would consider all documentation files as blobs.

您可以为此使用属性。只需创建一个包含 * -diff 的文件 doc/.gitattributes,然后该路径下的所有内容都将被视为 diffs 的二进制文件。有关详细信息,请参阅 man gitattributes

当您确实想查看它们的差异时,可以使用 git diff --text 覆盖它。