将git分支拆分为单独的仓库

12

我有以下的 git 树:

branch v2 =>                    / --- [lots of work] --- [new version] --- ref_d
                               /
  root --- ref_a --- ... --- ref_b (project reset)
             \
branch v1 =>  \ --- [some works] --- ref_c

由于v1和v2非常不同,两个不同的团队将维护v1和v2,我想要将两个分别的分支放在不同的Git存储库中:

repo_v1 : from root to ref_c
repo_v2 : from ref_b to ref_d

我该如何做到这一点? 谢谢。

2个回答

14
以下内容假设您已经将两个独立的新存储库设置为名为repo_v1repo_v2的远程。

v1分支很容易:

git push repo_v1 ref_c:v1

v2分支并不是很难:

git checkout --orphan v2 ref_b
git cherry-pick ref_b..ref_d
git push repo_v2 v2

(git checkout --orphan <branchname> <startpoint> 命令创建了一个全新的历史记录,始于指定点但不包含该提交的任何父提交。)


当我尝试使用新的分支名称重试时,出现了“fatal: A branch named XXX already exists”的错误。这创建了一个没有提交记录的分支。然后第二个命令“git cherry-pick a..b”也失败了(请先提交您的新分支)。因此,我提交了当前状态,但是在我看来最好的做法是将空提交作为步骤0。要添加另一个存储库:git remote add new_repo git@xxxx(参见任何文档)。然后我推送它,它完美地工作了,我在我的专用存储库中得到了目标分支和提交历史记录。 - Poutrathor

1
根据项目设置,我更倾向于:
1)为 v1 创建新的代码库。
git checkout v1
git remote add v1_repo git@gitlab.com:andrej/project-v1.git
git push v1_repo v1:master

v2 合并到 master 分支中。
git checkout master
git merge v2

2b)如果您坚持要创建2个新项目,则可以从新合并的主分支中创建新项目:

git remote add v2_repo git@gitlab.com:andrej/project-v2.git
git push v2_repo master

3) 您可以通过删除v1和v2分支来整理原始仓库:

git checkout master
git branch -D v1
git branch -d v2

在这里,您必须使用-D来强制删除v1分支,因为v1分支没有被合并。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接