如屏蔽所有 /res/static /abc/res/static 但是不屏蔽/static 这种.gitignore 该如何写?
res/static/* 貌似不行...
修改 1 忘了说明: 只屏蔽 res 目录下的 static
abc/static不屏蔽的
你得理解前置斜线和后置斜线的意义。
先说后置斜线。static/
和 static
是不一样的,前者只匹配目录 static
,而后者则可以匹配同名的目录、文件名、符号链接等等……;如果 static/
是你声名的规则,那么其下所有的子目录及文件都匹配,除非你之后用 !
排除;
再说前置斜线。.gitignore 是默认以相对路径为基准的,子目录下的 .gitignore 优先应用自己的规则然后再递归向上一直找到 git 的根(也就是 .git
存在的那个目录)。因此在路径模式前追加 /
是不推荐的,因为:
多数情况下我们只使用一个 .gitignore,即工作树根路径下的 .gitignore。此时相对于它自身,/
就代表着当前工作路径,没有必要加它;
如果我们添加了子目录下的 .gitignore,那我们的本意也是要去匹配其下的路径,若是加了前置的 /
反而让人摸不着头脑;
不过有一种情况下 /
是需要的,比如说你项目下有很多 index.html
文件,你只想忽略工作树根路径下的那一个,其他则不管;这样的话直接写 index.html
是不行的,因为 git 会把它当作一个 glob pattern 去匹配所有同名文件(哪怕不同级)。此时就需要追加一个前置斜线:/index.html
,意思是:我只要屏蔽相对于 /
下的 index.html
。
因此你要的结果应该是这样的:
res/static/
这条规则会忽略 res/static/
及其下所有子路径,并且不会匹配到 abc/
下的任何东西。看看这个亲测的例子:
这是按照你的问题模拟的目录结构,可以看到每一个子目录下都有新文件,应用了上述规则之后,abc/**
完全不受影响;res/
也不受影响;只有 res/static/
会被忽略掉。
帮你总结一下经验吧,以项目根路径下的 .gitignore 为例:
/filename.extension
filename.extension
folder/
(这会连同其下所有子目录及文件都被忽略)!folder/some/important/filename.extension
folder/**/filename.extension
folder/**/*.extension
folder/**/tmp/
如果是子目录下的 .gitignore,在上述基础上记得不要在最前面加 '/',否则会匹配到工作树的根路径,而不是子目录下的 .gitignore 的同级,就这个是一个坑,其他都一样。
最后,反斜线可以转移特殊字符,比如文件名带 '!' 的,可以 \!important!.txt
这样。