【问题标题】:Remove a file from a repository permanently, git从存储库中永久删除文件,git
【发布时间】:2017-05-18 08:42:44
【问题描述】:

我有一个文件“npz,species_coex.npz”,它被错误地添加到了我的 git 存储库中。在意识到我的错误后,我用 git rm 将其删除。现在我发现,git 仍然知道它(这通常很好,但我希望 git 完全忘记它,就好像它从来没有添加过一样)。

我已阅读有关 filter-branch 命令的信息,但不想使用它,因为所有关于它的警告,如果这不可能,请告诉我。

我读过this,他们推荐:

$ git filter-branch --tree-filter 'rm -f "npz, species_coex.npz" ' HEAD

我得到错误:

fatal: ambiguous argument 'npz, species_coex.npz': unknown revision or path not in the working tree

我不确定,为什么会出现这个问题,因为空格(我猜不是,因为我把它放在引号中)或者因为文件不在当前头部?我怎样才能告诉他这个文件在哪里可以找到?

有没有办法,我如何在没有过滤器分支的情况下做到这一点?我只添加了一次文件然后删除了它,所以它的历史很简单

【问题讨论】:

  • --tree-filter 非常慢,但引用的建议应该有效。看来您实际上在filter-branch 中使用了git rm 而不仅仅是rm。要更快地删除不需要的文件,请考虑使用“BFG”(搜索该名称);但请注意,它与任何过滤器分支都有相同的问题:您必须将存储库,或至少将“坏”文件及其之后的所有部分复制到不再与原始提交兼容的新提交,并且 每个人都必须改变以适应这种情况。

标签: git


【解决方案1】:

filter-branch 的“问题”与任何修改已推送提交历史的命令相同。如果其他人已经得到了这个提交并且有一个基于它的分支,他将不得不手动修复他的历史记录(即手动修复每个其他的历史记录),就像 git rebase 在标题 RECOVERING FROM UPSTREAM REBASE 下的帮助中描述的那样。

如果你想从历史记录中清除文件,因为它 e. G。包含密码等机密信息,您只能修改历史记录,无论您使用哪种工具,无论是git rebase -igit filter-branch还是名为BFG的工具。

对于filter-branch,您不应使用--tree-filter,因为每次提交都需要一个完整的工作树。如果您想添加或更改某些文件,这是必要的。如果只是删除文件,则应改用--index-filter,并且只对索引进行操作,而不是对不可用的工作树进行操作。然后,您的过滤器命令将类似于 --index-filter 'git rm --cached --ignore-unmatch "npz, species_coex.npz"'

您在尝试时遇到的错误意味着您在过滤命令中没有使用rm ...,而是使用git rm ...,但没有--ignore-unmatch,它告诉git在您尝试删除不存在的文件时忽略它,类似于-f 对普通rm 实用程序所做的操作。

如果您将文件添加了几个提交,那么使用交互式 rebase 可能会更容易和更快。只需执行git rebase -i <the commit before the one that added the file>,然后在编辑器中将添加文件的提交的pick 节更改为edit,然后退出编辑器。当 Git 停止时,从当前提交中删除文件,如 git rm 'npz, species_coex.npz' && git commit --amend -C HEAD,并继续使用 git rebase --continue 进行变基。在 Git 完成之后,你应该有一个没有该文件的新版本的历史记录。

【讨论】:

  • 感谢您的帮助,但没有任何帮助:如果我输入 git filter-branch --index-filter 'git rm ...' 他说致命:模棱两可的参数 'rm': 未知修订或路径不在工作树中。所以我尝试了正常的rm,但他只是说用法:git filter-branch ...并解释了如何使用过滤器分支命令。您使用的第二个选项不起作用/我不知道该怎么做,因为它是添加此文件的所有提交中的第一个,所以不确定我应该签出什么。
  • 谢谢,现在一切正常(只需要执行 git rebase --root)
  • 是的,如果它是第一个应该更改的提交,那么 rebase 需要 --root 而不是上游提交。但是filter-branch 也应该有效。当然不是rm,因为在--index-filter 中没有工作树,所以你不能删除rm 的文件,正如我在答案中解释的那样。但是使用git rm --cached --ignore-unmatch "npz, species_coex.npz" 它应该可以工作。我需要查看完整的命令来告诉你你做错了什么。
  • 因为我已经解决了问题,所以我不想重现错误,因为我仍然害怕失去一切;)但是我很确定命令是:git filter-branch --index-filter 'git rm --cached --ignore-unmatch "npz, coex_species.npz" '。因为它没有运行我也试过 git filter-branch --tree-filter 'git rm --cached --ignore-unmatch "npz, coex_species.npz" '
  • 嗯,很奇怪。对我来说很好。当然不会改变任何东西,因为我没有这样的文件,但不会发生错误。
猜你喜欢
  • 2016-06-15
  • 2013-03-24
  • 1970-01-01
  • 2010-11-16
  • 2021-12-30
  • 2016-08-27
  • 2013-11-07
  • 2011-01-04
相关资源
最近更新 更多