gitignore例外规则不生效怎么办?嵌套目录下.gitkeep仍被忽略
.gitignore嵌套目录下.gitkeep不生效的解决方案
问题核心原因
Git的忽略规则有个关键逻辑:如果某个目录被标记为忽略,Git会直接跳过该目录,不会再扫描其中的任何子文件或子目录。
你写的somedir/local/*会忽略somedir/local下的所有文件和子目录(包括ssh目录本身)。既然ssh目录被忽略了,后续的!somedir/local/ssh/.gitkeep规则根本不会被执行,自然无法保留这个文件。
而非嵌套场景下,somedir/local/.gitkeep在local目录下,local本身没有被忽略(只是忽略了它的子内容),所以!规则能正常触发生效。
针对性解决方案
1. 仅保留指定嵌套目录下的.gitkeep
如果只需要保留somedir/local/ssh/.gitkeep,按以下规则编写:
# 忽略somedir/local下的所有内容 somedir/local/* # 取消忽略ssh目录(必须先让Git能扫描到这个目录) !somedir/local/ssh/ # 忽略ssh目录下的所有内容 somedir/local/ssh/* # 保留ssh目录下的.gitkeep !somedir/local/ssh/.gitkeep
2. 全局保留所有嵌套目录下的.gitkeep
如果要实现“所有.gitkeep都不被忽略”的需求,需要先确保所有子目录都能被Git扫描到,再忽略文件、保留.gitkeep:
# 忽略somedir/local下的所有文件,但不忽略子目录 somedir/local/* !somedir/local/**/ # 忽略所有子目录下的文件,除了.gitkeep somedir/local/**/* !somedir/local/**/.gitkeep
这里的**是递归通配符,会匹配所有层级的子目录和文件。
内容的提问来源于stack exchange,提问作者paul23
相关产品推荐
相关产品推荐

