我有几个Git仓库,我想合并成一个。我在网上找到了几篇文章,例如
他们通过将它们作为远程获取来获取不同存储库的提交图。
但是,通过查看这些步骤,似乎可以保留提交历史记录,但是引用并没有保留。
我想要的是:
foo
和bar
combined
回购中combined
存储库中,我希望能够以foo
为后缀引用foo/
中的现有分支和标记。因此,如果在v1.0
和foo
中都有相同的标记bar
,则在foo/v1.0
仓库中它将变为bar/v1.0
和combined
我正在考虑采用这种方式,并希望与专家进行澄清以确保其有效:
foo
和bar
仓库,并提取了标签combined
存储库foo
和bar
的{{1}}复制到.git/objects
(这应包含combined/.git/objects
和{{1}的所有blob,树和提交}到foo
正确吗?)bar
复制到combined
。为foo/.git/refs/remotes/origin/*
combined/.git/refs/heads/foo/*
存储库重复4 foo/.git/refs/tags/*
和bar
的更新后的.git/refs
和.git/logs/refs/heads
(不包括.git/logs/refs/remote
)复制到foo
bar
合并到combined
,然后将所有内容移至foo/master
master
在我看来它可以正常工作,但我担心自己可能忽略了一些可能破坏存储库的内容,这就是为什么我在这里征求意见。
答案 0 :(得分:1)
使用遥控器并执行git
命令将有助于您避免反向工程陷阱。
例如:somme refs实际上存储在.git/packed-refs
中,您不要忘记考虑它们。
(现在已概述了这一点,问题在于发现了我们未概述的 other 点;))
您可以将foo
遥控器(分别为bar
)的参考规范编辑为+refs/*:refs/foo/*
(分别为+refs/*:refs/bar/*
),
或更确切地说:
+refs/heads/*:refs/heads/foo/* # map foo branches to local branches named 'foo/*'
+refs/tags/*:refs/tags/foo/* # map foo tags to local tags named 'foo/*'
然后只需运行git fetch
,您就应该接近完美了。
这不会保留每个分支的引用日志,您可能需要在此处进行一些手动修改。