我在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/
是un-anchored。
A 斜线后缀名称是斜杠ends的任何名称。名称被归类为斜杠后,最后一个斜杠将被删除。因此,trailing/
带斜线后缀,然后将其视为仅拼写为trailing
,并且has/slash/
也带斜线后缀并视为其仅拼写为has/slash
。
因此输入:
vendor/
带斜线但未锚定,而:
static/vendor/
都带有斜线后缀和固定。
[坏主意:不要这样做。我不确定实际会发生什么!)现在我们已经将名称分类为锚定或未锚定,并以斜杠后缀或非斜杠后缀命名,我们可以描述gitignore规则如何为它们工作:
a/b//
匹配目录(或文件夹)a/b/
,但不匹配名称成分为b//
的file。如果不带斜杠后缀,则名称与both文件and目录匹配。
anchored
b/
文件的目录开始的文件名组成部分匹配。也就是说,给定锚定的vendor/
,我们将排除this目录中的vendor
,但不包括vendor
,.gitignore
等。给定一个未锚定的供应商,我们将在此目录中排除vendor
andvendor
and a/vendor
,依此类推。b/vendor
前面添加vendor
会改变其行为:它从未锚定变为锚定,因此开始像a/vendor
一样工作(当然,它会做同样的事情:锚定有两种方式,但唯一重要的是锚定。]在前面加上b/vendor
可使(仍然锚定!)字符串static/
匹配vendor/
,/static/vendor/
等。取消锚定**/
时,不需要前面的static/vendor/
。
替代
注意,顺便说一下,您可以从this
a/static/vendor
文件(无论它在哪里)中完全删除b/static/vendor
条目,并在**/
中创建一个vendor/
条目,创建该文件如有必要。那将是无锚的,但带有斜杠。它会匹配该目录中的目录vendor/
或该目录中任何子目录of。编辑:糟糕,这是向后的:您需要.gitignore
目录中的一个static/
。但是一般原则在这里适用。((主要或唯一的缺点是,您将在此特定子目录中创建或更改文件,并且,当然,您可能需要在多个子目录中进行操作。)] >