如何在“git diff-index”中排除文件

5

我正在使用git的预提交钩子来检查提交。预提交脚本主要做一件事:

exec git diff-index --check --cached HEAD --

它还可以执行其他一些操作,但这些操作与本讨论无关。

问题在于,我的仓库中有各种各样的文件,并不是所有文件都必须符合“git diff-index --check”所强制执行的检查。

所以我的问题是:如何排除/忽略这些文件? 也就是说,我在git中跟踪它们,但我只想在预提交检查时忽略它们。

例如,某个补丁包含*.c、*.h、*ini和*.xyz文件。 我希望“git diff-index --check”仅适用于.c和.h文件。


1
手册页面上写着:“当存在<path>参数时,仅比较与这些模式匹配的路径。否则,将比较所有已跟踪的文件。”所以,当你想要检查这些文件时,无论何时,都要添加'.c' '.h'。 - torek
@torek 的建议确实有效 :) 我想“path”参数名称有点误导人,让我认为这是关于路径的问题,但实际上它涉及到文件名模式,包括路径。 请将您的建议发布为答案。 - kliteyn
2个回答

8
该 man 手册说明:
当存在 <path> 参数时,仅比较与这些模式匹配的路径。否则,将比较所有已跟踪的文件。
换句话说,"path" 参数实际上是 glob 样式的模式,不仅仅是具体的路径。您可以在命令中添加 '*.c' '*.h'

1
不确定是我的环境问题(Windows + Git Bash)还是不同的Git版本问题,但只有以下命令可用(不带引号):git diff-index --check --cached HEAD -- *.html *.js - harriha
1
@Mr_and_Mrs_D:我认为应该可以。我还没有测试过。所有pathspec处理都应该通过Git中的公共代码完成,以便它们都表现得相同(但实际上并非完全如此:特别是.gitignore pathspecs使用单独的代码)。 - torek

2

接受的答案正确地处理了文件扩展名的排除。要排除驻留在目录中的文件,您可以使用以下命令。

git diff-index --check --cached HEAD -- ':!directory'

我该如何添加更多的目录? - C.Astraea

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