忽略已提交到 Git 存储库的文件 [重复]

Posted

技术标签:

【中文标题】忽略已提交到 Git 存储库的文件 [重复]【英文标题】:Ignore files that have already been committed to a Git repository [duplicate] 【发布时间】:2010-11-11 12:06:34 【问题描述】:

我有一个已经初始化的 Git 存储库,我添加了一个 .gitignore 文件。如何刷新文件索引以便忽略我想要忽略的文件?

【问题讨论】:

【参考方案1】:

要取消跟踪已添加/初始化到您的存储库的单个文件,ie,请停止跟踪该文件,但不要将其从系统中删除:@987654321 @

要取消跟踪现在在您的.gitignore 中的每个 文件:

首先提交所有未完成的代码更改,然后运行以下命令:

git rm -r --cached .

这会从 index(暂存区)中删除所有更改的文件,然后运行:

git add .

提交:

git commit -m ".gitignore is now working"

要撤消git rm --cached filename,请使用git add filename

确保在运行 git add . 之前提交所有重要更改 否则,您将丢失对其他文件的任何更改。

请注意,当您将其推送到存储库并从其他地方拉入仍然跟踪这些文件的状态时,这些文件将被删除

【讨论】:

请注意之前提交所有更改,否则您将失去对所有更改文件的控制 @TravisWebb 您必须确保先设置 .gitignore。此外,我倾向于不从索引中删除所有文件,只删除我需要使用 Fileglobs 的文件,例如 *.o git rm -r --cached 。为我删除了比 git ignore 更多的文件:( :(。它删除了我什至没有列出的目录中的文件 很好的答案,但git rm --cached filename 似乎没有那么激烈恕我直言.. @JimMorrison 你没抓住重点。如果您有一个带有复杂 .gitignore 的大型项目(例如 Visual Studio 中的 C# 项目),那么找出要删除的每个单独文件是很乏味的。这三个简单的命令可以轻松解决所有问题。【参考方案2】:

如果您尝试忽略对已在存储库中跟踪的文件的更改(例如,您需要为本地环境更改但您永远不想签入这些更改的 dev.properties 文件)而不是您所做的想做的是:

git update-index --assume-unchanged <file>

如果您想再次开始跟踪更改

git update-index --no-assume-unchanged <file>

git-update-index(1) Manual Page

如果您需要通过 git-reset (via) 持久保存更新索引,还请查看 skip-worktreeno-skip-worktree 选项


更新: 由于人们一直在问,这里有一个方便的(并且在下面评论后更新)别名,用于查看本地工作区中当前“忽略”(--assume-unchanged)的文件

$ git config --global alias.ignored = !git ls-files -v | grep "^[[:lower:]]"

【讨论】:

这真是天才!非常有用。你知道是否有办法获取所有“保留”文件的列表吗? 这对你有用:git ls-files -v 如果打印的字符是小写,则文件标记为假定未更改。请参阅:***.com/a/2363495/677381 和:git-scm.com/docs/git-ls-files 这是我的 ignored 别名的稍微详细的版本,它出现在我的 ~/.gitconfig 文件中:ignored = !git ls-files -v $(git rev-parse --show-toplevel) | (grep '^[[:lower:]]' || echo 'None ignored.') &amp;&amp; echo '\nIgnore changes with: git update-index --assume-unchanged &lt;file&gt; \nor track again with: git update-index --no-assume-unchanged &lt;file&gt;' 它的顶层部分确保它搜索整个存储库。跨度> 很遗憾,--assume-unchanged 不适用于git stash:更改在git stash 期间被还原,在git stash pop 期间不会重新应用。见this question。 不确定mac上的语法是否不同,但我不得不稍微修改一下别名git config --global alias.hidden '!git ls-files -v | grep "^[[:lower:]]"'【参考方案3】:

要取消跟踪已添加/初始化到存储库的文件,即停止跟踪文件但不将其从系统中删除,请使用:git rm --cached filename

【讨论】:

这是删除我添加、提交但后来意识到不需要跟踪的几个文件的完美方法。将这些文件添加到 .gitignore 后,我能够做到这一点并完美地取消跟踪它们。 提示:例如,如果您将*.config 添加到您的.gitignore,您可以通过git rm --cached *.config 停止跟踪所有*.config 文件。 另请注意,这样做会删除您推送到的其他存储库中的文件,即使它保留在您的系统上。如果您只是忽略对文件的更改并且不想从其他用户的存储库中删除它们,请尝试使用git update-index --assume-unchanged file.name IMO,这是正确答案。 Wiki 回答有点用,但非常严厉,尤其是考虑到这个问题。 (我会修复 wiki,但我不确定如何修复。“很快!”;) @Olie 对这个“解决方案”要非常小心。这删除 repo 中的文件,任何拉动此更改的人也将删除该文件。最好的解决方案是assume-unchanged,正如@dav_i 所说,或者--skip-worktree 作为替代方案。【参考方案4】:

是 - .gitignore 系统只忽略当前不受 git 版本控制的文件。

即如果您已经使用git-add 添加了一个名为test.txt 的文件,那么将test.txt 添加到.gitignore 仍然会导致对test.txt 的更改被跟踪。

您必须先git rm test.txt 并提交该更改。只有这样,对test.txt 的更改才会被忽略。

【讨论】:

这不完全正确,可以忽略跟踪文件中的更改...查看我的回答:***.com/a/11366713/677381 git update-index --assume-unchanged 和 git rm --caheced 实际上并没有为我工作。我已经完成了 git rm ,然后在 &lt;file&gt; 被成功忽略之后创建了新文件。我正在使用 git 版本 1.8.1 -- 如果这是问题所在。 你的语法在这里是错误的。它是git rm test.txt,这是一个更全面的答案的链接***.com/questions/12661306/… 如果您的 .gitignore 不适用于某些特定文件,这是正确的答案。接受的答案将导致提交所有文件。【参考方案5】:

删除 .gitignore 中的尾随空格

另外,请确保您的 .gitignore 中没有尾随空格。我之所以提出这个问题是因为我正在寻找答案,然后我有一种有趣的感觉,我应该打开编辑器而不是仅仅关注 .gitignore。从末尾删除了一个额外的空格,poof 现在可以使用了 :)

【讨论】:

我遇到了完全相同的问题,:P。因为这个,我也得到了这个问题。好在你有这个记录在这里。 +1 如果你像我一样使用 vi 快速编辑 .gitignore 使用 ':set list' 来显示空白。 这发生在我做echo node_modules &gt;&gt; .gitignore 时(至少在 Windows 上) 几个星期以来,我一直对此感到沮丧,直到我看到你的空白帖子。谢谢,解决了我的问题。【参考方案6】:

我遵循了这些步骤

git rm -r --cached .
git add .
git reset HEAD

之后,git 删除所有应该忽略的文件(在我的例子中是 *.swp)。

【讨论】:

小心那个,因为它假定您要添加所有文件,除了被忽略的文件,通常情况并非如此 太棒了! +1【参考方案7】:

到处都是复杂的答案!

只需使用以下

git rm -r --cached .

它将从源文件中删除您尝试忽略的文件,而不是从您计算机上的主文件中删除!

之后只需提交并推送!

【讨论】:

【参考方案8】:

如果您想停止跟踪文件而不从本地系统中删除文件,我更喜欢忽略config/database.yml 文件。只需尝试:

git rm --cached config/database.yml
# this will delete your file from git history but not from your local system.

现在,将此文件添加到.gitignore 文件并提交更改。从现在开始,对 config/database.yml 所做的任何更改都不会被 git 跟踪。

$ echo config/database.yml >> .gitignore

谢谢

【讨论】:

【参考方案9】:

仅删除几个特定文件不被跟踪:

git update-index --assume-unchanged path/to/file

如果您想再次开始跟踪它:

git update-index --no-assume-unchanged path/to/file                      

【讨论】:

【参考方案10】:

正如 dav_i 所说,为了将文件保留在 repo 中并从更改中删除它而不创建额外的提交,您可以使用:

git update-index --assume-unchanged filename

【讨论】:

撤消:git update-index --no-assume-unchanged filename 如果您想一次性对文件夹中的所有文件执行此操作怎么办?【参考方案11】:

不知道“answer”命令做了什么,我运行了它,这让我很沮丧。它递归地从您的 git 存储库中删除每个文件。

*** 来救援...How to revert a "git rm -r ."?

git reset HEAD

成功了,因为我有一些我不想覆盖的未提交的本地文件。

【讨论】:

git rm -r --cached . 对我不起作用。即使 .tmproj 在我的全局忽略文件中,Git 仍然声称我的 textmate 项目文件没有被跟踪。不过,像这样重置我的本地复制是有效的。实际上,我在git reset --hard HEAD 中添加了“硬”选项。在这种情况下,这应该具有几乎相同的效果。 小心--hard 标志。它在没有警告的情况下抛出任何未提交的更改!【参考方案12】:

对于像我这样的慢人可能还有另一个建议 =) 将 .gitignore 文件放入您的存储库根目录 not in .git文件夹。干杯!

【讨论】:

【参考方案13】:

没有一个答案对我有用。

改为:

    将文件移出 git 控制的目录 检查删除到 git 将文件移回 git 控制的目录

将文件移回后,git会忽略它。 也适用于目录!

【讨论】:

似乎是唯一理智的解决方案 :)【参考方案14】:

