1662

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

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

4

37 回答 37

3403

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

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

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

git rm -r --cached .
git add .
git commit -m "fixed untracked files"
于 2012-07-12T12:20:59.183 回答
354

如果 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
    
于 2015-09-03T13:54:04.313 回答
218

固定的。好的,我在 Windows 上的记事本中创建了 .gitignore 文件,但它不工作。当我在 Linux 上查看 .gitignore 文件时,它看起来像是有条理的乱码——也许记事本写出了 Unicode 而不是 ASCII 或任何 8 位。

所以我在我的 Linux 机器上重写了文件,当我把它拉回 Windows 时它工作正常!欢呼!

于 2012-07-12T12:30:50.053 回答
119

在不向您的项目添加另一个提交的情况下,一行就足以完成.gitignore预期的工作:

git rm -r --cached debug.log nbproject

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

于 2014-03-19T23:40:24.987 回答
50

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

例子:

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

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

# Be aware of the following:
notWorkingIgnore.* #<-Space
workingIgnore.*#<-Nospace
于 2013-12-23T01:48:12.053 回答
41

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

过程:

  1. 验证状态:PS> git status
  2. 创建一个Get-FileEncoding函数
  3. 测试.gitignore的编码:PS> Get-FileEncoding .gitignore
  4. 将编码更改为 ASCII:PS> Set-Content .gitignore -Encoding Ascii -Value (Get-Content .gitignore)
  5. 确认:PS> git status
于 2015-08-13T21:14:28.747 回答
37

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

我有更好的结果:

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

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

于 2016-11-14T23:13:08.117 回答
24

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

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

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

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

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

于 2017-08-21T08:27:15.583 回答
20

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

echo .idea/ >> .gitignore
git init

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

于 2015-11-25T21:21:08.230 回答
16

还要检查您放置的目录.gitignore

它应该位于项目的根目录中

./myproject/.gitignore

不在

./myproject/.git/.gitignore
于 2014-10-14T06:32:07.833 回答
10

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

您将希望始终命名它.gitignore,或者在 Windows 上,.gitignore.因为 Windows 认为您正在尝试在没有文件名的情况下重命名它。

于 2015-08-16T15:49:18.360 回答
9

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

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

您只需执行一次即可为该目录编码 .gitignore 文件,并且由于该文件随后被正确编码,因此无论您将来何时编辑该文件,它都应该可以工作。我相信这是由于 GitHub 出现故障,无法读取 .gitignore 文件的非 UTF-8 编码。据我所知,Windows 尚未解决此问题。这没什么大不了的,只是在它不工作时调试起来很痛苦。

于 2017-11-11T01:20:04.073 回答
8

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

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

echo "node_modules" > .gitignore

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

例子:

echo node_modules > .gitignore
于 2017-08-25T06:36:10.823 回答
7

已经有一些很好的答案,但我的情况很乏味。我在 Win10 上编辑了已安装的 PLM(产品生命周期管理)软件的源代码,然后决定,“我可能应该把它做成一个 git repo。”

因此,缓存选项直接对我不起作用。为其他可能在做了一堆初始工作后添加了源代码控制.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 配置一起工作,我想放入一个 repo 供其他开发人员获取和贡献......这将是我们的主分支,所以提交,推动,最后为新工作分支!

于 2020-03-10T14:27:27.563 回答
6

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

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

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

于 2017-02-20T00:47:06.093 回答
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 文件中替换为来解决这个问题。

于 2017-05-03T14:21:03.457 回答
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.
于 2018-01-08T02:15:35.010 回答
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

于 2015-02-21T06:32:39.580 回答
5

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

Visual Studio 2013 是否忽略了您的 .gitignore 文件?

简而言之:

  • 关闭 Visual Studio。
  • 导航到您的 .git 文件夹
  • 删除ms-persist.xml
  • 重新启动 Visual Studio
于 2016-03-29T10:41:30.810 回答
4

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


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

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

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

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

于 2019-05-23T09:57:25.303 回答
3

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

视窗:

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

Linux:

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

