.gitignore被Git忽略


1508

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

我应该从哪里着手解决此问题?


56
确保您的.gitignore文件使用ANSIUTF-8编码。如果它使用Unicode BOM,则Git可能无法读取文件。
ADTC '17

8
@ADTC这正是我的计算机(Windows)上的问题。我echo "file" > .gitignore在PowerShell 中使用过,文件具有UCS-2编码!
MarioDS '18 -4-5

7
git rm --cached debug.log nbproject/
加安·维拉库蒂

4
为什么这里的第一个评论是不是一个答案超出了我
RedOrav

2
@MattParkins啊,我现在看到了,仍然让我惊讶的是,如此简单而明确的答案被当作评论掩盖了,或者实际接受的答案就在那儿。谢谢!
RedOrav

Answers:


3114

即使到目前为止您尚未跟踪文件,即使将它们添加到后,Git似乎也能够“知道”它们.gitignore

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

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

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

8
当我尝试“ git rm -r --cached”时,我得到了“用法:git rm [选项] [-] <文件> ...”。如果重要的话,在Windows的GitHub中单击“工具->在此处打开外壳”后,我将在PowerShell中使用Git。
即将

61
在Windows上:git rm。-r --cached git add。
海滨别墅

90
请务必先提交所有更改,否则您将失去对所有更改文件的控制!
Cosmin 2013年

45
前3位评论者似乎最终都错过了句点。这意味着每个文件。“ git -rm -r --cached”。<-注意点。
Christophe De Troyer

18
如果您不想提交,一种解决方法是将所做的更改放到架子上:“ git stash”。运行以上命令。并运行“ git stash pop”
Ivan Voroshilin 2015年

335

如果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
    

3
也许您可以编辑@AlinHuruba的答案来添加步骤3?

@Benj谢谢您的建议,我没有找到AlinHuruba的答案,我不知道有什么区别,所以请直接告诉我。
ifeegoo

2
步骤3是我需要的。大多数答案只是告诉您如何删除我们要取消跟踪的文件。谢谢您提出相反的观点。

希望这对您有所帮助!
ifeegoo

7
git rm -r --cached .为我工作
杰森

197

固定。好的,我在Windows的记事本中创建了.gitignore文件,但该文件无法正常工作。当我在Linux上查看.gitignore文件时,它看起来像是乱七八糟的东西-也许记事本写出了Unicode而不是ASCII或任何8位。

因此,我将文件重写了Linux上的文件,当我将其拉回到Windows时,它运行良好!欢呼!


77
在记事本中,只需在“另存为”对话框中选择编码“ ANSI”。或者更好的选择一个合适的文本编辑器-毕竟您是一名程序员:) ...我可以推荐“程序员的记事本”,其他人更喜欢Notepad ++,实际上还有数百本。
0xC0000022L 2012年

1
嘿,是的,我应该在netbeans(我当时使用的),eclipse或visual studio中创建它。我只是从命令行中调用它,认为这不会有所作为。
马特·帕金斯

8
我的问题是类似的-我的.gitignore使用带有BOM的 UTF8 。只需将其另存为UTF8,而不使用BOM表,它就会神奇地开始工作。
Phil

13
这也是我的问题。我已经使用“ echo dirName> .gitignore”创建了.gitignore文件,因为Windows使创建以“。”开头的文件非常麻烦。git无法读取以这种方式创建的文件的编码,而是将其解释为二进制文件。单击记事​​本++中的“编码-> UTF-8”,保存,完成。
劳拉

4
在Powershell中出现了与@Laura相同的问题-默认情况下,该文件另存为UTF16。
mrówa

113

在不向项目中添加其他提交的情况下,只需一行就可以完成.gitignore工作,如预期的那样:

git rm -r --cached debug.log nbproject

这会将它们从存储库中删除,但仍然保持物理状态。用简单的英语,它将删除与它们相关的任何更改历史记录,并且在以后的任何提交中都不会跟踪它们的更改。您可能会在这里找到更好的解释。


1
完全按照我的要求工作-我只有1个文件,无法正确跟踪。我将其内容保存在记事本中,然后执行了以下操作:git rm -r --cached someFile.php它像一种魅力:)
ShayLivyatan

@FMFF会将其从存储库中删除,但仍以简明的英文形式保留在物理上,它删除与它们相关的所有更改历史记录,并且在以后的任何提交中都不会跟踪它们的更改。一个更好的解释,你可以在这里找到:stackoverflow.com/questions/37279654/...
^ hAßdøμ

我收到“致命的:pathspec'debug.log'与任何文件都不匹配”
Michael

45

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

例:

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

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

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

11
拖尾的空间是我的问题,甚至很难找到。
amr 2014年

3
也有尾随的空白问题。
Trefex

3
是的,这里也一样。我以为可以在文件模式后写评论:*.txt # Tex files。但是git理解:“忽略扩展名为txt ” 的文件
AdamLibuša2015年

3
我的话说,我花了2天的时间才能找到这个15答案的答案。这值得更多。
fordcars '16

2
您刚刚解决了我几个月来遇到的问题...谢谢!
Arkellys

36

我注意到的编码.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

5
1000感谢。我正在通过Powershell使用touch .gitignoreand echo ".db" >> .gitignore路由在系统上创建.gitignore文件。我发现echo ".db" >> .gitignore"将的文件编码设置为UCS-2 LE-BOM,快速转换为ASCII,并且gitignore开始工作。
B-Rad

2
您可以跳过步骤2和3尝试
Aniket班萨里

32

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

我得到了更好的结果:

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

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


2
这个对我不起作用,但是ifeegoo的答案对了
fanny

