.gitignore被Git忽略了

问题描述 投票:1297回答:26

我的.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/不要出现在未跟踪的文件列表中。

我应该从哪里开始寻找解决方法呢?

git gitignore
26个回答
2711
投票

即使你到目前为止还没有跟踪过这些文件,即使你把它们添加到.gitignore,Git似乎也能“知道”它们。

注意:首先提交您当前的更改,否则您将丢失它们。

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

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

12
投票

另请查看您放置.gitignore的目录。

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

./myproject/.gitignore

不在

./myproject/.git/.gitignore

7
投票

可能会发生.gitignore的另一个问题,特别是对于Windows用户。当你命名.gitignore(例如unity.gitignore)时,Git不喜欢它。

你总是想把它命名为.gitignore,或者在Windows上命名为.gitignore.,因为Windows认为你试图在没有文件名的情况下重命名它。


6
投票

我刚遇到这个问题。我的.gitignore文件中的内容继续出现在未跟踪文件列表中。

我用它来创建忽略文件:

echo "node_modules" > .gitignore

事实证明,双引号对我来说是个问题。我删除了忽略文件,然后再次使用该命令没有引号,它按预期工作。我不需要搞乱文件编码。我在使用Cmder的Windows 10机器上。

例:

echo node_modules > .gitignore

5
投票

对我来说,以前的答案都没有奏效。我不得不将.gitignore文本复制到找到的exclude.txt文件中

<Your-project-folder>\.git\info

完成后,刷新更改并删除所有未跟踪的文件。像往常一样。


5
投票

我的问题是(如OP所建议的)一个损坏的.gitignore文件。在其他一切都失败之前,我不相信它是并且忽略了这种可能性。腐败没有出现在vi中,但文件的开头有两个字节导致.gitignore文件被忽略。对我来说,这些只在我输入cat .gitignore时出现,显示:

��# Built application files
*.apk
*.ap_

# ...

我不知道这些是如何结束的,但重新创建文件解决了问题。对损坏文件的十六进制分析显示如下:

user@dev ~/project/myproject $ xxd -b .gitignore
00000000: 11111111 11111110 00100011 00000000 00100000 00000000  ..#. .
00000006: 01000010 00000000 01110101 00000000 01101001 00000000  B.u.i.

5
投票

我有这个问题,包含这一行的.gitignore文件:

lib/ext/

我刚刚意识到,实际上,这个目录是指向其他地方的文件夹的符号链接:

ls -la lib/ext/
lrwxr-xr-x 1 roipoussiere users 47 Feb  6 14:16 lib/ext -> /home/roipoussiere/real/path/to/the/lib

在线lib/ext/,Git实际上寻找一个文件夹,但符号链接是一个文件,所以我的lib文件夹不会被忽略。

我通过在我的.gitignore文件中用lib/ext/替换lib/ext来解决这个问题。


5
投票

专门针对Windows用户:如果您有未跟踪的文件并清除/删除缓存的文件不起作用。尝试打开PowerShell并将.gitignore文件转换为UTF-8编码:

  1. $Myfile = Get-Content .\.gitignore
  2. $Myfile = | Out-File -Encoding "UTF8" .gitignore

您只需要执行一次编码该目录的.gitignore文件,并且由于该文件然后被正确编码,因此无论何时编辑该文件它都应该有效。我相信这是因为GitHub不会为.gitignore文件读取非UTF-8编码。据我所知,Windows尚未解决此问题。它不是太大的交易,只是在它不工作时调试很痛苦。


4
投票

我有同样的问题。我认为这个问题是CR与CR + LF的差异。我使用CMD(在Windows 7上)和以下命令在我的.gitignore中存储了一些东西:

坏:

echo "file_to_be_ignored.py" >> .gitignore<br>
echo "*~" >> .gitignore

等等。

问题是这个命令没有为Git放置正确的行结束标记来识别换行符(当Git期望另一行时,CR或CR + LF)。我通过手动替换Vim中的每个换行符来解决问题(Vim救援!)并且它工作得很好。

尝试在Notepad ++或Vim中编辑.gitignore(理想情况下)。即使文件看起来格式正确,也请尝试替换换行符。我知道这听起来很奇怪,但它对我有用。 :d


3
投票

好的,所以在我的情况下,接受的解决方案不起作用,这里描述的是有效的:

Is Visual Studio 2013 ignoring your .gitignore file?

简而言之:

  • 关闭Visual Studio。
  • 导航到.git文件夹
  • 删除ms-persist.xml
  • 重新启动Visual Studio

2
投票

还要注意一件事:您是否使用正确的行结尾保存.gitignore文件?

视窗:

如果您在Windows上使用它,是否使用Windows行结尾保存它?并非所有程序都默认执行此操作; Notepad ++和许多PHP编辑器默认使用Linux行结尾,因此文件将与服务器兼容。检查此问题的一种简单方法是在Windows记事本中打开该文件。如果所有内容都显示在一行上,则该文件使用Linux行结尾保存。

Linux的:

如果您在Linux环境中使用该文件时遇到问题,请在Emacs或nano等编辑器中打开该文件。如果您看到任何不可打印的字符,则该文件已使用Windows行结尾保存。


