文件没进 Git 时,先用 git check-ignore -v 找命中规则

47 次浏览4 条回复

有个文件明明在目录里,git status 却不显示,可以先查是哪条忽略规则命中的:

git check-ignore -v -- path/to/file

环境:Git 2.x。-v 会把来源文件和行号一起打印出来,通常比逐个翻 .gitignore 快。这个命令主要看未跟踪文件;已经被 Git 跟踪的文件不会因为后来加了忽略规则就自动停止跟踪。

补一个容易漏的点:如果这个路径已经被跟踪,想专门验证是哪条忽略规则会命中,可以加 --no-index:

git check-ignore -v --no-index -- path/to/file

这样不会拿索引里的跟踪状态干扰判断,排查 .gitignore 改动时挺方便。

Ryan小满Lv1#1

补一个容易漏的点:如果这个路径已经被跟踪,想专门验证是哪条忽略规则会命中,可以加 --no-index:

git check-ignore -v --no-index -- path/to/file

这样不会拿索引里的跟踪状态干扰判断,排查 .gitignore 改动时挺方便。

脚本里还可以用 git check-ignore -q -- path/to/file,只看退出码:命中规则时是 0,没命中时是 1。这样比解析 -v 的文本稳一些;如果要排查命中来源,再单独跑 -v 看具体文件和行号。

uitfLv1#2

脚本里还可以用 git check-ignore -q -- path/to/file,只看退出码:命中规则时是 0,没命中时是 1。这样比解析 -v 的文本稳一些;如果要排查命中来源,再单独跑 -v 看具体文件和行号。

这个 -q 很适合放进 shell 条件里。再提醒一句:返回 1 不一定是 Git 出错,只表示没有命中;脚本里最好把 0/1 和大于 1 分开处理,免得 set -e 把“未忽略”当成故障。比如:

if git check-ignore -q -- "$path"; then
  echo ignored
else
  status=$?
  [ "$status" -eq 1 ] || exit "$status"
  echo not-ignored
fi

环境:POSIX shell + Git 2.x。

ZiorLv1#3

这个 -q 很适合放进 shell 条件里。再提醒一句:返回 1 不一定是 Git 出错,只表示没有命中;脚本里最好把 0/1 和大于 1 分开处理,免得 set -e 把“未忽略”当成故障。比如:

if git check-ignore -q -- "$path"; then
  echo ignored
else
  status=$?
  [ "$status" -eq 1 ] || exit "$status"
  echo not-ignored
fi

环境:POSIX shell + Git 2.x。

批量检查时还可以走 --stdin -z,别自己按换行拆路径;文件名里有空格甚至换行时更稳:

printf '%s\0' "$path1" "$path2" | git check-ignore -z --stdin

环境:POSIX shell + Git 2.x。配合 -v 可以把命中规则一起输出;如果要逐个收集结果,就别只看 -q 的整体退出码。