5

我们在服务器的虚拟机上有一个 Gitlab CE。
有 3 个人在这个 Gitlab 服务器上的单个存储库上工作。
这个 Gitlab CE vm 被意外删除了!这 3 个人仍然有他们的本地存储库和很多分支。
我们的分支策略是这样的:
我们有一个 Master 分支和每个用户的一些功能分支。
用户习惯:

  • 从远程拉主,
  • 用它做一个分支,
  • 做出改变,
  • 再次推送到master(通过合并请求)

现在,我有一些问题:

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

4 回答 4

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

  • 在您当前的 repo 中添加一个新的远程(比如,another),并使用新 repo 的 URL。然后将您的master分支提交/更改推送到anotherrepo 的主分支。

    $ 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分支并将更改推送到anotherrepo 的feature分支。

    $ git checkout feature
    $ git push another feature      # push changes to 'another' repo's 'feature' branch
    
  • 推所有branches和回购tagsanother

    $ git push --all --tags another
    

注意这里,another代表你的新仓库的 URL。

于 2017-02-25T07:54:49.763 回答
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,它是最新提交的别名

于 2017-02-25T07:59:46.647 回答
2

您可以复制(或克隆--bare)本地存储库之一并重新设置/删除未合并到远程存储库的提交。之后,您可以将其用作遥控器。

于 2017-02-25T07:58:25.510 回答
0

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

当我切换到本地副本时,我看到了这条消息:

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
于 2020-05-26T12:16:38.330 回答