我见过类似的问题(1,2和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
会显示它。
我终于找到了解决方案这里。解决方案是在
.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
类型并跟踪其他文件。
最好的答案是在 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
如果添加的目录深度超过指定深度,则需要编辑该模式。
这可能看起来很愚蠢,但请检查您是否尚未将之前尝试忽略的文件夹/文件添加到索引中。如果您这样做了,无论您在 .gitignore 文件中放入什么内容,文件夹/文件仍然会被暂存。
要么我做错了,要么接受的答案在当前的 git 中不再起作用。
我实际上已经找到了正确的解决方案,并将其发布在几乎相同的问题下here。欲了解更多详情,请前往那里。
解决方案:
# 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