忽略已提交到Git存储库的文件

时间:2009-07-16 19:26:36

标签: git caching version-control gitignore git-rm

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

21 个答案:

答案 0 :(得分:3896)

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

要取消现在位于git rm --cached filename中的每个文件:

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

.gitignore

这将从索引(暂存区域)中删除所有已更改的文件,然后运行:

git rm -r --cached .

承诺:

git add .

要撤消git commit -m ".gitignore is now working" ,请使用git rm --cached filename

  

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

答案 1 :(得分:563)

如果您试图忽略对已在存储库中跟踪的文件的更改(例如,您需要为本地环境更改的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选项

更新: 由于人们一直在问,这是一个方便的(以及下面评论的更新)别名,用于查看当前工作区中当前“忽略”( - 保持未更改)的文件

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

答案 2 :(得分:355)

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

答案 3 :(得分:79)

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

即。如果您已使用test.txt添加了名为git-add的文件,则将test.txt添加到.gitignore仍会导致跟踪test.txt的更改。

首先必须git rm test.txt并提交更改。只有这样才会忽略test.txt的更改。

答案 4 :(得分:49)

删除.gitignore中的尾随空格

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

答案 5 :(得分:40)

我按照这些步骤进行了

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

之后,git删除应忽略的所有文件(在我的情况下为* .swp)。

答案 6 :(得分:36)

如果要停止跟踪文件而不删除本地系统中的文件,我更喜欢忽略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

由于

答案 7 :(得分:30)

到处都是复杂的答案!

只需使用以下

即可
git rm -r --cached .
  

它会从原点删除您要忽略的文件,而不是从计算机上的主文件中删除!

之后只需提交并推送!

答案 8 :(得分:28)

要从跟踪中删除几个特定文件:

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

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

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

答案 9 :(得分:27)

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

git update-index --assume-unchanged filename

答案 10 :(得分:23)

我不太清楚'回答'命令做了什么,我跑了,让我感到沮丧。它以递归方式从git仓库中删除每个文件。

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

git reset HEAD

诀窍,因为我有未提交的本地文件,我不想覆盖。

答案 11 :(得分:22)

对于像我这样的慢人来说还有另一个建议=)将 .gitignore 文件放入 .git 中的 存储库 夹。干杯!

答案 12 :(得分:21)

这些答案都不适合我。

相反:

  1. 将文件移出git-controlled目录
  2. 检查删除到git
  3. 将文件移回git控制目录
  4. 将文件移回后,git会忽略它。

    也适用于目录!

答案 13 :(得分:19)

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

答案 14 :(得分:19)

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

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

这是有效的

# ignore my tmp folder
tmp/

答案 15 :(得分:12)

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

  

cat $(git rev-parse --show-toplevel)/。gitIgnore | sed“s // $ //”| grep -v“^#”| xargs -L 1 -I {}查找$(git rev-parse --show-toplevel)-name“{}”| xargs -L 1 git rm -r --cached

请注意,您将获得大量fatal: pathspec '<pathspec>' did not match any files。这仅适用于尚未修改的文件。

答案 16 :(得分:9)

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

答案 17 :(得分:9)

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

从我的答案:https://stackoverflow.com/a/11451916/406592

答案 18 :(得分:7)

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

  

WWW /档案/ *

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

答案 19 :(得分:6)

如果.gitignore似乎没有忽略未跟踪文件,那么还要注意的一点是,您不应该在与忽略相同的行上发表评论。所以这没关系

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

但这不起作用:

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

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

答案 20 :(得分:6)

如果您需要停止跟踪大量被忽略的文件,可以组合一些命令:

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

这将停止跟踪被忽略的文件。如果要从文件系统中实际删除文件,请不要使用--cached选项。您还可以指定限制搜索的文件夹,例如:

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