忽略目录中所有特定扩展名的文件。

310
有没有一种方法可以忽略目录中某一类型的所有文件?
由于 ** 对 Git 来说是无意义的,因此这种方法行不通:
/public/static/**/*.js

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


2
可能是Git-忽略某些子目录中的特定文件,但不是全部的重复问题。 - Chris Moschini
9个回答

300
文档显示,git在版本1.8.2.1中支持**语法。

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

  • 以斜杠开头的 "**" 表示匹配所有目录。例如,"**/foo" 可匹配任意位置的文件或目录 "foo",与模式 "foo" 相同。"**/foo/bar" 匹配直接位于目录 "foo" 下面的文件或目录 "bar"。

  • 以斜杠结尾的 "/**" 表示匹配内部的所有内容。例如,"abc/**" 可匹配相对于.gitignore文件所在位置的目录 "abc" 中的所有文件,包括无限深度。

  • 斜杠后紧随两个连续的星号然后是一个斜杠表示匹配零个或多个目录。例如,"a/**/b" 可匹配 "a/b"、"a/x/b"、"a/x/y/b" 等。

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


5
xxx/**xxx/有什么区别? 答:xxx/**表示匹配xxx目录下的所有子目录和文件,而xxx/仅匹配xxx目录本身。 - Daniel
12
xxx/** 匹配 xxx 目录下所有的文件和文件夹,而 xxx/ 则只匹配 xxx 目录本身。这一点只有在使用否定模式 ! 时才会产生影响,因为“如果一个文件的父目录被排除在外,则无法重新包含该文件。”,所以在这种情况下必须使用 xxx/*xxx/** - joeyhoer
7
所有以 .meta 结尾的文件应该被 Git 忽略。这是如何实现的呢?**.js 是什么意思? - Black
其他连续的星号都被视为无效。 - imrok

162

从未尝试过,但是 git help ignore 建议在 /public/static 中放置一个带有 *.js.gitignore 可以实现你想要的效果。

注意:一定要查看下面 Joey's 的答案:如果您想忽略特定子目录中的文件,则本地的 .gitignore 是正确的解决方案(局部性很好)。但是,如果需要将相同的模式应用于整个存储库,则 ** 解决方案更好。


36
这并不一定是最佳解决方案。潜在地,人们需要查找不同的.gitignore文件以找出为什么他们的文件被忽略。有些人更喜欢将所有这些信息存储在位于存储库根目录下的一个 .gitignore 文件中。 - haren
3
@haren 这不是唯一的解决方案 - Joey 的答案也是有效的。选择最适合您的方法。我认为应该将忽略目录本地规则放在该目录中,全局规则应该是全局的。 (此外,这个答案已经过时了,我不认为 ** 在当时被支持)。 - ptyx

91

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


gitignore(5)手册中指出:

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

这意味着在您的repo中给定目录中的.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目录及其子目录中的文件。


3
这并不完全正确 - 具体来说,“删除前导/也行不通,匹配路径如public/static/foo.jsfoo/public/static/bar.js。”是错误的。引用文档:“如果模式不包含斜杠/,Git将其视为shell glob模式,并针对相对于.gitignore文件位置的路径名进行匹配(如果不是来自.gitignore文件,则相对于工作树的顶级)。” foo/public/static/bar.js不会被匹配,因为该模式包含/ - joeyhoer
@JoeyHoer,感谢您的提示,我已相应更新了我的答案。 - Adam Sharp

21

我已经尝试在我的VSCode,Windows 10中打开.gitignore文件。在那里,您可以查看之前添加的忽略文件(如果有的话)。

要创建一个新规则以忽略扩展名为(.js)的文件,请像这样追加文件的扩展名:

*.js

这将忽略您的git仓库中所有.js文件。

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

**/foo/*.js

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

要了解更详细的内容,您可以访问:关于git-ignore


2
暂无内容。请提供需要翻译的文本。 - Reven

11

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


3
这不会像.gitignore一样传递给其他克隆存储库(当然,是在提交之后)。 - jpmc26

8
如其他答案已经提到的那样,形如 **/*.exe 的模式将忽略存储库中任何位置的所有 .exe 文件。
然而,很多人(包括我)在排除故障时会遇到这个问题...... 命令 git status 或你的 IDE 可能会告诉你要提交 xyz.exe,你可能正在努力想弄清楚为什么会出现这种情况,因为你的 .gitignore 文件确实有**/*.exe,并且此问答证实这确实是正确的魔法咒语,应该防止这种情况。但是它没有起作用。
你处于这种荒谬的情况的实际原因是你(或更可能是你的 IDE 自动为你)已经把该文件设置了暂存区。
解决方法是先取消暂存,然后再忽略它。
“暂存区”是 git 的一个完全无用的特性,是痛苦的主要来源,没有值得一提的好处;然而,它在 git 的工作方式中是核心所在,所以你必须始终注意它。不同的 IDE 对其采取不同的方法:Visual Studio 强制你处理暂存,这就是使用 Visual Studio 中的 git 是一个主要痛点和非常糟糕的用户体验的原因之一。IntelliJ IDEA 在后台为你处理暂存(这正是它应该做的),所以你不必受到干扰,甚至不必意识到其存在,这就是在 IntelliJ IDEA 中使用 git 的乐趣所在。不幸的是,没有什么是完美的,所以不可避免地,即使是 IntelliJ IDEA,也会有时候出现痛苦。

Visual Studio有一个提交按钮,只要没有进行任何暂存操作,该按钮就会起到“全部暂存并提交”的作用。一旦手动执行了暂存操作,那么该按钮就变成了“提交所有已暂存的文件”。我同意git存在许多可用性陷阱。 - Gru

5

我认为最简单的解决方案是使用 find 命令。我不喜欢在子目录中放置多个 .gitignore 文件,而且我更喜欢管理一个唯一的顶级 .gitignore 文件。为此,您可以将找到的文件追加到您的 .gitignore 文件中。假设 /public/static/ 是您的项目/git主目录,我会使用类似以下命令:

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

我发现在git理解要避免哪些文件时,通常需要删除开头的./。因此使用cut -c 3-命令。


-1

我使用了git rm --cached **.DS_Store 命令从代码库中删除并取消跟踪所有的.DS_Store文件。


-2

除了其他答案提到的一些方法(如果你运气好,问题是由于其他原因引起的可能有效)外,以下是一些额外的建议:

  1. 确保代码中忽略文件大小超过100MB的文件
  2. 尝试重新启动git工作流。删除本地.git文件夹,重新初始化git并重试推送到github。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接