如何忽略一个目录中除了一个文件以外的所有内容?

15

代码库结构:

.gitignore
file1
file2
dir/
    file3
    <stuff>

我想忽略dir中的所有内容,除了文件3。这是我在.gitignore文件中的设置:

结果: I want to ignore everything inside dir except file 3. Here's what I have in my .gitignore file:

dir/*
!dir/file3

但是这似乎不起作用。 git 仍然试图索引目录中的所有内容。我该如何解决?

更新 - 删除旧的 .gitignore 文件后,创建一个新文件进行修复。新文件 没有 使用 > .gitignore 创建。


如果一个文件的父目录被排除了,那么就无法重新包含该文件。 来源 - Psytho
1
@Alex.S 是的,这是可能的,你可以使用 add -f 强制将其跟踪。 - Cory Kramer
2个回答

33

正确的做法是:

!dir
dir/*
!dir/file3

请注意,还有其他解决方案,例如在 dir/ 目录下创建一个本地的 .gitignore 文件,它将优先于之前的文件。

有趣的是,我也尝试了你的解决方案,而且

dir/*
!dir/file3

对我来说好像可以用。如果有人能对此发表评论,将不胜感激。


2
第二个可以工作是因为dir/没有被忽略,只有dir内容。而且你可以排除(取消忽略)一个文件,其文件夹没有被忽略。 - VonC
我曾经在那个时候编辑过这个文档:https://stackoverflow.com/documentation/review/changes/2697。自那以后,随后的编辑就不是那么准确了。 - VonC
好的,我现在对这里发生的事情有了更准确的了解。我可能会在几个小时内(约5个小时)提交一份编辑,但在此期间请随意进行编辑。这样的“破坏”是很遗憾的。我相信编辑者并不是真的想添加无效信息,但审核人员应该更仔细地检查,至少尝试解决方案。我无法描述我的愤怒之情。文档应该是准确的,这就是它的目的。 - MayeulC
1
还有几个问题:你的 git 版本是多少?我猜你是从命令行使用它的吧?你试过在子目录中放置一个 .gitignore 文件了吗? - MayeulC
很抱歉回复晚了。我使用的Git版本是2.9.2.windows.1。是的,从命令行输入。我使用Powershell。现在它可以工作了。我删除了.gitignore文件,并重新创建了一个相同的文件,但这次我没有使用“> .gitignore”来创建这个新文件。 - Tushar Rakheja
1
可能与行尾有关,这是我想到的一个想法。我不知道PowerShell如何处理这些内容,但我非常确定Git需要CR而不是CRLF,除非明确进行配置。 - MayeulC

3

这对我起作用:

!/dir/
/dir/*
!/dir/file3

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