gitignore文件忽略了错误的目录

时间:2017-08-08 04:34:04

标签: git gitignore

我有一个简单的目录结构:

gitroot/
└── docker/
    └── critical_dependencies/

我想忽略critical_dependencies/目录的全部内容。我的.gitignore文件包含以下条目:

docker/critical_dependencies/* 

它似乎没有忽略该目录中的任何文件夹。请求.gitignore文件忽略子目录中的所有内容的正确方法是什么?

3 个答案:

答案 0 :(得分:1)

只需将此添加到.gitgnore docker / critical_dependencies /它应该工作,因为已经添加的文件使用git rm -r删除它们--cached docker / critical_dependencies / *

答案 1 :(得分:1)

首先,确保.gitignore文件位于工作目录中。如果将它放在.git(存储库)目录中,它就不起作用。

cd到.gitignore文件所在的目录。或者您通常的项目根目录。从此处检查关键依赖关系文件夹的路径。

然后执行cat .gitignore并将您的确切路径添加到文件中,如下所示:

docker/critical_dependencies/

它应该有用。

Git不显示空目录 - 因此,如果您需要解决方法,请查看第二个答案here

发现类似的问题here

希望这有帮助。

答案 2 :(得分:0)

git rm --cached对您有任何好处之前,您必须删除(使用.gitignore)任何现有的跟踪文件。之后,您可以创建一个文件:

gitroot/docker/critical_dependencies/.gitignore

包含两行:

*
!.gitignore
按顺序

,然后添加并提交它。请参阅下文了解原因。

(我假设当你说gitroot时你意味着你有一个名为gitroot的目录。如果没有,请从这条路径中取出gitroot/。)

描述

在使用.gitignore文件做任何合理的事情之前,您需要了解一些关于Git的事情。

首先,Git根本没有跟踪目录。 Git只存储文件。如果文件的路径名为d1/d2/file.ext,则Git将创建目录d1d1/d2(如果必须),以便file.ext可以住在他们里面;但是Git完全没有记得关于 d1d1/d2,只知道他们必须 那么file.ext可以< em> live 那里。

其次,Git中的文件是跟踪,当且仅当它位于目前的 中时。但是你不能索引 - 至少不是普通的命令。如果您想立即查看索引中的内容,请使用git ls-files(使用--stage查看更多信息)。请注意,git ls-files从您当前的目录开始,无论是什么,所以最好是在您当时关心的顶级目录中(例如,项目的根目录一切)。但是这个命令通常不是很有用:比较索引中的内容通常更有趣。当你遇到一个顽固,棘手的案件并且希望在索引中看到真正的时,它主要是有用的。

(旁注:索引包含将在下一步提交中的文件。当您运行{{1}时你告诉Git从工作树中复制该文件,在那里你可以编辑它并使用它,索引。如果之前索引中有副本,则更新副本。如果没有,这会在索引中添加一个新的。在任何一种情况下, next 提交现在将具有该文件的最新版本。运行git add d1/d2/file.ext后,索引仍然拥有所有这些文件,其格式与运行git commit时的格式相同。因此,根据定义,所有这些文件都会被跟踪:当且仅当文件被跟踪时才跟踪文件在索引中。

现在,我们可以看看git commit真正做了什么。 它不会使Git忽略文件。它的作用是让Git 停止抱怨文件,并且避免将这些文件复制到索引中尚未出现在索引中。

换句话说,如果跟踪文件,则无法忽略。

如果文件未跟踪,则不在索引中。如果该未跟踪文件标记为&#34;忽略&#34;,Git不会抱怨并且不会将添加到索引这是.gitignore所涉及的大部分内容:.gitignore中列出的未跟踪文件未被跟踪被忽略,但跟踪的文件不受影响

最后,我们给出了答案:

  

我想忽略.gitignore目录的全部内容。

在这种情况下,您可以在目录中创建名为critical_dependencies 的文件:

.gitignore

此文件的内容可以是:

gitroot/docker/critical_dependencies/.gitignore

(一行由一个星号组成),但由于以下几个原因,这有点好一点:

*

这说&#34;忽略此目录中的所有内容...但是等一下,不要忽略* !.gitignore ;忽略所有 .gitignore&#34;。

接下来,您需要确保索引中的文件 。这样,它就会出现在 next 提交中。我们刚才添加的内容也是正确的内容,所以让我们.gitignore

git add

现在你知道为什么我们说'不要忽视git add gitroot/docker/critical_dependencies/.gitignore &#34;我们希望 .gitignore将它复制到索引中虽然它还没有,但我们告诉git add这个特定的文件不是我们想要保留在索引之外。

一旦它实际上索引中 - 即使没有git add行,我们也可以强制这种情况发生 - 如果内容说要忽略它就不会有问题它,因为它将在那时被跟踪并且其内容对它没有影响。但这使得第一次将引入索引变得容易。

此外,这意味着如果我们克隆存储库并检查这个特定的提交,Git必须编写该文件:

!.gitignore

某处,为此,Git必须创建目录。所以你创建了你的目录。

不幸的是,我们需要确保该目录中的没有其他文件或该目录的任何子目录都在索引中。因此,现在我们需要慢慢地,gitroot/docker/critical_dependencies/.gitignore git rm当您在该目录中时git ls-files列出的每个此类文件。

但是等等! ,您可能会反对, 不会从工作树中删除文件吗?

是的,它会的。糟透了,不是吗? : - )

您现在可以使用git rm --cached来避免这种情况。这告诉Git在不触及工作树的情况下从索引中删除它们。但是,如果你曾git checkout提交 所有这些文件,它们将进入你的索引。您的索引包含您签出的任何内容,因此它将从此旧提交开始,在新分支上进入 next 提交。然后,您可以git checkout稍后提交拥有这些文件,Git将删除它们......其中删除它们。

这就是为什么你要小心永远不要添加你不应该添加的文件。完成后,如果您查看这些提交,则会在存储库中永久保存一些提交,以便跟踪这些文件。从一个这样的提交转到另一个没有文件的提交,它们将再次变得无法跟踪,但是他们会这样做,因为Git会从索引中删除它们工作树。

最后的捷径(虽然它对未来的工作同样痛苦)

我们可以切换创建和添加git rm --cached文件的顺序,而不是在每个文件上手动运行.gitignore

$ cd gitroot/docker/critical_dependencies/
$ git rm -r --cached .

然后使用两行.gitignoregit add创建git commit文件。