你如何合并两个Git仓库?

考虑以下情况:

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

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


另一个存储库的单个分支可以轻松放置在保留其历史记录的子目录下。 例如:

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

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

从commit <rev>添加'rails /'

其中<rev>是SHA-1提交散列。 你仍然可以看到历史,并指责一些变化。

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之外,你可能还得自己安装它。


如果你想合并project-a -a到project-b

cd path/to/project-b
git remote add project-a path/to/project-a
git fetch project-a
git merge --allow-unrelated-histories project-a/master # or whichever branch you want to merge
git remote remove project-a

取自:git合并不同的存储库?

这种方法对我来说效果不错,它更短,在我看来更清洁。

注意: -- --allow-unrelated-histories参数仅在git> = 2.9之后才存在。 请参阅Git - git merge Documentation / --allow-unrelated-history


这里有两种可能的解决方案

子模块

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

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

子树合并

您可以使用子树合并策略将存储库A合并到项目B的子目录中。 这在Markus Prinz的Subtree Merging and You中有描述。

git remote add -f Bproject /path/to/B
git merge -s ours --allow-unrelated-histories --no-commit Bproject/master
git read-tree --prefix=dir-B/ -u Bproject/master
git commit -m "Merge B project as our subdirectory"
git pull -s subtree Bproject master

(git> = 2.9.0需要选项--allow-unrelated-histories允许--allow-unrelated-histories

或者你可以使用apenwarr(Avery Pennarun)的git subtree工具(github上的仓库),例如在他的博客文章中公布git子模块的新选择:git subtree。


我认为你的情况(A是要成为大型项目B的一部分),正确的解决方案是使用子树合并

链接地址: http://www.djcxy.com/p/8227.html

上一篇: How do you merge two Git repositories?

下一篇: How to merge a specific commit in Git