正确地递归地忽略除特定文件类型以外的特定文件夹下的所有文件


89

我已经看到了类似的问题(12 3),但我不从他们那里得到一个妥善的解决办法。

除特定文件类型外,我需要忽略特定文件夹下的所有文件。该文件夹是根路径的子目录。让我命名该文件夹Resources。由于我不想使事情复杂化,因此让我忽略所有命名为所有文件夹的文件Resources

这是最常见的解决方案(在所有重复的问题中)

# Ignore everything
*

# Don't ignore directories, so we can recurse into them
!*/

# Don't ignore .gitignore
!.gitignore

# Now exclude our type
!*.foo

该解决方案的问题在于它停止跟踪新添加的文件(因为*忽略所有文件)。我不想一直排除每种文件类型。我想要正常的行为,如果添加了任何新文件,就会git status显示出来。

我终于在这里找到了解决方案。解决方法是.gitignoreResources文件夹中添加另一个文件。这可以正常工作。

我可以使用一个忽略文件来达到相同的目的吗?我发现在不同目录中有许多忽略文件有点笨拙。

这是我要实现的目标:

# Ignore everything under Resources folder, not elsewhere
Resources

# Don't ignore directories, so we can recurse into them
!*Resources/

# Now exclude our type
!*.foo

但这给出了相反的输出。它忽略*.foo类型并跟踪其他文件。

Answers:


108

@SimonBuchan是正确的。

从git 1.8.2开始,Resources/** !Resources/**/*.foo可以正常工作。


1
这对我有用,稍作调整,我只需要删除目录及其下的所有内容,就可以DirectoryName1/** DirectoryName1/**/*对每个目录进行删除。冷杉删除目录,但是您需要第二个删除所有文件类型。
Scala发烧友

27

最好的答案是在包含以下内容的资源下添加一个Resources / .gitignore文件:

# Ignore any file in this directory except for this file and *.foo files
*
!/.gitignore
!*.foo

如果您不愿意或无法添加该.gitignore文件,则有一个不错的解决方案:

# Ignore any file but *.foo under Resources. Update this if we add deeper directories
Resources/*
!Resources/*/
!Resources/*.foo
Resources/*/*
!Resources/*/*/
!Resources/*/*.foo
Resources/*/*/*
!Resources/*/*/*/
!Resources/*/*/*.foo
Resources/*/*/*/*
!Resources/*/*/*/*/
!Resources/*/*/*/*.foo

如果添加的目录比指定的目录深,则需要编辑该模式。


2
太可惜了。确实,我将拥有更深的目录,所以我将坚持第一个:(
nawfal

在此处查看有关同一解决方案的更多详细信息:stackoverflow.com/questions/7803689/…-也由OP @nawfal链接
在此处

7

这看起来可能很愚蠢,但是请检查一下您之前是否尚未将要忽略的文件夹/文件添加到索引中。如果您这样做了,则将.gitignore文件中的内容放在哪里都无所谓,这些文件夹/文件仍将被暂存。


5
如果有人遇到了这个特定用例,则可以使用git rm --cached <path to files>git清除那些被忽略的文件,同时仍将它们保留在文件系统中。
slothluvchunk

5

我做错了,或者当前的git不再接受已接受的答案。

其实我已经找到妥善的解决办法,并张贴在几乎同样的问题在这里。有关更多详细信息,请前往。

解:

# Ignore everything inside Resources/ directory
/Resources/**
# Except for subdirectories(won't be committed anyway if there is no committed file inside)
!/Resources/**/
# And except for *.foo files
!*.foo

2
是的,这对我有用。!/Resources/**/要使git不能忽略子目录,添加至关重要。
约翰斯特
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.