在'git push --mirror'之后恢复已删除的分支

时间:2015-07-31 18:19:32

标签: git github

我的组织在GitHub上有一个远程存储库,它是另一个存储库的分支。我在我的本地机器上制作了一个克隆,并创建了一个本地分支'test'。以下是随后的命令列表:

git fetch origin '+refs/heads/*:refs/remotes/origin/*'
git push --mirror
git push --all

接下来的事情就是噩梦。在我的本地计算机上未检出的任何远程分支已在存储库中删除。我已经完成了git branch -a但是只显示了本地副本中存在的远程分支。我已完成git reflog show但只显示当前分支HEAD上的日志。做git fsck显示6'悬空提交'和2'悬空blob'。在做git push --mirror之前,分支有16个分支,其中5个由我们的组织创建,其余分支来自原始分支。我知道之前已经提出了类似的问题(如果不是相同的话),但在这一点上,这些问题都没有任何意义。我对能阻止我被解雇的任何人表示最崇高的敬意和最高的谢意。

2 个答案:

答案 0 :(得分:1)

有几件事要尝试。前两种方法将帮助您恢复以前是分支提示的SHA1。但有一点难以恢复的是缺失分支的名称,除非之前已知过。

  1. 如果您最近访问过某些分支机构,您的reflog将提供以下提示:

    git reflog
    
  2. 您可以使用以下命令创建所有悬空和丢失和找到的提交的列表:

    git fsck --full --no-reflogs --unreachable --lost-found | \
      grep commit | \
      cut -d" " -f3 | \ 
      xargs -n 1 git log -n 1 --pretty=oneline > .git/lost-found.txt
    

    然后查看提交是否与丢失的分支匹配。

  3. 如果您知道要恢复的分支的名称,那么您也可以尝试:

    1. 您可以使用contrib目录中的git-resurrect.sh来尝试通过扫描您的reflog和其他来源来“复活”过去的分支。这非常慢,大型存储库可能需要很长时间。

答案 1 :(得分:1)

如果您对推送到的遥控器有文件系统访问权限,则可以从MYREPO.git/info/refs恢复已删除的分支。

内容看起来像这样。

2ef208a632946dd4b5fd6f124a7fd6fc1c2ab87e        refs/heads/foo-feature
7325d39f52d6663e33f360b3bd666300ce2c52b0        refs/heads/bar-feature

对于您要恢复的每个分支,请在本地回购中创建一个文件。

$ echo 2ef208a632946dd4b5fd6f124a7fd6fc1c2ab87e > .git/refs/heads/foo-feature

然后,将新恢复的分支推送回服务器。

$ git push --all