"考虑以下情况:
我在自己的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上的仓库)
一个存储库的单个分支可以很容易地放置在保存其历史的子目录下。例如:
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