如何从已删除的 Git 远程存储库中恢复
how to recover from a Git remote repository deleted
我们在服务器的虚拟机上有一个 Gitlab CE。
有 3 个人在这个 Gitlab 服务器上处理一个存储库。
这个Gitlab CE vm被意外删除了!
这 3 个人的本地仓库还有很多分支。
我们的分支策略是这样的:
我们有一个主分支和每个用户的一些功能分支。
用户习惯于:
- 从远程拉主,
- 从中创建一个分支,
- 进行更改,
- 再次推送到 master(通过合并请求)
现在,我有一些问题:
- 有什么方法可以从本地重新创建远程仓库吗?
- 如果没有,我应该如何创建另一个远程仓库并将所有提交合并到它?
在 GitLab/BitBucket/GitHub 中创建一个空存储库。
在您当前的仓库中使用新仓库的 URL 添加一个新的遥控器(例如,another
)。然后将你的 master
分支 commits/changes 推送到 another
仓库的主分支。
$ 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
),那么只需 checkout
到 feature
分支并将更改推送到 another
回购的 feature
分支。
$ git checkout feature
$ git push another feature # push changes to 'another' repo's 'feature' branch
将所有 branches
和 tags
推送到 another
仓库。
$ git push --all --tags another
N.B. 这里,another
代表你的新仓库的 URL.
您可以复制(或克隆 --bare)其中一个本地存储库和 rebase/delete 未合并到远程存储库的提交。之后你就可以用这个作为遥控器了。
由于您的远程已被删除,您还没有任何来源,因此您必须在本地检查“远程”分支并为其分配原始名称,然后将所有分支推送到远程。
如果您不想要本地分支机构,只需推送您需要的分支机构即可。
这是我用来检查所有分支然后将它们推送到新远程的凭据
#!/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
删除主(当前分支)和 这是最新提交的别名
我在 "origin" 上不小心删除了我的 b运行ch。但我仍然有一份本地副本。这是我在 "origin":
上重新创建 b运行ch 的方法
当我切换到本地副本时,我看到了这条消息:
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
这使 b运行ch 恢复到正常的未推送状态。为了让它回到原点,我只是 运行
git push --set-upstream origin my-special-branch
我们在服务器的虚拟机上有一个 Gitlab CE。
有 3 个人在这个 Gitlab 服务器上处理一个存储库。
这个Gitlab CE vm被意外删除了!
这 3 个人的本地仓库还有很多分支。
我们的分支策略是这样的:
我们有一个主分支和每个用户的一些功能分支。
用户习惯于:
- 从远程拉主,
- 从中创建一个分支,
- 进行更改,
- 再次推送到 master(通过合并请求)
现在,我有一些问题:
- 有什么方法可以从本地重新创建远程仓库吗?
- 如果没有,我应该如何创建另一个远程仓库并将所有提交合并到它?
在 GitLab/BitBucket/GitHub 中创建一个空存储库。
在您当前的仓库中使用新仓库的 URL 添加一个新的遥控器(例如,
another
)。然后将你的master
分支 commits/changes 推送到another
仓库的主分支。$ 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
),那么只需checkout
到feature
分支并将更改推送到another
回购的feature
分支。$ git checkout feature $ git push another feature # push changes to 'another' repo's 'feature' branch
将所有
branches
和tags
推送到another
仓库。$ git push --all --tags another
N.B. 这里,another
代表你的新仓库的 URL.
您可以复制(或克隆 --bare)其中一个本地存储库和 rebase/delete 未合并到远程存储库的提交。之后你就可以用这个作为遥控器了。
由于您的远程已被删除,您还没有任何来源,因此您必须在本地检查“远程”分支并为其分配原始名称,然后将所有分支推送到远程。
如果您不想要本地分支机构,只需推送您需要的分支机构即可。
这是我用来检查所有分支然后将它们推送到新远程的凭据
#!/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
删除主(当前分支)和
我在 "origin" 上不小心删除了我的 b运行ch。但我仍然有一份本地副本。这是我在 "origin":
上重新创建 b运行ch 的方法当我切换到本地副本时,我看到了这条消息:
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
这使 b运行ch 恢复到正常的未推送状态。为了让它回到原点,我只是 运行
git push --set-upstream origin my-special-branch