Answers:
从来没有尝试过,但git help ignore
暗示,如果你把一个.gitignore
用*.js
在/public/static
,它会做你想要什么。
注意:请确保还检查以下Joeys的答案:如果要忽略特定子目录中的文件,则使用本地.gitignore是正确的解决方案(本地性很好)。但是,如果您需要将相同的模式应用于整个存储库,那么**解决方案会更好。
根据该文档,似乎该**
语法受git
版本支持。1.8.2.1
**
与完整路径名匹配的模式中的两个连续星号(“ ”)可能具有特殊含义:
前导“
**
”后跟斜杠表示在所有目录中均匹配。例如,“**/foo
”与文件“foo
”相同的任何位置都匹配文件或目录“foo
”。“**/foo/bar
”bar
会在目录“foo
” 正下方的任何位置匹配文件或目录“ ”。尾部的“
/**
”与内部的所有内容匹配。例如,“abc/**
”将目录“abc
” 内的所有文件(相对于.gitignore
文件位置)以无限的深度进行匹配。斜杠后跟两个连续的星号,然后斜杠匹配零个或多个目录。例如,“
a/**/b
”匹配“a/b
”,“a/x/b
”,“a/x/y/b
”等。其他连续的星号被视为无效。
xxx/**
和之间有什么区别xxx/
?
xxx/**
定位到其中的所有文件和目录,xxx
而直接xxx/
定位到该xxx
目录。这实际上仅在否定模式时才有意义,!
例如“如果排除了该文件的父目录,则无法重新包含文件。”,因此在这种情况下必须使用xxx/*
或xxx/**
。
**.js
?
更新:看看@Joey的答案:Git现在支持**
模式中的语法。两种方法都可以正常工作。
该gitignore(5)手册页中指出:
从与路径相同的目录中或任何父目录中的.gitignore文件读取的模式,较高级别文件(直到工作树的顶层)中的模式被较低级别文件(直至该目录)中的模式覆盖包含文件。
这意味着.gitignore
回购的任何给定目录中文件中的模式都会影响该目录和所有子目录。
您提供的模式
/public/static/**/*.js
不太正确,首先是因为(如您正确指出的)**
Git不使用该语法。同样,前导/
将该模式锚定到路径名的开头。(因此,/public/static/*.js
将匹配/public/static/foo.js
但不 匹配/public/static/foo/bar.js
。)删除前导编辑:仅仅删除前导斜杠也将不起作用-因为该模式仍然包含斜杠,所以Git将其视为普通的,非递归的外壳程序(感谢@Joey Hoer指出了这一点)。/
也将不起作用,匹配路径如public/static/foo.js
和foo/public/static/bar.js
。
正如@ptyx建议的那样,您需要做的是创建文件<repo>/public/static/.gitignore
并仅包含以下模式:
*.js
没有前导/
,因此它将在路径的任何部分匹配,并且该模式将仅应用于/public/static
目录及其子目录中的文件。
/
也将不起作用,匹配路径如public/static/foo.js
和” foo/public/static/bar.js
。是错误的。引用文档 “如果该模式不包含斜杠/,Git会将其视为shell glob模式,并检查相对于.gitignore文件位置的路径名是否匹配(相对于工作树的顶层,如果而不是来自.gitignore文件)。” foo/public/static/bar.js
不会匹配,因为该模式确实包含/
。
要忽略未跟踪的文件,只需转到.git / info / exclude。排除文件是带有忽略的扩展名或文件列表的文件。