想只保留 logs/.keep,写了 logs/ 再写 !logs/.keep,git status 里那个文件始终不出现。git check-ignore -v 显示命中的是 logs/ 那条。日志里能对上时间点,这种反而好排。

父目录被整体排除后,Git 不会再进这个目录看里面的否定规则,后面的感叹号对已被排除目录里的文件不起作用。规则顺序也参与匹配,后面的规则才能覆盖前面的。这一点先确认清楚,后面就不用反复试。

git check-ignore -v logs/.keep
# .gitignore 内容
logs/*
!logs/.keep

围绕「gitignore 否定规则」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。

别只看报错的最后一行,往上看几行,真正的起因通常在上面。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。

处理上按这个顺序:git check-ignore -v 文件路径 看实际命中的是哪一行;先放行目录再排除内容 写成 logs/* 再加 !logs/.keep;确保否定规则排在排除规则之后;用 git status --ignored 确认文件从忽略列表里出来。

结果对不对很好判断,git check-ignore 不再输出该文件 git status 里能看到它待添加。

作者 9823189