过滤master后,如何检索旧主服务器上的存储更改?

时间:2011-01-30 16:16:58

标签: git git-filter-branch git-stash

我跟着GitHub's instructions for removing sensitive files from a git repository,因为我想删除一些本不应该签入的二进制文件。

我对git filter-branch命令的第一次调用失败了:

  

无法使用脏工作目录重写分支。

因为我有本地更改。所以,我用git stash隐藏了这些更改,并重新运行了filter-branch命令。

然后我根据GitHub指令运行这些命令:

rm -rf .git/refs/original
git reflog expire --expire=now --all
git gc --prune=now
git gc --aggressive --prune=now

删除二进制文件似乎完美无缺。但是,当我现在键入git stash list时,不会显示我在旧主服务器上添加的存储条目。

在我第二次执行filter-branch命令之前,我所拥有的是git stash的输出:

Saved working directory and index state WIP on master: a19db18 LOG_MESSAGE
HEAD is now at a19db18 LOG_MESSAGE

此外,a19db18332b19ea41be888eccfc07e6680d8d6dd是被重写的提交之一。

有没有办法检索隐藏的更改?

1 个答案:

答案 0 :(得分:1)

除非你能记住存储提交对象的SHA1哈希值(是的,stashes create commit objects),否则存储可能会丢失。一种选择是使用git fsck --lost-found并查找悬空提交对象。然后你必须逐个完成,直到找到你藏匿的那个。您可以使用gitk查看所有这些提交(请参阅git fsck帮助页面以获取有关如何执行此操作的示例),并希望更轻松地找到存储提交。找到提交后,可以在每个提交上使用git cherry-pick,清除所有冲突,然后执行git reset HEAD~2(因为每个存储都有两次提交)。你应该好好去。

我从来没有做过藏匿,然后就像过滤器分支一样危险。将来,我建议您对正在进行的工作进行实际提交 - 也许将其放在新的分支上。然后运行危险的操作。之后,您可以使用上面的混合重置回滚提交。