于 2012-11-13T02:21:22.253 回答
3

此处其他答案未涵盖的一个棘手的事情是,如果您有内联注释,则 .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
于 2017-09-28T20:18:20.740 回答
3

每当我遇到 git 正在跟踪中列出的文件的情况时.gitignore,我都会使用以下内容:

git update-index --skip-worktree <file_name>
于 2021-04-16T19:35:53.073 回答
2

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

/*
!/content/

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

所以再添加一行修复它:

/*
!/content/
!.gitignore
于 2018-09-04T19:41:28.063 回答
2

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

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

于 2018-10-22T06:15:21.523 回答
2

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

我的问题是创建文件的编码,我把它改成ANSI后问题就解决了。

于 2019-04-30T18:18:54.380 回答
2

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

touch .gitignore

于 2019-07-20T00:01:55.237 回答
2

我的不起作用,因为我确实创建了一个名为 .gitignore 的文本文档

相反,创建一个文本文档,在 Notepad++ 中打开它,然后保存为 .gitignore

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


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

于 2019-08-15T20:08:18.380 回答
1

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

    git rm -r -f "folder or files insides"
于 2017-04-10T08:13:02.077 回答
1

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

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

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

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

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

于 2018-03-28T11:42:11.717 回答
1

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

这不起作用并被 git 忽略:

"db.sqlite3"
"tdd_venv/"

这工作得很好:

/db.sqlite3
/tdd_venv/

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

于 2019-12-06T17:28:27.387 回答
1

我看到有几个人已经回答了,不知道有没有说清楚。就我而言,问题是使用 echo 命令创建 .gitignore 文件。在这种情况下,文件编码已更改,我必须打开文本文件,单击另存为并将底部选项卡中的编码更改为 UTF-8。当使用 touch 命令创建文件并通过文本编辑器编辑其内容时,.gitignore 的问题没有发生。

于 2021-05-03T10:53:10.377 回答
1

这里有很多答案,但对我有用的并不是任何特定的答案,我正在以一种简单的方式一一记下所有需要在这里完成的步骤:

Pre --- 备份 repo 以防万一。 (我没有,但可能会让你感觉更安全)

  1. 确保这是您的第一次提交或更早这些文件已添加并因此已被缓存。
  2. 如果是,则 git rm -r --cached 。和 git add 。(不要错过点)
  3. 如果还是不行,用记事本打开文件
  4. 转到文件-> 另存为
  5. 将编码更改为 ANSI。(有些答案错误地说 UTF-8 ,但它不起作用并且不必要地浪费时间)
  6. 再次 git rm -r --cached 。和 git add 。(不要错过点)
  7. 现在做 Git status 并验证我们想要的已经发生了
于 2021-06-25T13:23:12.607 回答
0

这听起来可能很愚蠢,但解决我的问题的是意识到它.gitignore 工作正常,即使它deleted: yourfile显示在 git status 上。

我打算忽略一个错误日志文件,忽略我造成的任何错误,但保存其他开发人员造成的错误,以防他们有一天在调试一个奇怪的问题时派上用场。但是,git 不允许您“忽略”并同时保留文件。

我希望它“及时冻结”,但 git 说它要么被跟踪,要么根本不允许存在。

于 2020-03-09T09:13:18.297 回答
0

PhpStorm(可能还​​有其他一些 IDE 用户),在我的情况下,问题是我通过 finder 在项目外部创建和添加了文件。

我删除了那个,并在 PhpStorm 项目中重新创建了相同的,右键单击 -> 新建 -> 文件,它立即工作。

于 2020-04-09T17:03:53.287 回答
0

我的 30 美分把戏:

  1. 请清理您的目录。git clean -f(我试过git rm -r --cached .了,但它对我不起作用。)

警告: git clean -f 将删除未跟踪的文件,这意味着它们已经永远消失了,因为它们没有存储在存储库中。在执行此操作之前,请确保您确实要删除所有未跟踪的文件。

也许您可以尝试git clean -xdf删除被忽略的目录和未跟踪的文件

  1. 现在带到HEAD当前位置 git reset HEAD --hard
  2. 检查git status

  3. 现在创建.gitignore在我的情况下想要忽略名为data. 所以我写了/data/(最初/用于文件/文件夹,后来/仅用于文件夹)。

  4. 现在执行 git add、commit 和 push。
于 2020-04-15T09:50:32.953 回答
0

尽管尝试了这篇文章和其他文章中的各种建议(例如Gitignore 不工作gitignore 不工作 - 被忽略?)我无法让 git 忽略我的 .gitignore.txt 文件中包含的文件/文件夹。

我应该强调,与许多先前的答案不同,这些答案解决了先前已提交的文件/目录将无法跟踪的问题,在我的情况下,我在进行第一次提交之前遇到了这个问题(即只运行了git init跟随由git status)。

还有许多其他有希望的建议,包括:

  • 文本文件编码必须是 ANSI 而不是 UTF,例如 Encoding -> Notepad++ 中的 ANSI
  • Windows 的 EOL 转换,例如 Edit -> EOL Conversion -> Notepad++ 中的 Windows
  • .gitignore.txt 中的项目没有前导或尾随空格
  • 定义文件夹时没有前导“/”

但没有一个适用或解决我的问题。

在尝试了创建 .gitignore.txt 文件的不同方法之后,我设法弄清楚如何让它工作,尽管我不能说我明白为什么。知道是否有人可以提供解释会很有趣。

为了那些可能还发现以前的答案没有解决他们的问题的人的利益,我将描述我尝试过的内容,无效的内容以及有效的内容。希望通过这样做也可以阐明原因。请注意,我使用的是 Windows 10。

尝试 #1(失败)

在 Windows 资源管理器中创建新的 txt 文件:

  1. (在项目文件夹中)右键->新建->文本文档
  2. 将文件名更改为“.gitignore”
  3. 在记事本++中打开文件,输入的文件/目录名称被忽略
  4. 编码 -> ANSI [注 1],保存更改

我跑了git status,但我想忽略的文件/文件夹显示为未跟踪。我在 Windows 资源管理器中检查了文件属性。正如预期的那样,文件名是“.gitignore”,文件类型是“文本文档(.txt)”。

注1

一些贡献者表示编码必须是 ANSI(而不是 UTF)。在记事本++中,我发现无论我执行编码-> ANSI,还是编码-> 转换为ANSI + 保存,关闭文件,然后重新打开它(在记事本++ 中),当我检查编码时,它总是报告UTF- 8. 最终起作用的 .gitignore.txt 文件也是如此。

尝试#2(失败)

在 Notepad++ 中创建新的 txt 文件:

  1. 在记事本++中创建了新文件,输入了要忽略的项目
  2. 另存为“.gitignore.txt”,将“保存类型”从“普通文本文件”(默认)更改为“所有类型”,并取消勾选“附加扩展名”框(默认勾选)。

我跑了git status,和以前一样,所有文件/目录都列在未跟踪的文件下。和以前一样,文件名是“.gitignore”,文件类型是“文本文档(.txt)”。

尝试#3(成功)

在 Notepad++ 中仍然打开相同的文件 (.gitignore.txt):

  1. 另存为“.gitignore”为“另存为类型”选择了“普通文本文件”,这会自动勾选“附加扩展名”框

我注意到创建的文件在 Windows 资源管理器中似乎没有名称。我检查了文件的属性:文件名字段为空白,文件类型为“文本文档(.gitignore)”。在 Windows 资源管理器(查看 -> 文件扩展名)中勾选“文件扩展名”后,“无名”文件显示“.gitignore”扩展名。

我跑了git status,这次我想忽略的文件/文件夹没有被列为未跟踪的文件 -成功!

在 Notepad++ 中打开文件我注意到编码是 UTF-8,并且文件名被标识为“.gitignore”(与 Windows 资源管理器不同)。

所以看起来 txt 文件的创建方式很微妙。也许这是 Windows 独有的特性?

于 2022-01-06T21:10:18.093 回答