我们有3个独立的git存储库(每个都有一些分支),我们希望将它们合并为一个保存完整的历史记录和访问分支的能力,如下所示:
所以这就是我们所拥有的。 3回购:
/A/.git
/B/.git
/C/.git
我们希望有一个包含3个子目录的超级仓库:
super/.git
super/A
super/B
super/C
并说当切换到分支feature1(最初在repo B中,在repo C尚不存在的时候引入)我们期望结果是:
super/.git
super/A
super/B
我们已经阅读了Combining multiple git repositories,但是使用git-stitch-repo遇到了麻烦,它基本上只是宣传了super-repo中缺少大量的提交(没有任何错误消息指向一个问题)。
任何想法我们在这里做错了什么?
修改 我们知道子模块和子树合并,但两者都不是一个选项。这应该是一次性操作。我们需要一次又一次加入repos。
修改 可能是一个更简单的方法来提出基本相同的问题:说我们有一个回购与3个完全不相关的分支。我们可以将它们合并而没有冲突到一个分支(因为它们不共享文件)。现在,在查看历史时,我们会看到3个不相关的提交分支以及它们聚集在一起的一个点。但我们希望看到的是一个由所有3个分支的交错(按日期/时间)提交组成的分支。
答案 0 :(得分:1)
你不需要子模块,因为你将使用你将要发出的所有git子模块更新命令拉出你的头发。您还必须发出3个git log命令而不是一个,以查看在一定时间内发生的事情。
将所有历史记录整合到一个回购中。使用filter-branch重置每个repos历史记录所在的目录。无需拼接。完成过滤器分支后,您可以随时合并。
基本上repoA / master,repoB / master和repoC / master将存在于你制作的新repo中(尽管你可以从其中一个开始)。应用过滤器分支后,每个提交中的每个树都将有一个新的根节点,该节点将是一个目录(A代表repoA分支,B代表repoB分支等)。
OR
git checkout -b newbranch --root
git log --all --format=%ad%H | sort | cut -c10- | xargs -n 1 git cherry-pick
调整剪切所以它只需要哈希。没试过,但让我知道它是如何工作的。您可能需要首先使用rebase压缩历史记录。您不能交错不同的分支并从3个不同的历史中合并。
希望这会有所帮助。
答案 1 :(得分:1)
splice_repos是我编写的一个工具,它将来自不同存储库的提交交错到一个新的存储库,以便同名的分支获得合并的历史记录(就好像它们按历史顺序提交),而不仅仅是合并最后在不同的分支上有不同的历史。它背后有blog entry describing the rationale。
答案 2 :(得分:-1)
最简单的方法可能是使用submodules。它并不完全符合您希望实现的情况,但它非常接近并且不会让人头疼。
只需创建一个新目录并将其作为“超级”仓库进行初始化即可。然后使用上面链接中给出的命令添加A,B和C回购。