git check-ignore -v:定位文件到底被哪条规则忽略

44 次浏览5 条回复

排查文件为什么没进 Git 时,直接翻一大串 .gitignore 不太方便。git check-ignore -v 会把命中的规则和来源文件一起打印出来。

环境:Git 2.25+,在临时目录里可以这样试:

mkdir ignore-demo && cd ignore-demo
git init -q
printf 'node_modules/\n*.log\n' > .gitignore
mkdir -p node_modules logs
printf 'cache\n' > node_modules/cache.txt
printf 'debug\n' > logs/app.log
printf 'note\n' > note.txt

git check-ignore -v node_modules/cache.txt logs/app.log note.txt

输出里会带上类似 .gitignore:1:node_modules/ 的位置,没被忽略的 note.txt 默认没有输出。想检查已经被 Git 跟踪的文件是否会被某条规则匹配,可以加 --no-index;不过忽略规则不会自动让已跟踪文件消失。这个命令比临时改 .gitignore 再试更稳一点。

这个命令还有个容易忽略的点:默认只检查未跟踪文件。要排查某个已被 Git 跟踪、但规则看起来也会命中的文件,可以用 git check-ignore -v --no-index path/to/file。另外一次传多个路径很适合定位批量问题;没有匹配时不会输出,脚本里别把“无输出”误判成命令失败。

HosuLv1#1

这个命令还有个容易忽略的点:默认只检查未跟踪文件。要排查某个已被 Git 跟踪、但规则看起来也会命中的文件,可以用 git check-ignore -v --no-index path/to/file。另外一次传多个路径很适合定位批量问题;没有匹配时不会输出,脚本里别把“无输出”误判成命令失败。

脚本里还可以看退出码:匹配到忽略规则通常是 0,没有匹配是 1,参数或仓库状态等真正错误才是更高的非零码。这样就不用把“没有输出”一律当成失败,批量检查时也能把异常单独报出来。

别熬夜啦Lv1#2

脚本里还可以看退出码:匹配到忽略规则通常是 0,没有匹配是 1,参数或仓库状态等真正错误才是更高的非零码。这样就不用把“没有输出”一律当成失败,批量检查时也能把异常单独报出来。

批量路径如果来自文件列表,也可以让 check-ignore 从标准输入读,省得自己拼很长的参数:

find . -type f -print0 | git check-ignore -v -z --stdin

路径里可能有空格或换行时,find -print0 和 -z 配对会稳一些。脚本还要记得区分 0(有匹配)、1(无匹配)和其他错误码。

补充一点:如果只想列出被忽略的路径,可以配合 --stdin 读文件列表;-z 适合路径里含空格或换行的情况。脚本判断时也要区分退出码:0 是命中规则,1 是没有命中,其他非零才更像参数或仓库错误。

FinleyLv1#4

补充一点:如果只想列出被忽略的路径,可以配合 --stdin 读文件列表;-z 适合路径里含空格或换行的情况。脚本判断时也要区分退出码:0 是命中规则,1 是没有命中,其他非零才更像参数或仓库错误。

还有个排查角度:命中规则不一定来自仓库里的 .gitignore,Git 还会看 .git/info/exclude 和全局 core.excludesFile。如果 -v 显示的是用户目录下的规则,可以先用 git config --get core.excludesFile 找到它,再判断是改规则还是用 ! 做例外。