使 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
覆盖它。
我有一个包含源代码(主要是 *.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 eachgit 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
覆盖它。