Gitignore不能忽略文件夹。

254

在我的项目根目录下有一个foo文件夹。在foo文件夹里面,有一个bar文件夹。我想忽略所有在我的bar文件夹中的所有文件的更改。我已经在我的 gitignore 文件中添加了以下内容:

/foo/bar

检查了文件夹:它存在并且有需要被忽略的文件。 gitignore 已经提交。但是,我有一个文件在 bar 文件夹中进行了修改。当我输入

git status

在我的git bash中,我看到了应该被忽略的文件。可能的原因是什么,如何成功地忽略我的bar文件夹内的所有文件?

请注意,这些文件曾经使用相同的行被忽略,但是我不得不暂时删除那行来提交服务器上的一些内容。提交后,我把这行代码放回了gitignore文件中。虽然这是一段时间以前的事情,但现在我发现这些文件会出现在git status中。我希望能够修改这些被忽略的文件而不会让它们出现在git status中。


2
将来,您无需修改忽略列表以添加某些被忽略的内容。即使文件在您的忽略列表中,git add -f ignored-file 命令也会将其添加到版本控制中。 - Chris
7
看起来该文件实际上已被Git跟踪,可能在某个时候被添加到仓库中。您可以使用 git log foo/bar/file-that-should-be-ignored 查看其历史记录。如果它不应该是仓库的一部分,您应该使用 git rm --cached foo/bar/file-that-should-be-ignored 将其移除,并像下面Reck建议的那样提交更改(虽然我只会针对文件而不是整个文件夹)。这将删除文件并 (a)从Git中删除文件,(b)保留本地副本中的文件,在其他人 fetchpull新的提交时(c)将导致文件被删除。 - Chris
请勿重复提交问题。此问题已经在stackoverflow.com/a/1139797/274502中得到回答。 - cregox
1
可能是忽略已经提交到Git存储库的文件的重复问题。 - cregox
显示剩余5条评论
7个回答

658

我猜测这个文件夹之前已经被提交到git中了?

运行git rm -r --cached <folder>,然后再次检查。


11
这将完全从(当前版本的)代码库中删除该文件夹。OP希望该文件夹仍然存在,但新更改不应被跟踪。 - Gareth
1
我希望远程服务器保留文件的版本。 - Lajos Arpad
25
git update-index --assume-unchanged <folder> 可能是什么意思? (翻译:What does git update-index --assume-unchanged <folder> mean?) - Reck
3
@Lajos,你是否应该修复他的错误,而不是在那里添加这个令人困惑的“编辑”评论? - cregox
3
@Cawas,由于这个网站是关于知识分享的,所以答案是否定的。接受一个包含错误的答案是具有误导性的。那个-r选项是必须的。 - Lajos Arpad
显示剩余12条评论

115

对我而言,被接受的答案只是解决方案的一部分,而不是全部解决方案。也许,我即将发布的其他步骤很明显,但起初我错过了它们。以下是我采取的步骤,以确保我的.gitignore文件忽略我想要忽略的文件夹:

  1. 提交任何需要修复/更改的更改。
  2. 运行此命令:git rm -r --cached .(从git索引中删除所有内容以刷新您的git存储库)
  3. 然后运行此命令:git add .(将所有内容添加回存储库)
  4. 最后,使用git commit -m“。gitignore Fixed”提交这些更改

你可以在这里找到我找到解决方案的文章链接。


3
根据原问题,这不是一个可行的解决方案。@lagos-arpad明确提到了子目录而不是整个项目。你的解决方案会删除git仓库根目录下的所有内容,这不是解决此问题的推荐方法。 - justinhartman
即使只是一个子目录,这个解决方案对我来说很有效,因为我只处理了一个文件。您能否详细说明为什么不推荐使用? - sikanderBabwani
1
你所处理的内容并不重要。这不是问题的答案,而且正如其他答案所指出的那样,可能会带来危险。这将删除远程仓库中您不一定想要的内容。 - RichieHH
这正好按照我的需求工作。奇怪的是,最新的提交显示了之前的提交,而不是“.gitignore Fixed”!但是,我的问题已经解决了。 - Nithin Sai
1
@justinhartman,您可以将文件夹名称指定为用<folder>替换的点. - Kritish Bhattarai
完美运作! - iDesireJustice

