git,永久删除存储库中的文件

时间:2017-05-18 08:42:45

标签: git

我有一个文件“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

我不确定,为什么会出现这个问题,因为空白区域(我猜不是,因为我把它放入引号中)或因为文件不在当前的头部?我怎么能告诉他这个文件的位置?

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

1 个答案:

答案 0 :(得分:3)

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

如果要从历史记录中清除文件,因为它是e。 G。包含密码等机密信息,除了您使用的工具外,您无其他机会修改历史记录,无论是git rebase -igit filter-branch还是名为BFG的工具。< / p>

使用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完成后,你应该有一个没有文件的历史新版本。