我在static/
中有.gitignore
,成功地忽略了整个目录。我现在要在其中暂存除static/vendor
以外的所有内容。
我认为在static/vendor/
中放入.gitignore
可以做到。但是,事实并非如此。当我提交static
进行暂存时,static/vendor
内部的所有文件仍最终与我实际想要的其他文件暂存。
这有招吗?我想念什么?
我在static/
中有.gitignore
,成功地忽略了整个目录。我现在要在其中暂存除static/vendor
以外的所有内容。
我认为在static/vendor/
中放入.gitignore
可以做到。但是,事实并非如此。当我提交static
进行暂存时,static/vendor
内部的所有文件仍最终与我实际想要的其他文件暂存。
这有招吗?我想念什么?
.gitignore
规则有点怪异。 (为此,名称.gitignore
有点怪异,但可以原谅:更好的名称应该是.git-do-not-complain-about-some-files-that-are-untracked-and-do-not-automatically-add-them-in-that-case-but-this-file-has-no-effect-on-files-that-are-tracked
或其他同样古怪的名称。)
.gitignore
中的每一行具有以下几种通用形式之一:
!
的这使我们可以完全省去第一种类型,并使用一组规则考虑第二种和第三种类型的行,最后使用“请勿忽略”。因此,现在我们来看以下子规则:
foo
或/leading
或trailing/
或/leadandtrail/
或has/slash
,/has/slash
,has/slash/
,等等。(行中还可以包含各种glob字符,现在就不用担心!)
为了使子类别的爆炸更加简单,我们希望将它们分为两个关键子类别,我将它们称为 anchored 和 un-anchored 。沿着一个单独的轴,我们希望将它们分为两个 other 关键子类别,我将其称为斜杠后缀和非斜杠后缀。
锚定的名称是以开头的斜杠或包含嵌入式斜杠(或两者都有)的任何名称。因此,/leading
和has/slash
和/has/slash
都是锚定的,而foo
和trailing/
是未锚定的。
带有斜杠的名称是任何以结束的名称。名称被归类为斜杠后,最后一个斜杠将被删除。因此,trailing/
带有斜线后缀,然后将其视为仅拼写为trailing
,而has/slash/
也带有斜线后缀并视为其刚刚拼写为has/slash
。
因此输入:
vendor/
带斜线但未锚定,而:
static/vendor/
都带有斜线后缀和。
({a/b//
之类的名称以斜杠后缀和锚定,并像a/b/
一样对待,而b//
之类的名称则以斜杠后缀并锚定并像b/
那样对待。剩下的多余斜线只是个坏主意:不要这样做,我不确定实际会发生什么!)
现在,我们已经将名称分为锚定或未锚定以及斜杠后缀或非斜杠后缀,我们可以描述gitignore规则如何为它们工作:
当且仅当该部分路径名表示目录/文件夹时,任何带斜杠的名称均与该部分路径名匹配。因此,vendor/
与目录(或文件夹)vendor
匹配,但与名称成分为vendor
的文件不匹配。如果没有斜杠后缀,则名称与 文件和目录都匹配。
任何锚定的名称仅与从找到.gitignore
文件的同一目录开始的文件名的组成部分匹配。。也就是说,在锚定为vendor
的情况下,我们将在 this 目录中排除vendor
,但不排除a/vendor
,b/vendor
等。给定无固定的供应商,我们将在此目录和 vendor
和 a/vendor
中排除b/vendor
,依此类推。
这就是为什么在您的static/
前面添加vendor/
会改变其行为的原因:它从未锚定变为锚定,从而开始像/static/vendor/
一样工作(当然会做同样的事情:它有两种锚固方式,但唯一重要的是锚固方式。
在前面添加**/
可使(仍然锚定!)字符串static/vendor/
匹配a/static/vendor
,b/static/vendor
,依此类推。取消固定**/
时,您不需要前面的vendor/
。
请注意,顺便说一句,您可以从 this 编辑:糟糕,这是倒退的:您需要一个vendor/
文件(无论在哪里)中完全删除.gitignore
条目并创建一个{{1 static/
中的}}条目,必要时创建该文件。那将是无锚的,但带有斜杠。它会匹配该目录中的目录vendor/.gitignore
或该目录的任何子目录。static
在vendor/
目录中。但是一般原则在这里适用。
(主要或唯一的缺点是,您将在此特定子目录中创建或更改文件-当然,您可能需要在多个子目录中进行操作。)