.gitignore 忽略所有文件,然后递归允许 *.foo。

66

这个问题已经有几个类似的提问,但是没有一个答案适用于我。

我想要忽略我的存储库下面所有文件夹中除了 *.foo 文件之外的东西。

(如果有人想知道这样可以被证明 - 我实际上正在为我所有的“Logic”项目制作一个 git 存储库 - 在 Mac 上的音乐软件 - 但我只想存储实际的项目文件 *.logic)

让我们一起开始吧,我会将每一个步骤都详细阐述:

设置:

mkdir temp
cd temp
mkdir testdir
cd testdir
touch include.foo
touch dontinclude.bad
cd..
git init
touch .gitignore

将此复制并粘贴到.gitignore中

# Ignore all
/*

# But not these files...
!.gitignore
!*.foo

输入命令 'git status' 后,唯一未被跟踪的文件是 .gitignore。如果我输入 'git add .' 命令,没有变化,只会看到 .gitignore 文件,我的两个文件将被忽略。为什么这样不起作用?如何更改上述过程以使其起作用?我从这里得到了非常相似的问题,也是从中获取了 .gitignore 文件。我正在使用 git --version 1.7.7 (也尝试过1.7.3) - .gitignore to ignore all files, then recursively allows files of a certain type


等一下,你有执行过 git add .gitignoregit commit -m "added gitignore" 吗? - Nic
1
顺便提一句,关于这个主题的重复答案中,你应该查看的“祖宗级别”的问题可能是Make .gitignore ignore everything except a few files - 这是一个非常常见的活动,并且有几个好的答案。我特别喜欢this answer,它似乎非常清晰和全面。 - Kay V
1个回答

141
你的问题在于开头的 /* 模式会匹配顶层的所有文件和目录,包括 testdir,所以忽略了 testdir 内部的所有内容。
这是你想要的:
# Ignore everything
*
# Don't ignore directories, so we can recurse into them
!*/
# Don't ignore .gitignore and *.foo files
!.gitignore
!*.foo

当您使用此配置执行git add .操作时,您应该发现只有.gitignore*.foo文件被列为要提交的更改。

@PandaWood:除了快速搜索表明它们实际上是目录之外,我对Mac OS X包不太了解。因此,您需要一个模式来取消忽略包目录中的任何文件。 - camh
是的,没错,它们基本上就是目录。里面的文件可以是各种未知的类型,所以看起来我得相反地去找出所有我能够合理知道不需要“包含”的文件——在这种情况下还好。我可能可以通过排除 .wav .m4a backup 和其他一些东西来解决问题。我写这个评论是为了确认给其他人一个建议,如果他们也在处理 .logic 文件,那么他们应该放弃原来的做法,按照我的建议使用排除方法。 - PandaWood
9
我发现在.gitignore中加入“不要忽略子目录”这一行可以使递归排除生效。例如,我想要不忽略一个名为bar/的目录。为了实现这个目的,在本回答中所示的行之后,我只需添加!bar/*!bar/**/*,那么bar/目录及其所有子目录中的文件都将被递归地包含在版本控制中。 - yuvilio
4
我找到了Stackoverflow上最好的.gitignore回答,因为其中包含了“取消忽略 .gitignore”这一部分。 - RichVel
1
这个解决方案。特别是用于防止目录被忽略的命令(!*/)似乎只在应用到根目录时有效。因此,如果您想将其应用于子目录,则必须在子目录中创建一个新的 .gitignore 文件。 - Erpheus
显示剩余4条评论

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