如何合并两个Git仓库?

  • 回答 (2)
  • 关注 (0)
  • 查看 (207)

"考虑以下情况:

我在自己的Git回购中开发了一个小实验项目A. 现在它已经成熟了,我希望A成为大型项目B的一部分,它有自己的大型仓库。我现在想添加A作为B的一个子目录。

如何将A合并到B中,而不会丢失任何一方的历史记录?"

汐雲風汐雲風提问于
晓小峰哦鹅厂云的死忠粉,说企鹅不好就炸的那种!回答于

子模块

将存储库A复制到大型项目B中的单独目录中,或者(可能更好)将存储库A复制到项目B中的子目录中。然后使用git子模块将此存储库作为存储库B 的子模块。

对于松散耦合的存储库来说,这是一个很好的解决方案,在存储库A中的开发仍在继续,而大部分开发是在A中单独独立开发的。另请参阅Git Wiki上的子模块支持和GitSubmoduleTutorial页面。

子树合并

可以使用子树合并策略将存储库A合并到项目B的子目录中。

git remote add -f Bproject /path/to/B
git merge -s ours --allow-unrelated-histories --no-commit Bproject/maste
git read-tree --prefix=dir-B/ -u Bproject/maste
git commit -m "Merge B project as our subdirectory"
git pull -s subtree Bproject maste
(--allow-unrelated-historiesgit> = 2.9.0需要选项)

或者你可以使用apenwarr(Avery Pennarun)的git subtree工具(github上的仓库)

Tabor

Tencent · Content Operation (已认证)

一个会花式跑脚本的boy~回答于

一个存储库的单个分支可以很容易地放置在保存其历史的子目录下。例如:

git subtree add --prefix=rails git://github.com/rails/rails.git maste

这将作为一个单独的提交,其中Rails主分支的所有文件都被添加到“rails”目录中。但是,提交的标题包含对旧历史树的引用。

Add 'rails/' from commit <rev>
git log <rev>
git blame <rev> -- README.md

请注意,不能从这里看到目录前缀,因为这是一个完整的旧分支。应该像通常的文件移动提交一样对待

# finishes with all files added at once commit
git log rails/README.md
# then continue from original tree
git log <rev> -- README.md

还有其他更复杂的解决方案,如手动执行或重写其他答案中所述的历史记录。

git-subtree命令是官方git-contrib的一部分,一些数据包管理器默认安装它(OS X Homebrew)。但是你可能需要自己安装它,除了git

扫码关注云+社区

领取腾讯云代金券