如果文件已经在版本控制中,您需要手动删除它们。

【讨论】:

我尝试了git rm --cachedgit reset HEAD 这两个工具我都非常熟悉,并且可以从回购中获得。成功来自首先rm --cached,然后实际手动删除它,提交删除,然后手动重新创建它。它已经消失了。 这对我有用:rm foo/bar &amp;&amp; git add -u &amp;&amp; git commit -m "removed foo/bar" &amp;&amp; git push。然后运行touch foo/bar &amp;&amp; git status 将显示该文件现在已被正确忽略。【参考方案15】:

我遇到的另一个问题是我放置了一个内联评论。

tmp/*   # ignore my tmp folder (this doesn't work)

这行得通

# ignore my tmp folder
tmp/

【讨论】:

【参考方案16】:

多亏了您的回答,我才能够写出这个小小的单行字来改进它。我在我的 .gitignore 和 repo 上运行它,没有任何问题,但如果有人看到任何明显的问题,请发表评论。这应该是git rm -r --cached 来自.gitignore

cat $(git rev-parse --show-toplevel)/.gitIgnore | sed "s/\/$//" | grep -v "^#" | xargs -L 1 -I  find $(git rev-parse --show-toplevel) -name "" | xargs -L 1 git rm -r --cached

请注意,您会收到很多 fatal: pathspec '&lt;pathspec&gt;' did not match any files。这只是针对未修改的文件。

【讨论】:

sed s//$// 应该是s/$// 吗?另外, sed 和 grep 命令的意义何在?我猜是从 gitignore 过滤评论?【参考方案17】:

我发现 .gitignore 有一个奇怪的问题。一切都到位,似乎是正确的。我的 .gitignore 被“忽略”的唯一原因是行尾是 Mac 格式(\r)。因此,在使用正确的行尾(在 vi 中使用 :set ff=unix)保存文件后,一切都像魅力一样!

【讨论】:

如果有人在 Windows 记事本中创建文件后遇到 .gitignore 问题,这里有更多信息:***.com/questions/11451535/gitignore-not-working/… .gitignore 格式是每一行都是注释(以# 开头)或整行(包括任何空格)是完整的文件名模式。如果您将\r 混合到该行中,git 将仅忽略以\r 结尾的文件(您可以根据需要创建这些文件!)。详情见man gitignore,值得一读。【参考方案18】:

这里没有提到的另一个问题是,如果你在 Windows 记事本中创建了 .gitignore,我发现它在其他平台上可能看起来像乱码。关键是确保您在记事本中将编码设置为 ANSI,(或者像我一样在 linux 上制作文件)。

从我这里的回答:https://***.com/a/11451916/406592

【讨论】:

【参考方案19】:

在我的服务器 linux 服务器上(在我的本地 dev mac 上不是这样),只要我不添加星号,目录就会被忽略:

www/archives/*

我不知道为什么,但它让我放松了几个小时,所以我想分享......

【讨论】:

【参考方案20】:

如果你需要停止跟踪很多被忽略的文件,你可以结合一些命令:

git ls-files -i --exclude-standard | xargs -L1 git rm --cached

这将停止跟踪被忽略的文件。如果您想真正从文件系统中删除文件,请不要使用--cached 选项。也可以指定一个文件夹来限制搜索,如:

git ls-files -i --exclude-standard -- $FOLDER | xargs -L1 git rm

【讨论】:

这应该是公认的答案。 git rm -r --cached . 删除了很多其他的东西!【参考方案21】:

如果.gitignore 似乎没有忽略未跟踪的文件,还需要记住的一件事是,您不应该将 cmets 与忽略的文件放在同一行。所以没关系

# ignore all foo.txt, foo.markdown, foo.dat, etc.
foo*

但这不起作用:

foo*   # ignore all foo.txt, foo.markdown, foo.dat, etc.

.gitignore 将后一种情况解释为“忽略名为 "foo* # ignore all foo.txt, foo.markdown, foo.dat, etc." 的文件,当然,您没有。

【讨论】:

以上是关于忽略已提交到 Git 存储库的文件 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

git配置忽略文件(已提交文件和目录的忽略)

git忽略已加入到版本库的文件

git-忽略已提交的文件或目录

git如何忽略文件

使用 .gitignore 忽略 Git 仓库中的文件

GIT - 从提交中排除/忽略文件[重复]