将具有重命名中继历史的SVN仓库导入Git

时间:2014-12-15 15:43:33

标签: git svn git-svn

我正在尝试将Subversion存储库转换为Git。我面临的问题是如何保存完整的完整历史记录。 SVN存储库具有相当复杂的历史,然后git-svn工作,它仅从特定修订开始,忽略所有早期历史。

更多详细信息:我想导入一个现在按std-layout http://svn.../projects/myProject/trunk定位的项目。但是,现在不在SVN中创建trunk。它最初是作为一些自定义路径创建的,如/my_project,然后在SVN中重命名为myProject/trunk,然后再移动几次并重命名,最后以标准布局结束。

因此,如果我只是导入指向我需要的SVN项目文件夹的repo,git-svn结果将从引入标准布局的修订版开始历史记录,而忽略了{{1之前已多次在存储库中移动过。

从技术上讲,我需要导入SVN文件夹的历史记录,如果它从同一存储库的某个其他位置(主干外)移动/复制到主干中。

有没有人有任何想法如何从这样的存储库中恢复历史记录?也许以某种方式使用多个导入,然后git移植,或其他一些魔术?有什么简单的方法吗?

1 个答案:

答案 0 :(得分:0)

已经成功转换了一些毛茸茸的旧SVN存储库的

reposurgeon可以处理这个问题。请参阅其man page,尤其是“Working with Subversion”部分。

从文档中看,branchify option应该包含您的中继所在的路径列表:

  

以下是用于将Subversion存储库中的子目录映射到分支的规则:

     
      
  1. 在任何给定时间,都有一组符合条件的路径和路径通配符,用于声明潜在的分支。请参阅branchify选项的文档,了解如何更改此集合,该集合最初包含{trunk,tags / *,branches / *和'*'}。
  2.         

    ...

         
        
    1. 如果branchify集的元素以*结尾,则它的每个直接子目录都被视为潜在分支。如果'*'在branchify集中(默认情况下为true),除/ trunk,/ tags和/ branches之外的所有顶级目录也被视为潜在分支。
    2.   
  

branchify [路径设置]

     

在分析Subversion仓库时,指定要作为潜在分支处理的目录列表(如果在创建副本后没有修改,则成为标记)。使用--nobranch读取选项时,将忽略此列表。它默认为“标准布局”目录集,以及存储库根目录中的任何无法识别的目录。

branchify选项的默认值包含*,这可能已经为您检测到了旧分支。如果不是,您可以尝试将branchify设置为包含my_projectmyProject/trunktrunk,以及默认路径tags/*和{{1 }}

在此之后你可能会得到多个Git分支 - 一个用于branches/*,一个用于my_project,等等。如果发生这种情况,reposurgeon的unite or graft commands可以将它们组合在一起;我不确定。如果这些命令仅适用于存储库而不是分支,则可以创建Git移植并按this answer中所述运行trunk