组合Git存储库,保存历史记录和REFS

时间:2018-10-26 07:02:02

标签: git

我有几个Git仓库,我想合并成一个。我在网上找到了几篇文章,例如

他们通过将它们作为远程获取来获取不同存储库的提交图。

但是,通过查看这些步骤,似乎可以保留提交历史记录,但是引用并没有保留。

我想要的是:

  • 假设我有两个仓库,foobar
  • 我希望它们的历史存在于combined回购中
  • 在新的combined存储库中,我希望能够以foo为后缀引用foo/中的现有分支和标记。因此,如果在v1.0foo中都有相同的标记bar,则在foo/v1.0仓库中它将变为bar/v1.0combined

我正在考虑采用这种方式,并希望与专家进行澄清以确保其有效:

  1. 在本地克隆了foobar仓库,并提取了标签
  2. 使用初始提交创建新的combined存储库
  3. foobar的{​​{1}}复制到.git/objects(这应包含combined/.git/objects和{{1}的所有blob,树和提交}到foo正确吗?)
  4. bar复制到combined。为foo/.git/refs/remotes/origin/*
  5. 做类似的事情
  6. combined/.git/refs/heads/foo/*存储库重复4
  7. foo/.git/refs/tags/*bar的更新后的.git/refs.git/logs/refs/heads(不包括.git/logs/refs/remote)复制到foo
  8. bar合并到combined,然后将所有内容移至foo/master
  9. master
  10. 执行相同操作

在我看来它可以正常工作,但我担心自己可能忽略了一些可能破坏存储库的内容,这就是为什么我在这里征求意见。

1 个答案:

答案 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,您就应该接近完美了。


这不会保留每个分支的引用日志,您可能需要在此处进行一些手动修改。