我有一个文件“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
我不确定,为什么会出现这个问题,因为空白区域(我猜不是,因为我把它放入引号中)或因为文件不在当前的头部?我怎么能告诉他这个文件的位置?
有没有办法,如何在没有过滤器分支的情况下做到这一点?我只添加了一次文件然后将其删除,所以它的历史非常简单
答案 0 :(得分:3)
filter-branch
的“问题”与修改已推送提交历史记录的任何命令相同。如果其他人已经得到了这个提交并且有一个基于它的分支,他将不得不手动修复他的历史记录(即手动修改其他历史记录),如标题RECOVERING FROM UPSTREAM REBASE标题下的git rebase
帮助所述。
如果要从历史记录中清除文件,因为它是e。 G。包含密码等机密信息,除了您使用的工具外,您无其他机会修改历史记录,无论是git rebase -i
,git 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完成后,你应该有一个没有文件的历史新版本。