.gitignore规则疑问:忽略temp目录但排除指定文件与子目录的写法差异
三种.gitignore写法的差异分析
先明确你的核心需求:忽略temp目录下的所有内容,但保留temp/some.txt文件,同时保留temp/bin整个目录(包括其内部所有内容)。下面逐个拆解三种写法的区别:
第一种写法(你的初始写法)
temp/* !temp/some.txt !temp/bin
temp/*:忽略temp下所有直接子文件和子目录!temp/some.txt:取消忽略这个文件,确保它被Git追踪!temp/bin:取消忽略temp/bin这个项——不管它是文件还是目录。如果是目录,Git会恢复对这个目录的扫描,其内部所有未被其他规则忽略的内容都会被追踪。在你的场景里bin是子目录,所以整个bin目录及其内容都会被保留。
第二种写法(带斜杠的bin规则)
temp/* !temp/some.txt !temp/bin/
和第一种的核心差异在!temp/bin/:
- 斜杠
/明确表示只匹配目录,不会匹配同名文件。如果temp下刚好有个名为bin的文件,这个规则不会取消对它的忽略;而第一种写法会取消忽略这个文件。 - 对于你的场景(
bin是子目录),效果和第一种几乎完全一致,bin目录及其内容都会被保留。
第三种写法(匹配bin下的内容)
temp/* !temp/some.txt !temp/bin/*
这个写法存在问题:
temp/*已经忽略了temp/bin目录本身,Git会直接跳过这个目录的扫描,不会读取里面的内容。所以!temp/bin/*这个规则根本不会生效——父目录被忽略时,子项的取消忽略规则不起作用。- 最终结果是:
temp/bin目录仍被忽略,其内部所有内容也不会被Git追踪,完全不符合你的需求。
内容的提问来源于stack exchange,提问作者Smth_Unknown
相关产品推荐
相关产品推荐

