除特定文件类型外,在特定文件夹下以递归方式正确忽略所有文件

时间:2013-07-23 14:12:48

标签: git version-control directory gitignore subdirectory

我见过类似的问题(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会显示它。

我终于得到了解决方案here。解决方案是在.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 个答案:

答案 0 :(得分:95)

@SimonBuchan is correct.

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

答案 1 :(得分:23)

最佳答案是在包含以下内容的资源下添加一个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 :(得分:3)

这可能看起来很愚蠢,但请检查您是否尚未将之前要忽略的文件夹/文件添加到索引中。如果你这样做了,你放入.gitignore文件中的内容并不重要,文件夹/文件仍会被暂存。

答案 3 :(得分:3)

我做错了或接受的回答不再适用于当前的git。

我实际上找到了正确的解决方案并将其发布在几乎相同的问题here下。有关详细信息,请访问。

解决方案:

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