“.gitignore”被Git忽略。

1736

我的 .gitignore 文件似乎被 Git 忽略了 - .gitignore 文件可能会损坏吗?Git 期望哪种文件格式、语言环境或文化?

我的 .gitignore 文件:

# This is a comment
debug.log
nbproject/

git status的输出结果:

# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       debug.log
#       nbproject/
nothing added to commit but untracked files present (use "git add" to track)

我希望 debug.lognbproject/ 不要出现在未跟踪文件列表中。

我应该从哪里开始解决这个问题?


96
请确保你的.gitignore文件使用ANSIUTF-8编码。如果它使用像Unicode BOM这样的其他编码方式,Git就可能无法读取该文件。 - ADTC
14
这正是我电脑(Windows)上遇到的问题。我在 PowerShell 中使用了 echo "file" > .gitignore 命令,但是生成的文件采用 UCS-2 编码!请 @ADTC 帮忙解决。 - MarioDS
12
这句话的意思是:从 Git 版本控制中删除 debug.log 和 nbproject/ 这两个文件。注意,这个命令只会删除已经添加到 Git 版本控制中的文件,不会删除实际的物理文件。 - Gayan Weerakutti
8
为什么这里的第一个评论不是答案,我无法理解。 - RedOrav
2
@MattParkins 哦,我现在明白了,仍然让我惊讶的是这样一个简单而直接的答案被埋在评论中,或者实际上被接受的答案在那里。谢谢! - RedOrav
显示剩余8条评论
38个回答

3514

即使你之前没有跟踪这些文件,Git 似乎仍然能够“知道”它们,即使在你将它们添加到 .gitignore 后。

警告:首先提交或存储您当前的更改,否则您将会失去它们。

然后从 Git 存储库的顶层文件夹运行以下命令:

git rm -r --cached .
git add .
git commit -m "fixed untracked files"

8
当我尝试使用 GitHub for Windows 中的“工具->在此处打开 shell”,并在 PowerShell 中使用 "git rm -r --cached" 命令时,出现了 "usage: git rm [options] [--] <file>..." 的提示。如果有关系的话,我正在使用 Git。请帮我将这句话翻译成中文。 - Soonts
66
在Windows系统下,执行以下两个命令可以实现对当前目录下所有文件和子目录的版本控制操作:
  1. git rm . -r --cached:将当前目录下所有文件和子目录从Git版本控制中删除(不会删除物理文件),但保留在本地磁盘中。
  2. git add .:将当前目录下所有文件和子目录添加到Git版本控制中。
- Beachhouse
98
请注意在执行任何更改之前提交所有更改,否则您将失去对所有已更改文件的控制! - Cosmin
49
前三个评论者似乎忽略了结尾的点号。这表示每个文件。“git -rm -r --cached .” <-- 注意点号。 - Christophe De Troyer
20
如果您不想提交更改,可以使用一种解决方法:将更改放入“git stash”中。执行上述命令,然后运行“git stash pop”。 - Ivan Voroshilin
显示剩余26条评论

362

如果Git似乎没有注意到您对.gitignore文件所做的更改,您可能需要检查以下几点:

  • 可能存在一个全局的.gitignore文件,它可能会干扰你的本地文件

  • 当你将某些内容添加到.gitignore文件中时,请尝试以下操作:

      git add [未提交的更改] && git commit
      git rm -r --cached .
      git add .
      git commit -m "fixed untracked files"
    
  • 如果你从.gitignore文件中删除了某些内容,并且上述步骤可能不起作用,如果你发现上述步骤不起作用,请尝试以下操作

      git add -f [要重新跟踪的文件]
      git commit -m "Refresh removing files from .gitignore file."
    
      // 例如,如果您想再次跟踪.java类型的文件,
      // 命令应该是:
      //     git add -f *.java
    

3
你可以编辑@AlinHuruba的回答,加上你的第三步吗? - Benj
@Benj 谢谢你的建议,我没有找到AlinHuruba的答案,我不知道有什么区别,请直接告诉我。 - ifeegoo
2
第三步是我需要的。大多数答案只是告诉我们如何删除要取消跟踪的文件。感谢提供相反的观点。 - Yeung
希望这能对你有所帮助! - ifeegoo
我很高兴这能帮到你! - ifeegoo
显示剩余3条评论

235

修复。好的,我在Windows上用记事本创建了.gitignore文件,但它没有起作用。当我在Linux上查看.gitignore文件时,它看起来像是有组织的乱码——也许记事本写出了Unicode而不是ASCII或任何8位字符集。

因此,我在我的Linux上重写了这个文件,当我把它拉回到Windows时,它就能正常工作了!万岁!


86
在记事本中,只需在“另存为”对话框中选择编码为“ANSI”。或者更好的方法是使用适当的文本编辑器 - 毕竟你是一个程序员 :) ... 我可以推荐“程序员的记事本”,其他人则更喜欢Notepad ++,还有成百上千个其他的选择。 - 0xC0000022L
2
嘿嘿,是的,我应该在NetBeans(当时我正在使用它)、Eclipse或Visual Studio中创建它。我只是从命令行调用它,认为这不会有任何影响。 - Matt Parkins
8
我的问题类似——我的 .gitignore 文件使用的是带 BOM 的 UTF8 编码。将其另存为不带 BOM 的 UTF8 编码后,它就神奇地开始起作用了。 - Phil
15
这也是我的问题。我创建了.gitignore文件,使用“echo dirName > .gitignore”命令,因为Windows让以“.”开头的文件创建起来很麻烦。以这种方式创建的文件编码对于git来说无法读取,它会将其解释为二进制文件。在Notepad++中单击“编码-->UTF-8”,保存更改,问题解决。 - Laura
4
在PowerShell中,我和@Laura遇到了相同的问题 - 文件默认保存为UTF16格式。 - mrówa
显示剩余13条评论

