2012-05-23 50 views
100

有没有办法忽略目录中所有类型的文件?gitignore目录中所有扩展名的文件

**显然是毫无意义的git的,所以这不起作用:

/public/static/**/*.js 

的想法是匹配任意嵌套的文件夹。

+1

的[混帐 - 忽略子目录某些文件,但不是全部]可能重复(http://stackoverflow.com/questions/6794717/git-ignore-certain-files-in-sub -directories-but-not-all) –

回答

75

从来没有尝试过,但git help ignore暗示,如果你把.gitignore*.js/public/static,它会做你想做的。

注意:请务必在下面检查Joeys的答案:如果您想忽略特定子目录中的文件,那么本地.gitignore是正确的解决方案(本地是好的)。但是,如果您需要相同的模式来应用于您的整个回购,那么**解决方案会更好。

+3

这不是最好的解决方案。有可能人们需要挖掘不同的.gitignore文件来找出为什么他们的文件被忽略。有些人更喜欢将所有这些信息存储在一个存储在repo根目录下的.gitignore文件中。 – haren

+1

@haren这不是唯一的解决方案 - 乔伊的答案当然也是有效的。选择最适合你的工作。我认为忽略目录本地的规则应该在该目录中,并且全局规则应该是全局的。 (此外,这个答案是古老的,我不认为当时支持**)。 – ptyx

47

更新:看看@Joey's answer:Git现在支持模式中的**语法。两种方法都应该正常工作。


gitignore(5) man page状态:在相同的目录路径从的.gitignore文件中读取

模式,或以任何父目录,在更高级别的文件模式(最多顶层)被低级文件中的文件覆盖到包含该文件的目录。

这意味着,在一个.gitignore文件在您的回购任何给定目录的模式会影响该目录所有子目录。您所提供

模式

/public/static/**/*.js 

是不完全正确,首先是因为(正如你正确地指出)的**语法不使用Git的。此外,领先的/锚定模式的路径名的开始。 (所以,/public/static/*.js将匹配/public/static/foo.js/public/static/foo/bar.js。) 卸下领先 /不会工作,一致的路径一样 public/static/foo.jsfoo/public/static/bar.js编辑:只删除前导斜杠也不会工作 - 因为该模式仍然包含一个斜杠,它被Git视为一个普通的,非递归的shell glob(感谢@Joey Hoer指出了这一点)。

由于@ptyx建议,你需要做的是创建该文件<repo>/public/static/.gitignore和只包括以下模式:

*.js 

没有领先/,所以它将匹配在路径的任何部分,该模式将只应用于/public/static目录及其子目录中的文件。

+2

这并不完全正确 - 具体地说,“删除前导'/'也不行,匹配像'public/static/foo.js'和'foo/public/static/bar.js'这样的路径。”是错误的。 引用[该文档](http://git-scm.com/docs/gitignore/)“如果该模式不包含斜杠/,Git将其视为shell glob模式,并检查与路径名匹配相对于.gitignore文件的位置(相对于工作树的顶层,如果不是来自.gitignore文件)。“ 'foo/public/static/bar.js'不会匹配,因为该模式确实包含'/'。 – joeyhoer

+0

@JoeyHoer感谢小费,我已经相应地更新了我的答案。 –

9

要忽略未跟踪的文件,只需转到.git/info/exclude。排除是具有被忽略的扩展名或文件列表的文件。

+0

这不会延续到存储库的其他克隆中,例如.gitignore(当然会在提交之后)。 – jpmc26

128

根据the documentation,看起来**句法由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” 等。

  • 其他连续的星号被视为无效。

+1

'xxx/**'和'xxx /'有什么区别? – thuzhf

+6

'xxx/**'定位'xxx'内的所有文件和目录,而'xxx /'定位直接定位到'xxx'目录。当使用'!'否定模式时,这真的很重要,因为“如果不包含该文件的父目录,则不可能重新包含文件”,所以使用'xxx/*'或'xxx/**'会在这种情况下是必要的。 – joeyhoer

+1

所有以.meta结尾的文件都应该被git忽略。这个怎么用? '**。js'? – Black

相关问题