(1)如何在github上将两个subversion repo(其中一个是另一个的外部)转换为单个git repo?我希望历史是交错的,这样gitk输出是有意义的!
(2) 为什么我要使用svnadmin转储,而不是只使用git clone
对它们进行处理然后移动它们?
(3) 如何测试我的新存储库以查看它是否与旧的存储库对匹配?
为了回答这些问题,假设两个subversion存储库位于http://acl2-devel.googlecode.com/svn和http://acl2-books.googlecode.com/svn,并且这两个存储库都是使用标准svn布局(trunk、branches、tags)设置的。此外,假设我想要一个干净的休息,并希望分支和标签有一个新的开始。
(1)以下是我如何将两个repo合并为一个git repo的元级别讨论。
- 使用svnsync和svnadmin转储subversion存储库
- 创建一个新的svn存储库,其中books repo安装在books中子目录
- 从svn存储库中删除所有分支和标记(但保留他们的历史)
- 将svn repo转换为git,规范化电子邮件以匹配github帐户电子邮件地址
- 使用"bfg"删除历史记录中对分支和标记的所有引用
- "重写"git历史记录以适应从内部服务器的移动多年前,ACL2系统主干向根的移动,以及把书搬上一层楼
- 创建一个新的回购,并按照创建有序历史的时间戳
- 将生成的回购推送到github
实现上述内容的脚本很长,可在以下位置获得:https://github.com/ragerdl/svn-to-git/blob/master/convert-acl2-books-svn-and-acl2-devel-svn-to-git.sh
(2) 为什么不在两个存储库上使用git-svn-clone,然后合并它们呢?
因为,当我走到摘樱桃的步骤时,发生了很多冲突。按此顺序执行避免了这些冲突。
(3) 您可以通过确保对于您关心的每个扩展,两个存储库中每个扩展的计数都相同来测试您的存储库。您也可以执行diff。请参阅https://github.com/ragerdl/svn-to-git/blob/master/quality-assurance.sh用于执行这些操作的脚本。
我意识到复制+粘贴代码会很好,但内容太多了,这是我的第一次剪切。如果其他人愿意清理我写的剧本并粘贴在这里,我们将不胜感激。我不会认为这是对社会的真正增值,除非我花了很多时间阅读别人的帖子,但我找不到这个问题的答案。因此,我认为这个答案应该放在搜索引擎容易找到的地方。