126

不需要在您的项目中添加另一个提交,只需一行代码就足以使 .gitignore 正常工作:

在不改变您的项目内容的情况下,将忽略文件名写入 .gitignore 文件即可。

git rm -r --cached debug.log nbproject

这将从存储库中删除它们,但仍保留它们的实体。简单来说,它会删除与它们相关的任何更改历史记录,并且还将不跟踪它们在任何未来提交中的更改。您可以在此处找到更好的解释。


1
完全按照我的意愿工作 - 我只有一个文件没有被正确跟踪。我将其内容保存在记事本中,然后执行以下操作: git rm -r --cached someFile.php 它完美地运行了 :) - ShayLivyatan
@FMFF 这将从仓库中删除它们,但仍然保留它们的物理存在。简单来说,它会删除与它们相关的任何更改历史记录,并且也不会跟踪它们在任何未来提交中的更改。 您可以在此处找到更好的解释:https://dev59.com/XVoU5IYBdhLWcg3wnX5O - H Aßdøµ
1
我收到了一个“致命错误:路径规范'debug.log'未匹配任何文件”的错误信息。 - Michael
@HAßdøµ “简单来说,它会删除与它们相关的任何更改历史记录,并且也不会在将来的提交中跟踪它们的更改。” 这个通俗易懂的解释正是我所需要的!Nandri - Sumax

52

这个问题的另一个原因是在语句之前有空格或制表符:

例如:

# Be aware of the following:
 notWorkingIgnore.*
workingIgnore.*

正如下面的评论所指出的,末尾的空格也可能会导致问题:

# Be aware of the following:
notWorkingIgnore.* #<-Space
workingIgnore.*#<-Nospace

12
一个尾随空格是我的问题,甚至更加棘手难以发现。 - amr
5
也存在尾部空格问题。 - Trefex
5
好的,我会尽力进行翻译。以下是需要翻译的内容:是的,我的情况也一样。我以为我可以在文件模式后面写注释:“*.txt #TeX文件”,但是git理解为:“忽略所有扩展名为txt 的文件”。 - Adam Libuša
4
我找了两天才找到这个获得15个赞的答案,真是费了好大劲。这个回答值得更多的赞。 - fordcars
3
你刚刚解决了我几个月来一直存在的问题……谢谢! - Arkellys
1
很棒的答案:在我的情况下,前导空格导致.gitignore被忽略。谢谢。 - Hilton Fernandes

46

我注意到.gitignore文件的编码会产生影响——如果文件是Unicode编码,它就会被忽略,如果是ASCII编码,它就不会被忽略。

步骤:

  1. 验证状态:PS> git status
  2. 创建一个函数来获取文件编码
  3. 测试.gitignore文件的编码:PS> Get-FileEncoding .gitignore
  4. 更改编码为ASCII编码:PS> Set-Content .gitignore -Encoding Ascii -Value (Get-Content .gitignore)
  5. 确认:PS> git status

6
非常感谢这个。我正在使用PowerShell在我的系统上创建.gitignore文件,通过“touch .gitignore”和“echo“.db”>>.gitignore”的方式。我发现“echo“.db”>>.gitignore”会将文件编码设置为UCS-2 LE-BOM,将其快速转换为ASCII后,gitignore开始工作了。 - B-Rad
3
你可以尝试跳过第2步和第3步。 - Aniket Bhansali

37

与其他解决方案一样,首先进行提交并注意您将会失去任何未提交的更改。

我用这个方法得到了更好的结果:

git rm -r --cached .
git reset HEAD --hard
git status

请注意,当前状态现在不应该有任何修改过的文件。


3
这一个对我没有用,但ifeegoo的回答有用。 - fanny
可爱的朱比利,罗德斯。 - MoonKnight

24

在我的情况下,由于这些文件已经存在于存储库中并且我正在尝试忽略它们。

以下是我解决问题所做的事情:

  • 将文件复制到临时文件夹中
  • 从项目文件夹中删除它们。
  • 提交更改以将这些文件从存储库中移除
  • 重新将这些文件添加回我的项目文件夹中

此时,我对这些文件进行的任何更改都会被忽略。

我认为您无法忽略已经存在于存储库中的文件。


在我的情况下,它们已经被暂存了。只有在按照您建议的操作后,尝试提交并看到警告说它们已经被暂存并被删除后,我才意识到这是问题所在。 - dudeNumber4

20

这里所有的答案实际上都是解决办法。你需要在运行git init之前创建.gitignore文件。否则,git将永远不会知道您需要忽略这些文件,因为它们已经被跟踪。

echo .idea/ >> .gitignore
git init
如果你每天都在开发,我建议你将经常被忽略的文件添加到~/.gitignore_global文件中。这样,git就已经知道你(指"你的用户",因为它是你家目录中的文件)通常会忽略哪些文件。

谢天谢地...终于有一个适合我的解决方案了。 - Dbl
~/.gitignore_global 是一个可配置的名称。首先运行 git config --global core.excludesfile 查看是否已经定义了文件。如果没有,请运行 git config --global core.excludesfile ~/.gitignore_global - Noumenon
如果您没有先创建.gitignore,则可以使用一个解决方法:重命名被跟踪的文件。.gitignore将被应用,就好像它是新文件一样。 - Noumenon

17

还应检查您放置 .gitignore目录

它应该在您的项目根目录中:

./myproject/.gitignore

不在

./myproject/.git/.gitignore

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