.gitignore 被 Git 忽略
Posted
技术标签:
【中文标题】.gitignore 被 Git 忽略【英文标题】:.gitignore is ignored by Git 【发布时间】:2012-07-12 04:27:16 【问题描述】:我的 .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/
不会出现在未跟踪的文件列表中。
我应该从哪里着手解决这个问题?
【问题讨论】:
确保您的.gitignore
文件使用ANSI
或UTF-8
编码。如果它使用Unicode BOM
之类的其他内容,Git 可能无法读取该文件。
@ADTC 这正是我的机器(Windows)上的问题。我在 PowerShell 中使用了echo "file" > .gitignore
,该文件具有 UCS-2 编码!
git rm --cached debug.log nbproject/
为什么这里的第一条评论不是答案是我无法理解的
@MattParkins 啊,我现在看到了,我仍然感到惊讶,这样一个简单而中肯的答案被埋在评论中,或者实际接受的答案就在那里。谢谢!
【参考方案1】:
已经有一些很好的答案,但我的情况很乏味。我在 Win10 上编辑了已安装的 PLM(产品生命周期管理)软件的源代码,然后决定,“我可能应该把它做成一个 git repo。”
所以,缓存选项对我不起作用,直接。为其他可能在完成大量初始工作后添加源代码控制且 .gitignore
无法正常工作的人发帖,但您可能害怕失去大量工作,因此 git rm --cached
不适合您。
!IMPORTANT: 这真的是因为我太迟将 git 添加到一个太大并且似乎忽略了我的 .gitignore 的“项目”中。我从来没有提交过。我可以摆脱这个:)
首先,我刚刚做了:
rm -rf .git
rm -rf .gitignore
然后,我必须有一张我的变化的照片。同样,这是一个我已对其进行更改的安装产品。纯主分支的第一次提交为时已晚。因此,我需要一个列表,列出我安装程序后所做的更改,方法是将 > changed.log
添加到以下任一选项:
PowerShell
# 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 供其他开发人员获取和贡献......这将是我们的主分支,所以提交、推动,最后为新工作分支!
【讨论】:
【参考方案2】:这里有很多答案,但对我有用的并不是任何一个特定的答案,我正在以一种简单的方式一一记下需要在这里完成的所有步骤:
Pre --- 备份 repo 以防万一。(我没有,但可能会让你感觉更安全)
-
确保这是您的第一次提交或更早的提交,这些文件已添加并因此已被缓存。
如果是,则 git rm -r --cached 。和 git add 。 (不要错过点)
如果还是不行,用记事本打开文件
转到文件 -> 另存为
将编码更改为 ANSI。 (有些答案错误地说 UTF-8 ,但它不起作用并且不必要地浪费时间)
再次 git rm -r --cached 。和 git add 。 (不要错过点)
现在执行 Git 状态并验证我们想要的是否已经发生
【讨论】:
【参考方案3】:我看到你们中的一些人已经回答了,但我不知道它是否说清楚。就我而言,问题是使用 echo 命令创建 .gitignore 文件。在这种情况下,文件编码已更改,我必须打开文本文件,单击另存为并将底部选项卡中的编码更改为 UTF-8。当使用 touch 命令创建文件并通过文本编辑器编辑其内容时,.gitignore 的问题没有发生。
【讨论】:
【参考方案4】:每当我遇到 git 正在跟踪 .gitignore
中列出的文件的情况时,我都会使用以下内容:
git update-index --skip-worktree <file_name>
【讨论】:
【参考方案5】:即使您到目前为止还没有跟踪这些文件,即使您将它们添加到 .gitignore
,Git 似乎也能够“了解”它们。
警告:首先提交或存储您当前的更改,否则您将丢失它们。
然后从 Git 存储库的顶层文件夹运行以下命令:
git rm -r --cached .
git add .
git commit -m "fixed untracked files"
【讨论】:
我在尝试“git rm -r --cached”时打印了“usage: git rm [options] [--]我的 30 美分把戏:
-
请清理您的目录。
git clean -f
(我试过git rm -r --cached .
,但它对我不起作用。)
警告: git clean -f 将删除未跟踪的文件,这意味着它们已经消失了,因为它们没有存储在存储库中。在执行此操作之前,请确保您确实要删除所有未跟踪的文件。
也许你可以试试git clean -xdf
,它会删除被忽略的目录和未跟踪的文件
-
现在将
HEAD
带到当前位置
git reset HEAD --hard
。
检查git status
。
现在创建.gitignore
,在我的情况下,它想忽略一个名为data
的文件夹。所以我写了/data/
(最初的/
是文件/文件夹,后来/
是文件夹而已)。
【讨论】:
【参考方案7】:PhpStorm(可能还有其他一些 IDE 用户),就我而言,问题是我通过 finder 在项目之外创建和添加了文件。
我删除了那个,然后在 phpStorm 项目中重新创建了同一个,右键单击 -> 新建 -> 文件,它立即工作。
【讨论】:
【参考方案8】:这听起来可能很愚蠢,但解决我的问题的是意识到.gitignore
工作正常,即使它在 git status 上显示 deleted: yourfile
。
我打算忽略一个错误日志文件,以忽略我造成的任何错误,但保存其他开发人员造成的错误,以防有一天他们在调试一个奇怪的问题时派上用场。但是,git 不允许您“忽略”并同时保留文件。
我希望它被“及时冻结”,但 git 说它要么被跟踪,要么根本不允许存在。
【讨论】:
【参考方案9】:我的问题是我写了要忽略的文件,用引号“”分隔而不是用斜杠 /。
这不起作用,被 git 忽略了:
"db.sqlite3"
"tdd_venv/"
这很好用:
/db.sqlite3
/tdd_venv/
我还使用 Notepad++ 在 Windows 中检查了我的文件编码。编码设置为 UTF-8。
【讨论】:
【参考方案10】:我的不工作,因为我已经创建了一个名为 .gitignore 的文本文档
相反,创建一个文本文档,在 Notepad++ 中打开它,然后保存为 .gitignore
确保在保存时从下拉列表中选择所有类型 (*.*)。
或者在 gitbash 中,只需使用touch .gitignore
【讨论】:
【参考方案11】:我在 Ubuntu 上也有同样的问题,我从终端创建了 .gitignore
,它对我有用
touch .gitignore
【讨论】:
【参考方案12】:如果 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
【讨论】:
也许您可以编辑 @AlinHruba 的答案以添加您的第 3 步? @Benj 谢谢你的建议,我没有找到AlinHruba的答案,我不知道有什么区别,所以请直接告诉我。 第 3 步是我需要的。大多数答案只是告诉如何删除我们要取消跟踪的文件。感谢相反的观点。 希望对您有所帮助! 我很高兴这可以帮助你!【参考方案13】:特别针对 Windows 用户:如果您有未跟踪的文件并且清除/删除缓存文件不起作用。尝试打开 PowerShell 并将 .gitignore 文件转换为 UTF-8 编码:
$Myfile = Get-Content .\.gitignore`
$Myfile | Out-File -Encoding "UTF8" .gitignore
您只需执行一次即可对该目录的 .gitignore 文件进行编码,并且由于该文件随后被正确编码,因此无论您将来何时编辑该文件,它都应该可以工作。我相信这是由于 GitHub 出现故障,无法读取 .gitignore 文件的非 UTF-8 编码。据我所知,Windows 尚未解决此问题。这没什么大不了的,只是在不工作时调试起来很痛苦。
【讨论】:
【参考方案14】:我遇到了这个问题,一个 .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
来解决此问题。
【讨论】:
【参考方案15】:另一个可能的原因 - 几个 Git 客户端实例同时运行。比如“git shell”+“GitHub Desktop”等
这发生在我身上。我使用“GitHub Desktop”作为主客户端,它忽略了一些新的 .gitignore 设置:commit after commit:
-
你犯了一些错误。
接下来,提交:它忽略 .gitignore 设置。 Commit 包含大量 .gitignore 中提到的临时文件。
清除 Git 缓存;检查 .gitignore 是否为 UTF-8;删除文件→提交→移回文件;跳过一次提交 - 没有任何帮助。
原因:Visual Studio Code 编辑器在后台运行,打开的存储库相同。 Visual Studio Code 具有内置的 Git 控件,这会导致一些冲突。
解决方案:仔细检查多个隐藏的 Git 客户端,一次只使用一个 Git 客户端,尤其是在清除 Git 缓存时。
【讨论】:
【参考方案16】:我在 Windows 的 PowerShell 中使用 echo "..." > .gitignore
创建了 .gitignore,因为它不允许我在 Windows 资源管理器中创建它。
我的问题是创建文件的编码问题,我改成ANSI后问题就解决了。
【讨论】:
【参考方案17】:您也有可能使用sudo
命令编辑了.gitignore
文件。我遇到了同样的问题,在执行命令时:git status
,我仍然可以看到“应该被忽略”的文件。
在使用nano .gitignore
而不是sudo nano .gitignore
进行编辑时,我可以看到正确的反射。
【讨论】:
【参考方案18】:对我来说,这是另一个问题。我的 .gitignore 文件设置为忽略除我告诉它不要忽略的内容之外的所有内容。像这样:
/*
!/content/
现在这显然意味着我还告诉 Git 忽略 .gitignore 文件本身。只要我不跟踪 .gitignore 文件,这不是问题。但在某些时候,我提交了 .gitignore 文件本身。这会导致 .gitignore 文件被正确忽略。
所以再添加一行修复它:
/*
!/content/
!.gitignore
【讨论】:
这值得更多投票。添加!.gitignore
解决了我的问题。【参考方案19】:
如果您是Notepad++ 用户,请尝试执行以下操作:
使用 Notepad++ 打开您的 .gitignore 文件并执行以下操作:
菜单编辑 → EOL 转换 → Windows 格式 → 保存。
再次尝试使用git status
,看看它是否适合您。
我已经发布了类似问题的答案here。
【讨论】:
【参考方案20】:我的问题是(正如 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.
【讨论】:
这看起来像是 UTF-8 编码文件中的 UTF-16 字节顺序标记。 en.wikipedia.org/wiki/Byte_order_mark【参考方案21】:这里的其他答案未涵盖的一个棘手的事情是,如果您有内联 cmets,.gitignore 文件将无法工作,如下所示:
foo/bar # The bar file contains sensitive data so we don't want to make this public
所以,如果您确实有这样的 cmets,请像这样更改它们:
# The bar file contains sensitive data so we don't want to make this public
foo/bar
【讨论】:
【参考方案22】:我刚刚遇到了这个问题。我的 .gitignore 文件中的内容继续出现在未跟踪文件列表中。
我用它来创建忽略文件:
echo "node_modules" > .gitignore
事实证明,双引号引起了我的问题。我删除了忽略文件,然后再次使用不带引号的命令,它按预期工作。我不需要弄乱文件编码。我在使用 Cmder 的 Windows 10 机器上。
例子:
echo node_modules > .gitignore
【讨论】:
很奇怪,这个 echo 语句解决了我在本地遇到的一个问题,即我意外删除然后重新创建的一个被忽略的文件显示为一个可提交的、未跟踪的文件。出于某种原因,即使这没有改变我的忽略文件,它也解决了我的问题。 这是唯一对我有用的东西。 mac用户。我必须在 .gitignore 中手动指定我想要忽略的文件,但这只需要几秒钟。谢谢!【参考方案23】:在我的情况下,这是因为文件已经存在于存储库中,我试图忽略它。
这些是我为解决问题所做的事情:
将文件复制到临时文件夹 从我的项目文件夹中删除它们。 提交从存储库中删除这些文件的更改 将这些文件重新添加到我的项目文件夹中到那时,我对这些文件所做的任何更改都被忽略了。
我认为你不能忽略存储库中已经存在的文件。
【讨论】:
就我而言,它们已经上演了。只有在按照您的建议进行操作之后,然后尝试提交并看到警告说它们已被上演并被删除,我才意识到这是问题所在。【参考方案24】:只需通过以下命令删除之前在 Git 中提交的文件夹或文件。然后 gitignore 文件将反映正确的文件。
git rm -r -f "folder or files insides"
【讨论】:
【参考方案25】:对我来说,以前的答案都没有奏效。我必须将 .gitignore
文本复制到位于
exclude.txt
文件中
<Your-project-folder>\.git\info
完成后,刷新您的更改,所有未跟踪的文件都会消失。像往常一样提交。
【讨论】:
【参考方案26】:与其他解决方案一样,首先提交并注意您将丢失任何未提交的更改。
我有更好的结果:
git rm -r --cached .
git reset HEAD --hard
git status
请注意,该状态现在不应有任何已修改的文件。
【讨论】:
这个对我不起作用,但 ifeegoo 的回答对我有用 可爱的 jubbley Rodders。【参考方案27】:好的,所以在我的情况下,接受的解决方案不起作用,这里描述了有效的解决方案:
Is Visual Studio 2013 ignoring your .gitignore file?
简而言之:
关闭 Visual Studio。 导航到您的 .git 文件夹 删除ms-persist.xml
重启 Visual Studio
【讨论】:
【参考方案28】:这里的所有答案实际上都是解决方法。您需要在运行git init
之前创建 .gitignore 文件。否则git
永远不会知道您需要忽略这些文件,因为它们已经被跟踪了。
echo .idea/ >> .gitignore
git init
如果您每天都在开发,我建议您将习惯性忽略的文件添加到您的~/.gitignore_global
文件中。这样,git
就会知道您通常会忽略哪些文件(意思是“您的用户”,因为它是您的主目录中的一个文件)。
【讨论】:
感谢上帝...终于找到了适合我的解决方案。~/.gitignore_global
是一个可配置的名称。首先运行git config --global core.excludesfile
以查看您是否已经定义了文件。如果没有,请运行git config --global core.excludesfile ~/.gitignore_global
。
如果您没有先创建 .gitignore
的解决方法:重命名跟踪文件。 .gitignore
将被应用,就像它是新的一样。【参考方案29】:
.gitignore
可能会出现另一个问题,尤其是对于 Windows 用户。 Git不喜欢你命名.gitignore
(比如unity.gitignore
)。
您总是希望将其命名为 .gitignore
,或者在 Windows 上命名为 .gitignore.
,因为 Windows 认为您正在尝试在没有文件名的情况下重命名它。
【讨论】:
【参考方案30】:我遇到了同样的问题。我相信这个问题是 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
【讨论】:
以上是关于.gitignore 被 Git 忽略的主要内容,如果未能解决你的问题,请参考以下文章
Git - .gitignore怎么忽略已经被版本控制的文件
git使用.gitignore忽略提交文件并没有生效问题解决