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

trobrock 2429 git version-control caching gitignore git-rm

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

trobrock.. 4029

要取消已经添加/初始化到存储库的单个文件,停止跟踪文件但不从系统中删除它: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.

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

  • 请注意以前提交所有更改,否则您将失去对所有已更改文件的控制权 (258认同)
  • 很好的答案,但`git rm --cached filename`似乎有点不那么激烈了. (96认同)
  • @JimMorrison你错过了这一点.如果你有一个带有复杂.gitignore的大项目(例如Visual Studio中的C#项目),搞清楚每个要删除的文件是很乏味的.这三个简单的命令可以毫不费力地修复所有内容. (18认同)
  • @TravisWebb您必须首先确保设置.gitignore.此外,我倾向于不删除索引中的所有文件,只使用Fileglobs(例如*.o)中所需的文件 (7认同)
  • git rm -r --cached.删除的方式比git中的文件更多忽略了我:( :(.它删除了我甚至没有列出的目录中的文件 (7认同)
  • 不是一个非常有用的答案.我确实删除了所有未跟踪的文件,但是一旦将文件设置为忽略,它就会将文件删除到活动存储库.我会说错误的答案.它应该没有git rm -r --cached.在第一位.当一个人不想要它时,它会将它们全部删除. (4认同)
  • 它也不适用于我.我的子文件夹. (3认同)
  • 这似乎不会停留在推送或干净的克隆上.有任何想法吗? (2认同)
  • @boomhauer它没有,只是检查. (2认同)
  • 我做了这个,它说我之后改变了100个文件.我做了一个恢复,现在,最后,我的.gitignore工作正常,忽略了我的*.user文件.谢谢! (2认同)

dyodji.. 577

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

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

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

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

请参阅git-update-index(1)手册页.

如果你需要通过 git-reset(via),还要查看update-index的选项skip-worktreeno-skip-worktree选项


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

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

  • 这对你有用:`git ls-files -v`如果打印的字符是小写的,则文件标记为假设不变.请参阅:http://stackoverflow.com/a/2363495/677381和:http://git-scm.com/docs/git-ls-files (12认同)
  • 这才是天才!非常有用.你知道是否有办法获得所有'保留'文件的清单? (10认同)
  • 这是我稍微更加详细的`ignored`别名版本,因为它出现在我的〜/ .gitconfig文件中:`ignored =!git ls-files -v $(git rev-parse --show-toplevel)| (grep'^ [[:lower:]]'|| echo'没有被忽略.')&& echo'\nIgnore更改为:git update-index --assume-unchanged <file> \并再次跟踪:git update- index --no-assume-unchanged <file>'`它的顶层部分确保它搜索整个存储库. (3认同)
  • 不幸的是`--assume-unchanged`不适用于`git stash`:更改在`git stash`期间恢复,而在`git stash pop`期间不重新应用.请参阅[此问题](http://stackoverflow.com/q/5962456/2747593). (3认同)
  • 不确定Mac上的语法是否不同但我不得不稍微修改别名`git config --global alias.hidden'!git ls-files -v | grep"^ [[:lower:]]"'` (3认同)
  • @dyodji这只影响我自己吗?还是所有用户? (2认同)

pagetribe.. 358

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

  • 另请注意,执行此操作将删除您推送到的其他存储库中的文件,即使它保留在您的系统上.如果您只是忽略对文件的更改而不想从其他用户的repos中删除它们,请尝试使用`git update-index --assume-unchanged file.name` (57认同)
  • 提示:例如,如果将`*.config`添加到`.gitignore`,则可以执行`git rm --cached*.config`来停止跟踪所有`*.config`文件. (9认同)
  • 这是删除我添加,提交的几个文件的完美方式,但后来意识到不需要跟踪.将这些文件添加到.gitignore后,我能够做到这一点并完美地解决它们. (8认同)

Antony Stubb.. 83

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

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

您必须git rm test.txt首先提交更改.只有这样test.txt才能忽略变化.

  • 这不完全正确,可以忽略跟踪文件中的更改...请参阅我的回答:http://stackoverflow.com/a/11366713/677381 (10认同)

MikeJansen.. 52

删除.gitignore中的尾部空格

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

  • 我有完全相同的问题,:P.因此,我也得到了这个问题.你在这里记录的好事.+1 (4认同)
  • 如果像我一样你使用vi快速编辑.gitignore使用':set list'来显示空格. (3认同)

Orlando.. 40

我按照这些步骤

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

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

  • 小心一点,因为它假定您要添加所有文件,但忽略的文件除外,通常情况并非如此 (3认同)

przbadu.. 37

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

谢谢


Ahmad Awais.. 30

到处复杂的答案!

只需使用以下内容

git rm -r --cached .

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

之后只需提交并推送!


Mark Salvato.. 28

要从跟踪中删除一些特定文件:

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

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

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


Iman Mohama.. 27

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

git update-index --assume-unchanged filename

  • 撤消:`git update-index --no-assume-unchanged filename` (4认同)

averydev.. 23

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

Stackoverflow救援...... 如何恢复"git rm -r."?

git reset HEAD

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

  • `git rm -r --cached .`对我不起作用.即使.tmproj在我的全局忽略文件中,Git仍然声称我的textmate项目文件没有被跟踪.尽管如此,重置我的本地复制品仍然有效.实际上我在`git reset --hard HEAD`中添加了'hard'选项.在这种情况下,这应该具有几乎相同的效果. (3认同)
  • 小心`--hard`标志.**会在没有警告的情况下抛弃任何未提交的更改! (3认同)

Olga.. 22

还有一个建议,也许是因为缓慢的家伙和我一样=)将的.gitignore文件到您的存储库根并不git的文件夹中.干杯!


Hunter S.. 22

这些答案都不适合我.

代替:

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

将文件移回后,git会忽略它.

也适用于目录!


kindahero.. 20

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

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

这很有效

# ignore my tmp folder
tmp/


Aragorn.. 19

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

  • 我试过`git rm --cached`和`git reset HEAD`这两种我非常熟悉的工具,只是从回购中得到它.成功来自第一个`rm --cached`,然后实际上手动删除它,提交删除,然后手动重新创建它.它已经消失了. (2认同)
  • 这对我有用:`rm foo/bar && git add -u && git commit -m"removed foo/bar"&& git push`.然后运行`touch foo/bar && git status`将显示该文件现在被正确忽略. (2认同)

umop.. 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.这仅适用于尚未修改的文件.


小智.. 9

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


Matt Parkins.. 9

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

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


ndemoreau.. 8

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

WWW /档案馆/*

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


Gabriel Perd.. 6

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

# 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.",当然,你没有.


Etherealone.. 6

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

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

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

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


归档时间:

查看次数:

679755 次

最近记录:

1 年,12 月 前