我在目录中有很多文件,我不希望它们被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
答案 0 :(得分:3)
答案的简短版本是,一旦Git忽略了某个目录,它将继续打扰不要在该目录的内部查找,除非已经有其他措施迫使它执行该操作因此。 1 要停止此操作,必须使用!
条目明确列出您不想忽略的目录。
*
!/.bashrc
!/.config
!.config/terminator
!.config/terminator/config
!/.gitignore
也就是说:
*
告诉Git:忽略所有内容,除非将其覆盖。然后最终:
!.bashrc
覆盖.bashrc
的忽略规则,依此类推。但是Git所做的是,它首先读取.
以查找所有条目。假设它按字母顺序找到它们:.bashrc
,.config
,.editorthing
,.gitignore
,.history
,依此类推;并假设我们拥有您的原始.gitignore
文件:
.bashrc
,让我们检查一下...啊,第1行说忽略,但是第3行说不要,所以不要忽略。结果:不被忽略。.config
,让我们检查一下。第1行表示忽略,第2行表示.gitignore
,第3行表示.bashrc
,第4行表示保留.config/terminator/config
。这些都不是,所以第1行适用!结果:被忽略了!可以说,第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
。