279
投票

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

  • 可能存在可能干扰您本地文件的全局.gitignore文件
  • 在.gitignore文件中添加内容时,请尝试以下操作: git add [uncommitted changes you want to keep] && git commit git rm -r --cached . git add . git commit -m "fixed untracked files"
  • 如果从.gitignore文件中删除某些内容,并且上述步骤不起作用,请尝试以下操作: git add -f [files you want to track again] git commit -m "Refresh removing files from .gitignore file." // For example, if you want the .java type file to be tracked again, // The command should be: // git add -f *.java

1
投票

只需通过以下命令删除先前在Git中提交的文件夹或文件即可。然后gitignore文件将反映正确的文件。

    git rm -r -f "folder or files insides"

1
投票

其他答案未涉及的一个棘手的问题是,如果你有内联注释,.gitignore文件将不起作用,如下所示:

foo/bar # The bar file contains sensitive data so we don't want to make this public

所以,如果你有这样的评论,请改变它们:

# The bar file contains sensitive data so we don't want to make this public
foo/bar

1
投票

您也可以使用.gitignore命令编辑sudo文件。我遇到了同样的问题,在执行命令时:git status,我仍然可以看到“应该被忽略”的文件。

nano .gitignore而不是sudo nano .gitignore编辑后,我可以看到正确的反射。


1
投票

我在Windows中使用PowerShell中的echo "..." > .gitignore创建了.gitignore,因为它不允许我在Windows资源管理器中创建它。

在我的情况下的问题是创建的文件的编码,并在我将其更改为ANSI后解决了问题。


0
投票

如果您是Notepad++用户,请尝试执行以下操作:

使用Notepad ++打开.gitignore文件并执行以下操作:

菜单编辑→EOL转换→Windows格式→保存。

再次尝试使用git status,看看它是否适合你。

我已经发布了类似问题here的答案。


0
投票

对我来说这是另一个问题。我的.gitignore文件设置为忽略除了我告诉它不要忽略的东西之外的所有内容。像这样:

/*
!/content/

现在这显然意味着我也告诉Git忽略.gitignore文件本身。只要我没有跟踪.gitignore文件,这不是问题。但是在某些时候我提交了.gitignore文件。这导致.gitignore文件被正确忽略。

所以再添加一行修复它:

/*
!/content/
!.gitignore

0
投票

另一个可能的原因 - Git客户端同时运行的几个实例。例如,“git shell”+“GitHub Desktop”等。


这发生在我身上。我使用“GitHub Desktop”作为主要客户端,它忽略了一些新的.gitignore设置:提交后提交:

  1. 你承诺了什么。
  2. 接下来,提交:它忽略.gitignore设置。提交包括.gitignore中提到的大量临时文件。
  3. 清除Git缓存;检查.gitignore是否为UTF-8;删除文件→提交→移回文件;跳过一个提交 - 没有任何帮助。

原因:Visual Studio代码编辑器在后台运行,具有相同的打开的存储库。 Visual Studio Code具有内置的Git控件,这会产生一些冲突。

解决方案:仔细检查多个隐藏的Git客户端,一次只使用一个Git客户端,尤其是在清除Git缓存时。


162
投票

固定。好的,我在Windows上的记事本中创建了.gitignore文件,但它无法正常工作。当我在Linux上查看.gitignore文件时,它看起来像是有组织的乱码 - 也许Notepad写出了Unicode而不是ASCII或8位。

所以我在我的Linux机器上重写了这个文件,当我把它拉回到Windows时它运行正常!欢呼!


95
投票

在不向项目添加另一个提交的情况下,一行就足以使.gitignore工作,因为它应该:

git rm -r --cached debug.log nbproject

这将从存储库中删除它们,但仍然保留它们。用简单的英语,它会删除与它们相关的任何变更历史记录,也不会在将来的任何提交中跟踪它们的变化。你可能会找到更好的解释here


37
投票

此问题的另一个原因是语句前的空格或制表符:

例:

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

正如下面的评论所指出的,尾随空格也是一个问题:

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

30
投票

我注意到.gitignore的编码有效 - 如果文件是Unicode,它被忽略,如果是ASCII,则不是。

处理:

  1. 验证状态:PS> git status
  2. Get-FileEncoding创建一个函数
  3. 测试.gitignore的编码:PS> Get-FileEncoding .gitignore
  4. Change the encoding到ASCII:PS> Set-Content .gitignore -Encoding Ascii -Value (Get-Content .gitignore)
  5. 确认:PS> git status

29
投票

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

我有更好的结果:

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

请注意,状态现在不应包含任何已修改的文件。


15
投票

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

echo .idea/ >> .gitignore
git init

如果您每天开发,我建议您将习惯性忽略的文件添加到~/.gitignore_global文件中。这样,git就会知道你的文件(意思是“你的用户”,因为它是你主目录中的文件)通常会被忽略。


14
投票

在我的情况下,这是因为文件已经存在于存储库中,我试图忽略它。

这些是我为解决问题所做的事情:

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

到那时,我对这些文件所做的任何更改都会被忽略。

我认为您不能忽略存储库中已存在的文件。

© www.soinside.com 2019 - 2024. All rights reserved.