Git会忽略除特定文件以外的所有文件

时间:2018-08-12 21:50:49

标签: git gitignore

我在目录中有很多文件,我不希望它们被git跟踪。因此,我想忽略除.bashrc.gitignore.config/terminator/config以外的所有文件。

我正在尝试在.gitignore中执行以下操作:

*
!.gitignore
!.bashrc
!.config/terminator/config

.bashrc.gitignore文件现在已被忽略,但仍然无法使.config/terminator/config被忽略。如何在git中做到这一点?

我有一个可能的解决方案,但是有没有指定子目录的更优雅的解决方案?

*
!.gitignore
!.bashrc
!.gitconfig

!.config/
!.config/terminator/
!.config/terminator/config

1 个答案:

答案 0 :(得分:3)

答案的简短版本是,一旦Git忽略了某个目录,它将继续打扰不要在该目录的内部查找,除非已经有其他措施迫使它执行该操作因此。 1 要停止此操作,必须使用!条目明确列出您不想忽略的目录。

*
!/.bashrc
!/.config
!.config/terminator
!.config/terminator/config
!/.gitignore

也就是说:

*

告诉Git:忽略所有内容,除非将其覆盖。然后最终:

!.bashrc

覆盖.bashrc的忽略规则,依此类推。但是Git所做的是,它首先读取.以查找所有条目。假设它按字母顺序找到它们:.bashrc.config.editorthing.gitignore.history,依此类推;并假设我们拥有您的原始.gitignore文件:

  1. 嗯,我看到了.bashrc,让我们检查一下...啊,第1行说忽略,但是第3行说不要,所以不要忽略。结果:不被忽略。
  2. 现在我看到.config,让我们检查一下。第1行表示忽略,第2行表示.gitignore,第3行表示.bashrc,第4行表示保留.config/terminator/config。这些都不是,所以第1行适用!结果:被忽略了!
  3. 重复上述操作。

可以说,第2步中的动作是愚蠢的:如果忽略较短的.config,则不可能应用长规则,因此.config/<something>的存在不容忽视应该触发Git忽略.config。实际上,最新版本的Git会尝试对此更加智能,但较旧的版本则不会:您必须明确地忽略.config(或/.config,在这里更好,原因是我不会进入,但这就是为什么我在 2 )上面这样写的原因。

有一个 更好的技巧,但是它会使Git变慢,因此您可能不想使用它。诀窍是显式取消忽略所有目录:

*
!*/
!/.bashrc

,依此类推。但是现在,如果您有一个目录a包含数百万个子目录和文件 a,Git将扫描所有a及其所有子目录,而之前,它会跳过它。


1 index .config中具有文件会强制Git扫描.config。但是,除非索引也包含.config/terminator中的一个文件,否则您将遇到.config/terminator的同一问题。

2 好的,我会介绍一下。它不适用于这种特殊情况,但是假设您忽略了.bashrc(如果Git由于某种原因而扫描了a/,并且a/包含了一个名为{{1}的文件) },Git将忽略.bashrc。不过,我们不需要a/.bashrc上的斜杠,因为该包含一个嵌入斜杠(一个不末尾)。这样一来,该名称上的匹配项便会生根,而.config/terminator上的匹配项便不会生根,因此匹配.bashrc