我建议使用 subtree 两次——一次提取所有 /www/tools,一次提取 /public——听起来 /public 应该在它自己的仓库中,所以我建议你将 /public 推送到一个新的仓库——使用所有这些都是子树历史,然后将 /www/tools 的子树历史合并到新的 /public 存储库中,并将其作为 Foo 的子树添加回来。
cd foo
git subtree split --prefix=public --branch=new-shared-public --annotate='(split) '
cd../bar
git subtree split --prefix=www/tools --rejoin --branch=new-shared-www-tools --annotate='(split) '
现在,您的存储库上有两个新分支。一个带有公共的提交历史,另一个带有 www/tools。我cd
从这里省略。
创建你的新公共仓库(我假设这里是 github,但听起来你可能想在本地做)并在那里推送你的子树: git checkout new-shared-public git push git@github.com:my_id/new-shared- repo.git 头:主
然后将您的另一个分支合并到该分支中:
git checkout new-shared-www-tools
git remote add Foo git@github.com:my_id/new-shared-repo.git
git merge -s ours --no-commit Bar/master
虽然我已经指定ours
了提交策略,但它可能(可能)并不重要。
最后,在您执行合并并将其推送到新存储库之后,返回到 Foo 存储库。从那里 Git rm 公共历史并将新的公共回购添加为子树:
git subtree add --squash --prefix shared git@github.com:my_id/new-shared-repo.git master
git subtree pull --squash --prefix shared git@github.com:my_id/new-shared-repo.git master
git push