gitignore目录中所有扩展名文件


191

有没有办法忽略目录中某个类型的所有文件?

** 对git显然毫无意义,所以这行不通:

/public/static/**/*.js

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


Answers:


121

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

注意:请确保还检查以下Joeys的答案:如果要忽略特定子目录中的文件,则使用本地.gitignore是正确的解决方案(本地性很好)。但是,如果您需要将相同的模式应用于整个存储库,那么**解决方案会更好。


19
不一定是最好的解决方案。人们可能需要挖掘不同的.gitignore文件,以查找为什么忽略其文件的原因。有些人更喜欢将所有这些信息保存在一个regit根目录下的.gitignore文件中。
哈伦

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

209

根据该文档,似乎该**语法受git版本支持。1.8.2.1

**与完整路径名匹配的模式中的两个连续星号(“ ”)可能具有特殊含义:

  • 前导“ **”后跟斜杠表示在所有目录中均匹配。例如,“ **/foo”与文件“ foo”相同的任何位置都匹配文件或目录“ foo”。“ **/foo/barbar会在目录“ foo” 正下方的任何位置匹配文件或目录“ ”。

  • 尾部的“ /**”与内部的所有内容匹配。例如,“ abc/**”将目录“ abc” 内的所有文件(相对于.gitignore文件位置)以无限的深度进行匹配。

  • 斜杠后跟两个连续的星号,然后斜杠匹配零个或多个目录。例如,“ a/**/b”匹配“ a/b”,“ a/x/b”,“ a/x/y/b”等。

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


1
xxx/**和之间有什么区别xxx/
thuzhf

9
xxx/**定位到其中的所有文件和目录,xxx而直接xxx/定位到该xxx目录。这实际上仅在否定模式时才有意义,!例如“如果排除了该文件的父目录,则无法重新包含文件。”,因此在这种情况下必须使用xxx/*xxx/**
joeyhoer '16

4
所有以.meta结尾的文件都应该被git忽略。这是如何运作的?**.js
黑色

“其他连续的星号被视为无效。” 总结所有内容
18:10

68

更新:看看@Joey的答案:Git现在支持**模式中的语法。两种方法都可以正常工作。


gitignore(5)手册页中指出:

从与路径相同的目录中或任何父目录中的.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将其视为普通的,非递归的外壳程序(感谢@Joey Hoer指出了这一点)。

正如@ptyx建议的那样,您需要做的是创建文件<repo>/public/static/.gitignore并仅包含以下模式:

*.js

没有前导/,因此它将在路径的任何部分匹配,并且该模式将仅应用于/public/static目录及其子目录中的文件。


2
这并非完全正确,特别是“删除引线/也将不起作用,匹配路径如public/static/foo.js和” foo/public/static/bar.js。是错误的。引用文档 “如果该模式不包含斜杠/,Git会将其视为shell glob模式,并检查相对于.gitignore文件位置的路径名是否匹配(相对于工作树的顶层,如果而不是来自.gitignore文件)。” foo/public/static/bar.js不会匹配,因为该模式确实包含/
joeyhoer 2014年

@JoeyHoer谢谢你的提示,我已经相应更新了我的答案。
亚当·夏普

9

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


1
这不会像.gitignore那样继承到存储库的其他克隆中(当然,在提交之后)。
jpmc26

3

我相信最简单的解决方案是使用find。我不喜欢.gitignore在子目录中徘徊,我更喜欢管理一个唯一的顶层.gitignore。为此,您只需将找到的文件添加到您的.gitignore。假设这/public/static/是您的项目/ git主页,我将使用类似以下内容:

find . -type f -name *.js | cut -c 3- >> .gitignore

我发现删除./git开头通常是必要的,以便git了解要避免的文件。因此cut -c 3-

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.