Git不会忽略子目录 替代

我在static/中有.gitignore,成功地忽略了整个目录。我现在要在其中暂存除static/vendor以外的所有内容。

我认为在static/vendor/中放入.gitignore可以做到。但是,事实并非如此。当我提交static进行暂存时,static/vendor内部的所有文件仍最终与我实际想要的其他文件暂存。

这有招吗?我想念什么?

aaawang312 回答:Git不会忽略子目录 替代

.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/slashhas/slash/,等等。

(行中还可以包含各种glob字符,现在就不用担心!)

为了使子类别的爆炸更加简单,我们希望将它们分为两个关键子类别,我将它们称为 anchored un-anchored 。沿着一个单独的轴,我们希望将它们分为两个 other 关键子类别,我将其称为斜杠后缀非斜杠后缀

锚定的名称是开头的斜杠或包含嵌入式斜杠(或两者都有)的任何名称。因此,/leadinghas/slash/has/slash都是锚定的,而footrailing/未锚定的

带有斜杠的名称是任何以结束的名称。名称被归类为斜杠后,最后一个斜杠将被删除。因此,trailing/带有斜线后缀,然后将其视为仅拼写为trailing,而has/slash/也带有斜线后缀并视为其刚刚拼写为has/slash

因此输入:

vendor/

带斜线但未锚定,而:

static/vendor/

都带有斜线后缀

({a/b//之类的名称以斜杠后缀和锚定,并像a/b/一样对待,而b//之类的名称则以斜杠后缀并锚定并像b/那样对待。剩下的多余斜线只是个坏主意:不要这样做,我不确定实际会发生什么!)

现在,我们已经将名称分为锚定或未锚定以及斜杠后缀或非斜杠后缀,我们可以描述gitignore规则如何为它们工作:

  • 当且仅当该部分路径名表示目录/文件夹时,任何带斜杠的名称均与该部分路径名匹配。因此,vendor/目录(或文件夹)vendor匹配,但与名称成分为vendor文件不匹配。如果没有斜杠后缀,则名称与 文件和目录都匹配。

  • 任何锚定的名称仅与从找到.gitignore文件的同一目录开始的文件名的组成部分匹配。。也就是说,在锚定为vendor的情况下,我们将在 this 目录中排除vendor,但不排除a/vendorb/vendor等。给定无固定的供应商,我们将在此目录 vendor a/vendor中排除b/vendor,依此类推。

这就是为什么在您的static/前面添加vendor/会改变其行为的原因:它从未锚定变为锚定,从而开始像/static/vendor/一样工作(当然会做同样的事情:它有两种锚固方式,但唯一重要的是锚固方式。

在前面添加**/可使(仍然锚定!)字符串static/vendor/匹配a/static/vendorb/static/vendor,依此类推。取消固定**/时,您不需要前面的vendor/

替代

请注意,顺便说一句,您可以从 this vendor/文件(无论在哪里)中完全删除.gitignore条目并创建一个{{1 static/中的}}条目,必要时创建该文件。那将是无锚的,但带有斜杠。它会匹配该目录中的目录vendor/.gitignore或该目录的任何子目录编辑:糟糕,这是倒退的:您需要一个staticvendor/目录中。但是一般原则在这里适用。

(主要或唯一的缺点是,您将在此特定子目录中创建或更改文件-当然,您可能需要在多个子目录中进行操作。)

本文链接:https://www.f2er.com/3141141.html

大家都在问