如何使用git子树将子文件夹的多个分支迁移到另一个repo

时间:2014-04-28 15:14:15

标签: git git-subtree

我喜欢从存储库1迁移具有完整历史记录的子文件夹:

a -> b -> c (branch 1)
      \-> d (branch 2)

到存储库2中的同一目标文件夹:

          old -> merged_subfolder (master)
              /
a* -> b* -> c* (branch 1)
        \-> d* (branch 2)

表示对子文件夹的限制。

到目前为止,我已经使用了

git subtree split -P subfolder -b branch_1
git subtree split -P subfolder -b branch_2
git subtree add -P target_folder repo_1 branch_1

然后我在存储库2中的b *处创建了分支2,但是

git subtree add -P ./ repo_1 branch_2

不起作用,因为

prefix './' already exists.

有任何解决问题的建议吗?

后来,如何将分支2与存储库2中的master合并?

1 个答案:

答案 0 :(得分:1)

-b的{​​{1}}选项指定要创建的新分支,其中包含新历史记录,而不是用于创建历史记录的分支。您创建了两个新分支git subtree splitbranch_1,它们都包含您当前所在分支的新历史记录。

  

然后我在存储库2中的b *创建了分支2

这没有任何效果。 branch_2从存储库中提取提交及其历史记录,并将其合并到当前分支中;它根本不会查看其他分支名称。

  

前缀'./'已经存在。

您无法为现有目录添加子树。添加子树而不合并它只是一个普通的提取;你显然仍然可以添加(和合并)一个子树,然后恢复合并。

总之,要进行完整迁移:

git subtree add

如果您以后决定将第二个分支合并到主项目中,请执行

# in repository 1
git subtree split -P subfolder -b branch_1_new branch_1
git subtree split -P subfolder -b branch_2_new branch_2

# in repository 2
git subtree add -P target_folder repo_1 branch_2_new
git branch branch_2 HEAD^2
git reset --hard HEAD^
git subtree add -P target_folder repo_1 branch_1_new
git branch branch_1 HEAD^2