2

我按照GitHub 的说明从 git 存储库中删除敏感文件,因为我想删除一些不应该签入的二进制文件。

我第一次调用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,我在旧主服务器上添加的存储条目不会显示。

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

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

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

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

4

1 回答 1

1

除非您能记住存储提交对象的 SHA1 哈希(是的,存储创建提交对象),否则存储可能会丢失。一种选择是使用git fsck --lost-found并寻找悬空提交对象。然后,您必须一一检查,直到找到您的藏匿处。您可以使用 gitk 查看所有这些提交(git fsck有关如何执行此操作的示例,请参见帮助页面),并希望更容易找到隐藏提交。找到提交后,您可以git cherry-pick在每个提交上使用,清理任何冲突然后执行git reset HEAD~2(因为每个存储有两个提交)。那你应该可以走了。

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

于 2011-01-30T17:41:20.860 回答