21

就我而言,这是因为文件已存在于存储库中,而我正试图忽略它。

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

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

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

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


就我而言,它们已经上演了。只有按照您的建议进行操作,然后再尝试提交并看到已被暂存并已删除它们的警告,我才意识到这是问题所在。
dudeNumber4

19

这里所有的答案实际上都是解决方法。您需要运行之前创建.gitignore文件git init。否则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


9

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

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

您只需要执行一次此操作即可对该目录的.gitignore文件进行编码,并且由于该文件随后进行了正确的编码,因此以后每次编辑该文件时,它都将起作用。我认为这是由于GitHub出现故障而导致的,它不会读取.gitignore文件的非UTF-8编码。据我所知,Windows尚未解决此问题。这没什么大不了的,只是在不工作时进行调试很麻烦。


8

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

您将总是要.gitignore在Windows .gitignore.上命名它,因为Windows认为您试图重命名它而没有文件名。


7

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

我正在使用它来创建忽略文件:

echo "node_modules" > .gitignore

事实证明,双引号引起了我的问题。我删除了忽略文件,然后再次使用了不带引号的命令,它按预期工作。我不需要弄乱文件编码。我在使用Cmder的Windows 10计算机上。

例:

echo node_modules > .gitignore

奇怪的是,此echo语句解决了我在本地遇到的一个问题,该错误是我意外删除然后重新创建的忽略文件显示为可提交的,未跟踪的文件。由于某种原因,即使这并没有更改我的忽略文件,也解决了我的问题。
帕特里克

6

对我来说,以前的答案都无效。我必须将.gitignore文本复制到位于以下位置的exclude.txt文件中

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

完成后,刷新您的更改,所有未跟踪的文件都消失了。照常提交。


6

我的问题是(如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.

2
看起来像是UTF-8编码文件中的UTF-16字节顺序标记。en.wikipedia.org/wiki/Byte_order_mark
jsageryd

6

我遇到了这个问题,.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不会忽略我的文件夹。

lib/ext/通过lib/ext在.gitignore文件中替换为来解决此问题。


5

我有同样的问题。我认为问题是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

还需要注意的一件事:您是否在保存带有正确行尾的.gitignore文件?

视窗:

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

Linux:

如果您在Linux环境中无法正常使用文件,请在诸如Emacs或nano的编辑器中打开文件。如果看到任何不可打印的字符,则该文件以Windows行尾保存。


3

另一个可能的原因几个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缓存时。


3

已经有一些很好的答案,但是我的情况很单调。我在Win10上编辑了已安装的PLM(产品生命周期管理)软件的源代码,然后决定:“我可能应该把它当作git存储库。”

因此,缓存选项将直接对我不起作用。为可能在完成许多初始工作之后又添加了源代码控制但又.gitignore无法正常工作的其他人发布信息,您可能会害怕失去很多工作,因此git rm --cached不适合您。

重要!这真的是因为我将git添加到一个“项目”中为时已晚,该项目太大,似乎忽略了我的.gitignore。我从来没有承诺。我可以摆脱这个:)

首先,我只是做了:

rm -rf .git
rm -rf .gitignore

然后,我必须有一张自己的照片。同样,这是我进行了更改的安装产品。对于纯主分支的第一次提交为时已晚。因此,我需要列出自从安装该程序以来通过添加> changed.log以下任何一项内容而更改的内容:

电源外壳

# Get files modified since date.
Get-ChildItem -Path path\to\installed\software\ -Recurse -File | Where-Object -FilterScript {($_.LastWriteTime -gt '2020-02-25')} | Select-Object FullName

重击

# Get files modified in the last 10 days...
find ./ -type f -mtime -10

现在,我列出了过去十天中发生的更改(除了说是,我对自己做了这件事之外,这里不介绍最佳做法)。

重新开始,现在:

git init .
# Create and edit .gitignore

我必须将更改后的列表与不断增长的.gitignore进行比较,并git status在改进时运行它,但是我随即会读入对.gitignore的编辑。

最后,我列出了所需的更改!在我的案例中,它是样板文件-一些主题工作以及针对该软件运行开发系统的特定服务器XML配置,我希望将其放入一个回购中,以供其他开发人员使用并为其做出贡献...这将是我们的主分支,因此致力于,推动并最终分支从事新工作!


2

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

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

2

此处其他答案未涵盖的一件棘手的事情是,如果您有内联注释,则.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

2

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

使用nano .gitignore而不是进行编辑时sudo nano .gitignore,我可以看到正确的反射。


2

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

我的问题是所创建文件的编码,在将其更改为ANSI后,问题得以解决。


2

我在Ubuntu上也有同样的问题,我.gitignore从终端创建了它,对我有用

touch .gitignore


2

我的行不通是因为我从字面上创建了一个名为.gitignore的文本文档

而是创建一个文本文档,在Notepad ++中打开它,然后另存为.gitignore

保存时,请确保从下拉列表中选择所有类型(*。*)。


或者在gitbash中,只需使用 touch .gitignore


1

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

使用记事本++打开.gitignore文件,然后执行以下操作:

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

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

我已经在这里发布了类似问题的答案。


1

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

/*
!/content/

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

因此,再添加一行即可解决此问题:

/*
!/content/
!.gitignore

1

我的问题是我写下了要用引号“”而不是斜杠/忽略的文件。

这不起作用,被git忽略:

"db.sqlite3"
"tdd_venv/"

这工作得很好:

/db.sqlite3
/tdd_venv/

我还使用Notepad ++在Windows中检查了文件编码。编码设置为UTF-8。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.