忽略特定文件夹下除了特定文件类型以外的所有文件。

106

我看到了类似的问题(1, 23),但是它们并没有给出一个恰当的解决方案。

我需要忽略特定文件夹下的所有文件,除了指定的一种文件类型。这个文件夹是根目录的子目录。让我们称这个文件夹为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会显示它。
我最终在这里找到了一个解决方案。解决方案是在Resources文件夹中添加另一个.gitignore文件。这样可以正常工作。
我能否用一个忽略文件实现相同的效果?我觉得在不同目录下有许多忽略文件有点笨重。
这就是我想要实现的:
# 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类型并跟踪其他文件。
4个回答

125

1
这对我有用,稍作调整,我只需要删除目录及其下面的所有内容,所以我做了:DirectoryName1/** DirectoryName1/**/*。首先删除目录,但你需要第二个来删除所有文件类型。 - Scala Enthusiast

27

最佳答案是在 Resources 文件夹下添加一个 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
在这里查看更多详细信息:https://dev59.com/XGsz5IYBdhLWcg3wlYwn——也由 OP @nawfal 上面链接。 - here

10

这可能看起来很愚蠢,但请检查您是否已将要忽略的文件夹/文件添加到索引中。如果添加了,无论您在.gitignore文件中输入什么内容,这些文件夹/文件都会被暂存。


6
如果有人遇到这个特定的用例,可以使用“git rm --cached <文件路径>”将这些被忽略的文件从git中清除,同时仍然保留它们在文件系统中的存在。 - slothluvchunk

9

我可能做错了什么,或者被接受的答案在当前的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 不忽略子目录非常关键。 - Johnster
我同意你的观点,Jim G 给出的解决方案在我的情况下是无效的。经过查阅官方文档后,我发现原因是目标文件的父目录仍然被忽略了,所以使用感叹号是无效的,然后我看到了你的答案。在这里我可以完美地工作。 - Andy

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