101

我见过类似的问题(123),但我没有从他们那里得到适当的解决方案。

我需要忽略特定文件夹下的所有文件,特定文件类型除外。该文件夹是根路径的子目录。让我命名文件夹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显示它。

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

我可以用一个忽略文件实现同样的效果吗?我发现在不同的目录中有许多忽略文件有点笨拙。

这就是我想要实现的目标:

# 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

4 回答 4

120

@SimonBuchan 是正确的。

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

于 2014-09-18T15:25:11.240 回答
28

最好的答案是在 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

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

于 2013-07-23T21:44:00.947 回答
7

这可能看起来很愚蠢,但请检查您之前是否尚未将尝试忽略的文件夹/文件添加到索引中。如果你这样做了,不管你在你的 .gitignore 文件中放了什么,文件夹/文件仍然会被暂存。

于 2017-05-17T08:14:54.643 回答
6

要么我做错了,要么接受的答案不再适用于当前的 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
于 2018-03-26T17:07:34.080 回答