3

有没有办法将远程分支指针重置为您知道在远程 reflog 中但在本地存储库中没有的 SHA?

我非常熟悉重置(软/混合/硬)在本地存储库上的工作方式,但这对我没有帮助。

这是我要解决的情况。我已经有一段时间没有进行 fetch 了,远程 master 已经更新了一个我在本地还没有的合并。

我搞砸了,git push --force只更新了远程功能分支,但忘记了一个参数,最终强制功能分支和主控到我在本地的修订。

这意味着 master 现在缺少自我上次获取以来发生的合并提交。我们使用的是 github,所以我收到了一封电子邮件,告诉我 master 之前所在的 SHA。我还能够访问 url 并看到提交仍然存在(尚未收集垃圾)。

我能够通过重做我丢失的合并并再次将其推出来“修复”它(最终改变了 SHA,因为它是不同的提交者和时间)。这不是最优的,如果我在 master 上丢失了多个合并提交,情况可能会更糟。

我想做的只是reset --hard它应该位于的 SHA 的远程 master 分支。如果没有对 repo 的 SSH 访问权限,有什么方法可以做到这一点?

这是在 github 上,所以我没有直接访问 repo 的权限,无法直接 ssh 并重置它。

4

3 回答 3

4

我不认为您可以直接访问/重置 GitHub 上的任何内容,而无需询问他们.
即,无需联系 GitHub 支持,让他们查看您的 GitHub 存储库的 reflog。
他们将能够通过创建新分支或将其重置为现有分支来使丢失的 SHA1 可见。

实际上,repo 所有者可以查询 GitHub Event API
请参阅“ github 是否记得提交 ID? ”。


OP Ted Naleid确认,提到这个线程(和这个)作为一个原因:

这是设计使然。
也就是说,当你不小心推送了秘密数据时,你可以在服务器上回滚你的 refs。
即使这些对象仍然存在于服务器上(直到它们被垃圾收集),即使他们碰巧知道 SHA1,也没有人能够获取您的秘密资料。

Dan Molding在他自己的回答的评论中确认如下:

我做了更多测试,发现克隆行为因使用的协议而异。

  • 通过 SSH 克隆(可能是通过 git 协议)的行为与您描述的一样;即无法访问的提交不会转移到克隆。
    现在我也用 HTTPS 测试了它(使用 GitHub 本身)。而且看起来不太好;克隆不会获得无法访问的对象。

  • 但是,在本地克隆时,所有提交(无论是否无法访问)都会被转移。

(但 OP 澄清说,这仅仅是因为使用本地克隆,默认情况下,目录下的文件.git/objects/是硬链接以尽可能节省空间。
git clone --no-hardlinks file:///Users/yourUser/your/full/repo/path repo-clone-name不会传输无法访问的提交)

于 2012-07-16T06:46:22.783 回答
3

你试过git push --force origin <sha>:master吗?这应该在原点上设置 master 指向你给它的任何 SHA,不问任何问题。

于 2012-07-16T17:14:12.727 回答
1

您是否尝试过将 GitHub 存储库克隆到新的本地存储库?我相信克隆可能包括“丢失”的对象。然后,您将在新克隆的存储库中拥有“丢失”的对象。您可以在本地进行重置,然后将固定的 refs 推送回 GitHub。

于 2012-07-16T12:16:15.287 回答