梳理Git存储库,保存历史和参考
我有几个Git回购,我想合并成一个。我在网上找到了几篇文章,比如梳理Git存储库,保存历史和参考,git,Git,我有几个Git回购,我想合并成一个。我在网上找到了几篇文章,比如 他们通过远程获取不同repo的提交图 然而,通过查看这些步骤,似乎可以看出,尽管提交历史记录被保留,但引用却没有 我想要的是: 假设我有两个回购,foo和bar 我希望它们的历史记录存在于合并的回购协议中 在新的combinedrepo中,我希望能够以foo/作为后缀引用foo中的现有分支和标记。因此,如果在foo和bar中都有相同的标签v1.0,则在组合repo中它将变成foo/v1.0和bar/v1.0 我正在考
- 假设我有两个回购,
和foo
bar
- 我希望它们的历史记录存在于
回购协议中合并的
- 在新的
repo中,我希望能够以combined
作为后缀引用foo/
中的现有分支和标记。因此,如果在foo
和foo
中都有相同的标签bar
,则在v1.0
组合
repo中它将变成
和foo/v1.0
bar/v1.0
foo
和bar
repos,并提取标记组合的存储库
foo
和bar
的.git/objects
复制到combined/.git/objects
(这将把foo
和bar
的所有blob、tree和提交带到combined
对吗?)foo/.git/refs/remotes/origin/*
复制到combined/.git/refs/heads/foo/*
。对foo/.git/refs/tags/*
bar
存储库重复4次foo
和bar
的更新.git/refs
和.git/logs/refs/heads
(不包括.git/logs/refs/remote
)复制到组合的
foo/master
合并到master
,并将所有内容移动到foo/
条执行相同操作
在我看来,它会起作用,但我担心我可能忽略了一些可能会破坏存储库的东西,这就是我在这里征求意见的原因。使用遥控器和执行
git
命令将帮助您避免逆向工程陷阱
例如:somme引用实际上存储在.git/packed refs
中,您不应该忘记考虑它们
(现在,这一点已经概述,问题在于找出我们没有概述的其他要点;)
您可以将
foo
remote(resp.bar
)的refspec编辑为类似+refs/*:refs/foo/*
(resp.+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
,您应该已经接近好了
这不会保留每个分支的reflog,您可能需要在此处进行一些手动操作。当然,我可以按照问题中链接中的建议使用reomte,并使用脚本逐个重命名每个分支/标记,然后对下一个远程分支/标记执行相同操作。然而,这对我来说似乎很麻烦。如果我像上面所想的那样操作
.git
,会有什么问题?只是:使用官方api(例如git
命令)会比反向工程实现产生更少的bug。例如:使用git clone/git fetch
可确保git
实际列出所有引用(例如,一些存储在packed refs
中)(供您更新)refs/remotes/foo
的存在毫无意义,因为一旦我发布此repo供我们的团队使用,他们不会有和我的组合遥控器一样的遥控器。我希望能够将原始存储库的标记/分支放在新的组合存储库中,这是打包引用的良好点。似乎找不到捷径…:(谢谢(我一直在寻找一种合适的方法来做你想做的事情):对每个遥控器使用REFSEC