23

问题已解决

我曾经执行过命令echo node_modules >> .gitignore,但它并没有起作用。

由于Windows终端以UCS-2 LE BOM格式保存文件,因此Git似乎无法接受该格式的文件。

我使用Notepad打开了该文件,并以UTF-8编码保存。

notepad save utf-8 encoding

现在可以正常工作了。

我认为他们需要修复这个问题,因为echo "filetoignore" >> .gitignore实际上似乎是一个方便的操作。


2
当我将Powershell的输出重定向到gitignore时,我遇到了同样的问题。例如,直到我将编码更改为UTF-8,Get-ChildItem . -Filter *.csv -recurse >> .gitignore才能正常工作。是的,我知道可以通过.gitignore直接忽略所有csv文件:这只是一个例子;) - and0r

18

我遇到了这个问题,后来发现 Git 实际上正确地忽略了文件/文件夹,但我的代码编辑器(Visual Studio Code)有缺陷,在 UI 边栏中没有正确地“使它们变灰”。我重新启动了 VSCode,然后它们像预期的那样变成了灰色。


同样的情况:VS Code v1.30.2(用户) - xinthose
对我来说也是一样的。非常感谢您提供的解决方案!我一直在想为什么我的.gitignore文件不起作用,直到我尝试重新启动VS Code。我使用的是Visual Studio Code v1.44.2版本。 - Fritz Lim

11

作为对已接受答案的补充

git rm -r --cached /foo/bar/
git status

当我这样做时,终端会显示一堆该目录中要删除的文件的rm命令。因此,为了防止可能对远程造成不必要影响的另一个提交,我执行了以下操作:

git reset HEAD *
git status

之后,它表示没有需要提交的内容,当我在/foo/bar/内修改文件并执行git status时,仍然显示nothing to commit


2
这只是让我回到了起点(问题所在)。 - Shonubi Korede

6

我使用PowerShell创建了.gitignore文件,代码是echo "build" > .gitignore。这样创建的文件采用UTF-16LE编码。Git不能识别该文件的内容,并继续显示build文件夹未跟踪。我删除了该文件,并在Geany文本编辑器中重新创建(采用UTF-8编码),现在Git会忽略build文件夹。短暂的搜索表明Git不喜欢UTF-16编码。


我终于想通了,然后在看到你的答案之前。接着我滚动浏览了其余的问题,期望看到有人评论/回答这种情况:P - joshmcode

1

大多数情况下,这是一个编码问题。因此,您可以删除 .gitignore 文件并重新创建它。

编辑:

证明:

  1. 创建一个名为 test-gitignore 的文件夹
  2. 进入该文件夹并初始化 git 仓库:git init
  3. 创建一个 .env 文件并添加任何内容
  4. 现在您想要忽略那个 .env 文件,所以您应该做的是在相同目录中创建一个 .gitignore 文件,其内容为:.env。但是创建 .gitignore 文件的方式很重要。如果您使用 PowerShell 的 echo 命令创建它:“echo >> .gitignore”,则您的 .env 将不会被忽略,因为 git 需要一个 utf-8 编码的 .gitignore 文件。 在 PowerShell 中,用于将文本写入文件的 echo 命令的默认编码是 Unicode(UTF-16LE)。这意味着当您使用 echo 命令使用 >> 将文本附加到文件时,文本将以 UTF-16LE 编码写入。

这就是为什么使用 vscode 或任何工具确保 utf-8 编码来创建文件非常重要的原因。


不,这个问题是由于文件夹内的一些文件已经有版本控制引起的。 - Lajos Arpad
那是另一回事。但如果您没有对文件夹中的任何这些文件进行版本控制,那么很可能就是答案了(我也曾经历过这种情况)。 - Alan Deep
这是一个有趣的观点。在这个问题的背景下,那个文件夹里肯定已经有了一个版本化的文件。但如果您提供了上述现象的复制步骤,我仍然很乐意为您的答案点赞。 - Lajos Arpad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接