在Git中忽略某些子目录中的文件,但不是全部文件。

87
我有一个类似以下结构的结构体:
/root/
/root/data/
/root/data/script.php
/root/data/some.json
/root/data/feature/one.json
/root/data/feature/two.json
/root/data/other-feature/one.json
/root/data/other-feature/important-script.php
我希望git忽略'/data/...'路径下 .json文件,但是 '/data/' 路径有时包含子目录。我理解在 gitignore 中简单写成data/*.json 只会匹配一个目录,因为*不会匹配/,正如 http://git-scm.com/docs/gitignore中“Pattern Format”第六条所述的那样:
否则,git将模式视为适合由带有FNM_PATHNAME标志的fnmatch(3)使用的shell glob:模式中的通配符将不匹配路径名中的/。例如,“Documentation / * .html”与“Documentation / git.html”匹配,但不匹配“Documentation / ppc / ppc.html”或“tools / perf / Documentation / perf.html”。
有没有一种简单的方法来做到这一点,还是需要在每个子目录中明确地添加gitignore文件?

1
最新的答案在这里:https://dev59.com/Pmgv5IYBdhLWcg3wSe62#10714272 - Chris Moschini
4个回答

115

我最近写了一篇关于这个问题的文章,可以在这里看到。

基本上你需要在/data/目录下放置一个带有*.json.gitignore文件。

更新:自从git 1.8.4(如果您使用msysgit,则为1.8.2)以来,可以使用双星号模式,例如/data/**/*.json


我添加了.gitignore文件,其中包含*.json,但如果我更改其中一个文件并运行git status,则会将它们列为“未暂存的更改”。在生效之前,是否需要提交.gitignore文件?这是因为这些文件以前被跟踪过吗? - anonymous coward
19
无论.gitignore里面有什么内容,之前跟踪的文件都将被继续跟踪。 - Ivan Danilov
1
备份要停止跟踪的文件,然后尝试使用git rm --cached <file>命令。这将从远程删除该文件,而--cached选项将保留本地文件。我认为该文件将不再出现在“未暂存的更改”下。如果成功了,您可以对所有其他文件执行相同的操作: git rm --cached <file list> - user3897315
如果你想忽略除了 PHP 以外的所有内容,你需要使用 /data/**/*.* 然后跟上 /data/**/*.php - Mark Loyman
1
@MarkLoyman 我想您的意思是 "紧接着 !/data/**/*.php" 以取消忽略 php 文件的规则。 - Ivan Danilov
@IvanDanilov 是的,谢谢您的纠正。 - Mark Loyman

26
您可以将 data/**/*.json 放在您的 /root 目录下的 .gitignore 文件中,以防止多个不同目录中的 .gitignore 文件。 **/ - 匹配任意数量的子目录(包括当前目录)。
例如:data/**/*.json 将忽略 data/1.jsondata/subfolder/2.jsondata/../../3.json

@CaptainBlammo 我正在使用它,它有效,也许你做错了什么?这里有一些信息:一些文档 - E.Monogarov
1
它还将忽略/bla/data/**/*.json/bla/bla/data/**/*.json。应使用/data/**/*.json - Onur Demir

6
这种模式对我很有用,可以忽略数据子文件夹中的png和jpg文件:
**/data/**/*.png
**/data/**/*.jpg

1

快速回答

# ignore all nested json file
/**/*.json

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