gitignore目录中的所有扩展文件

Har*_*rry 170 git gitignore

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

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

/public/static/**/*.js
Run Code Online (Sandbox Code Playgroud)

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

joe*_*oer 189

根据文档,似乎版本**支持该语法.git1.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/**`会在这种情况下是必要的. (8认同)
  • `xxx/**` 和 `xxx/` 有什么区别? (3认同)
  • git应忽略所有带有.meta结尾的文件.这是如何运作的?`**.js`? (3认同)

pty*_*tyx 108

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

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

  • 这不是最好的解决方案.潜在的人们需要挖掘不同的.gitignore文件,以找出他们的文件被忽略的原因.有些人希望在存储在repo根目录下的一个.gitignore文件中包含所有这些信息. (16认同)
  • @haren 这不是唯一的解决方案 - Joey 的答案当然也有效。选择最适合您的方式。我认为忽略目录本地的规则应该在该目录中,而全局规则应该是全局的。(另外,这个答案很古老,我认为当时不支持**)。 (3认同)

Ada*_*arp 63

更新:看看@Joey的答案:Git现在支持**模式中的语法.这两种方法都应该可行.


gitignore(5)手册页中指出:

从与路径相同的目录中的.gitignore文件读取的模式,或在任何父目录中读取的模式,更高级别文件中的模式(直到工作树的顶层)被低级文件中的模式覆盖到目录包含文件.

这意味着.gitignorerepo的任何给定目录中的文件中的模式将影响该目录所有子目录.

你提供的模式

/public/static/**/*.js
Run Code Online (Sandbox Code Playgroud)

是不是很正确,首先是因为(正如你正确指出的那样)**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
Run Code Online (Sandbox Code Playgroud)

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

  • 这并不完全正确 - 特别是"删除前导`/`部分也不起作用,匹配`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`不匹配,因为模式确实包含`/`. (2认同)

小智 10

要忽略未跟踪的文件,只需转到.git/info/exclude.Exclude是一个包含已忽略的扩展名或文件列表的文件.

  • 这不会像 .gitignore 那样延续到存储库的其他克隆(当然,在提交之后)。 (2认同)

小智 8

我试过.gitignore在我的 vscode 中打开文件,windows 10. 在那里您可以看到,一些先前添加的忽略文件(如果有)。

要创建一个新规则来忽略带有(.js)扩展名的文件,请像这样附加文件的扩展名:

*.js
Run Code Online (Sandbox Code Playgroud)

这将忽略存储库中的所有.js文件git

要从特定目录中排除某些类型的文件,您可以添加以下内容:

**/foo/*.js
Run Code Online (Sandbox Code Playgroud)

这将仅忽略 /foo/ 目录中的所有 .js 文件。

详细学习可以访问:关于 git-ignore

  • 开头不需要 ** (2认同)

Mik*_*kis 8

正如其他答案已经说过的那样,类似的模式**/*.exe将忽略.exe存储库中任何位置的所有文件。

然而,许多人(像我一样)在排除故障时必然会遇到这个问题......
为什么这不起作用。

因此,命令git status或你的 IDE 可能会告诉你xyz.exe即将提交,你可能会用头撞墙试图找出为什么会这样,因为你**/*.exe的 .gitignore 文件中确实有这样的内容,并且因为这个问答确认这实际上是正确的魔法咒语,应该可以防止这种情况发生。但事实并非如此。

您处于这种荒谬情况的实际原因是您(或者更可能的是,您的 IDE 自动为您)已经暂存了该文件。

解决方案是先将其取消暂存,然后它将被忽略。

<rant> “暂存区”是 git 的一个完全无用的功能,它是一个主要的痛苦来源,没有任何值得一提的好处;然而,它是 git 工作原理的核心,所以你必须时刻意识到它。不同的 IDE 采取不同的方法:Visual Studio 强制您处理暂存问题,这就是为什么在 Visual Studio 中使用 git 是一件非常痛苦的事情,并且用户体验非常差的原因之一。IntelliJ IDEA 会在幕后为您处理暂存(正如它应该的那样),因此您不必被它打扰,甚至不必知道它的存在,这就是为什么在 IntelliJ IDEA 中使用 git 是一种方便的原因之一。乐趣。不幸的是,没有什么是完美的,所以不可避免地,偶尔会出现痛苦,即使使用 IntelliJ IDEA 也是如此。 </rant>


Gar*_*ini 5

我相信最简单的解决方案是使用find. 我不喜欢.gitignore在子目录中存在多个,我更喜欢管理一个独特的顶级.gitignore. 为此,您只需将找到的文件附加到您的.gitignore. 假设这/public/static/是你的项目/git home 我会使用类似的东西:

find . -type f -name *.js | cut -c 3- >> .gitignore
Run Code Online (Sandbox Code Playgroud)

./我发现,为了让 git 了解要避免哪些文件,通常需要在开头删除。因此cut -c 3-.