git check-ignore -v:查清文件为什么被忽略

44 次浏览4 条回复

遇到文件怎么都加不进 Git 时,先别急着改 .gitignore,git check-ignore -v 能直接告诉你是哪条规则匹配的。

环境:Git 2.25+。可以这样试:

mkdir -p ignore-demo/cache
cd ignore-demo
printf 'cache/\n*.local\n' > .gitignore
printf 'tmp\n' > cache/data.txt
printf 'debug\n' > settings.local
git check-ignore -v cache/data.txt settings.local

输出会带上匹配规则所在的文件、行号和规则内容。想检查一个已经被跟踪的文件,可以加 --no-index,避免把“已跟踪文件不会受忽略规则影响”误判成规则没生效。这个命令排查嵌套目录里的多层 .gitignore 特别省时间。

还有个小细节挺有用:如果命令没输出,通常就是没有任何忽略规则命中,不一定是 Git 出问题。

排查一批文件时可以配合 git status --ignored -s 先扫一眼,再拿可疑路径丢给 git check-ignore -v 看具体是哪一条规则。这样比直接翻完整 .gitignore 省不少时间。

批量查的时候还可以加 --stdin,比如先把可疑路径写到一个文件里:

printf 'cache/data.txt\nsettings.local\n' | git check-ignore -v --stdin

路径很多时比一长串参数好读一点,也方便从脚本里接上游命令。注意每行一个路径就行。

还有一个容易漏的参数是 -n / --non-matching。和 -v --stdin 一起用时,没命中忽略规则的路径也会输出,只是规则来源那几列是空的。

printf 'cache/data.txt\nREADME.md\n' | git check-ignore -v -n --stdin

脚本里要区分“确实没被忽略”和“输入列表里混了普通文件”时,这个比靠退出码猜要稳一点。

这个命令查到的来源不只限于仓库里的 .gitignore,全局忽略文件也会显示出来。

如果遇到“项目里明明没写这个规则,但文件还是被忽略”的情况,可以顺手看一下:

git config --get core.excludesFile
git check-ignore -v path/to/file

有些编辑器临时文件、系统文件会被放在全局 ignore 里,-v 标出路径后就不用在项目配置里绕圈找了。