如何从已删除的Git远程存储库中恢复

时间:2017-02-25 07:50:46

标签: git gitlab recovery gitlab-ce

我们服务器上的vm上有一个Gitlab CE 这个Gitlab服务器上有3个人在一个存储库上工作 这个Gitlab CE vm已被意外删除! 这三个人仍然有他们的本地存储库,有很多分支 我们的分支策略是这样的:
我们有一个Master分支和每个用户的一些功能分支 用户曾经:

  • 从远程拉主人,
  • 从中分支,
  • 进行更改,
  • 再次推送到主人(通过合并请求)

现在,我有一些问题:

  1. 是否有任何方法策略可以从本地重建 - 重建远程仓库?
  2. 如果没有,我该怎么做才能创建另一个远程仓库并将所有提交合并到它?

4 个答案:

答案 0 :(得分:4)

  • 在GitLab / BitBucket / GitHub中创建一个空的仓库。

  • 使用新仓库的网址在当前仓库中添加新远程(例如another)。然后将master分支提交/更改推送到another repo的主分支。

    $ git remote add another <new-repo-url>
    $ git remote -v                 # see if the remote is added correctly 
    $ git checkout master
    
    $ git push another master       # push the changes to another/master
    
  • 如果您需要其他分支的功能(例如,feature),则只需checkoutfeature分支,然后将更改推送到another repo's {{ 1}}分支。

    feature
  • 将所有$ git checkout feature $ git push another feature # push changes to 'another' repo's 'feature' branch branches推送到tags回购。

    another

N.B。此处,$ git push --all --tags another 代表您新的回购网址。

答案 1 :(得分:3)

由于您的遥控器已被删除,您还没有任何来源,所以您必须在本地检查“远程”分支并为其分配原始名称,而不是将所有分支推送到遥控器。

如果您不希望本地分支机构只需按下您需要的分支机构。

这是一个用于结帐所有分支而不是将它们推送到新远程

的脚本
#!/bin/bash

# add the new origin 
git remote add origin2 <url>

# loop over all the original branches and set the new remote as the new track origin
for branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master `; do
    git branch --track ${branch#remotes/origin2/} $branch
done

# now push all branches and tags
git push origin2 --all    
git push origin2 --tags

脚本有什么作用?

<强> git branch -a
获取所有本地分支的列表

<强> | grep remotes 分支名称为:'remotes / origin /',因此这将从分支名称中删除遥控器

<强> | grep -v HEAD | grep -v master
删除master(当前分支)和HEAD,它是最新提交的别名

答案 2 :(得分:2)

您可以复制(或克隆 - 禁用)其中一个本地存储库,并重新设置/删除未合并到远程仓库的提交。之后,您可以将此作为远程使用。

答案 3 :(得分:0)

我不小心删除了“起源”上的分支。但是我仍然有本地副本。这是我在“ origin”上重新创建分支的方法:

当我切换到本地副本时,看到了以下消息:

Switched to branch 'my-special-branch'
Your branch is based on 'origin/my-special-branch', but the upstream is gone.
  (use "git branch --unset-upstream" to fixup)

我用过:

git branch --unset-upstream

这使分支恢复到正常的未按下状态。为了让它恢复原状,我就跑了

git push --set-upstream origin my-special-branch