如何递归地在 .gitignore 文件中忽略文件

160

我试图避免在我的.gitignore文件中出现以下模式。

MyPrject/WebApp/Scripts/special/*.js
MyPrject/WebApp/Scripts/special/*/*.js
MyPrject/WebApp/Scripts/special/*/*/*.js
MyPrject/WebApp/Scripts/special/*/*/*/*.js
MyPrject/WebApp/Scripts/special/*/*/*/*/*.js
MyPrject/WebApp/Scripts/special/*/*/*/*/*/*.js
MyPrject/WebApp/Scripts/special/*/*/*/*/*/*/*.js

我们已经尝试过:

MyPrject/WebApp/Scripts/special/**.js
MyPrject/WebApp/Scripts/special/**/*.js

然而,这并没有起作用。这是在Windows上使用git。有没有更简洁的方法来做到这一点而不重复呢?


4个回答

175

自 Git 1.8.2 开始,以下操作:

MyPrject/WebApp/Scripts/special/**/*.js

应按照此答案操作。在Windows 7中,使用Sourcetree 1.6.12.0和它安装的git版本(1.8.4-preview20130916),这对我也起作用。

要递归地忽略目录下的每个文件和文件夹,请使用gitignore:

MyPrject/WebApp/Scripts/special/**

Git 1.8之前怎么办? - ashes999
1
如果这个答案在Windows上不起作用,请在开头添加字符“/”。例如:/MyProject/WebApp/Scripts/special/**/*.js - batressc
4
我很尴尬,因为我的答案只是一个指向另一个答案的链接,但它却不断地得到点赞。 - Sam
我可以确认,当放置在/WebApp/Scripts/special/.gitignore中时,/WebApp/Scripts/special/**/*.js*.js都不起作用,但是当我将*.js放置在/WebApp/Scripts/special/a/b/c/.gitignore中时,它确实起作用。 - puk
1
@puk:这个问题中的.gitignore位于仓库根目录(即/Webapp的父目录)。 - lucid_dreamer
2
你的答案看起来不错,但在我使用 Windows 10 和 git 1.9.1 的情况下,在忽略除 js 以外的所有文件时并没有起作用,如下所示:(第一行)foo/bar/*/*(第二行)!foo/bar/**/*.js 它只对一级子目录起作用,而不是递归地。 - LLL

27

按照gitignore手册:

[...] git将该模式视为适合fnmatch(3)使用的shell glob,标志为FNM_PATHNAME:模式中的通配符不会匹配路径名中的斜杠。

因此,显然无法指定在两个字符串之间的一定数量的目录,例如在specialjs之间。

尽管如此,您可以针对每个目录使用一个.gitignore文件,因此在您的情况下,可能需要以下内容:

*.js

在下面的地方

MyPrject/WebApp/Scripts/special/.gitignore

足够了吗?


我曾经有 MyPrject/WebApp/Scripts/special*.js,它匹配了 MyPrject/WebApp/Scripts/specialfile.js 以及 MyPrject/WebApp/Scripts/special/a/b/c/file.js。然而,由于某种原因,这种行为已经改变了,我的当前解决方法是逐个列出目录。我正在使用 GitHub for Windows。 - orad
1
找到 MyProject/WebApp/Scripts/special 目录下的所有文件夹,并在每个文件夹中创建 .gitignore 文件,将所有 .js 文件添加到其中,并将 .gitignore 文件添加到 git 中。命令如下:find MyPrject/WebApp/Scripts/special -type d -printf 'echo "*.js" >> %h/.gitignore\n git add %h/.gitignore\n' | sh - jthill

26

这在我的OSX系统上有效。

lib64/**/__pycache__/
lib/**/__pycache__/
*.py[cod]
.ipynb_checkpoints/
**/.ipynb_checkpoints/
.DS_Store
**/.DS_Store

我不小心给你的答案点了踩,除非你编辑一下,否则我无法更正。如果你能编辑并加上一个空格或者换行,我会更正我的投票。 - tomarv2

5
尝试执行 git rm -r --cached MyPrject/WebApp/Scripts/special/ 命令,你提到的目录可能被 git 缓存,并会显示为未跟踪的文件。清除缓存后,确保在 .gitignore 文件中将其列出。

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