我正在尝试将Subversion存储库转换为Git。我面临的问题是如何保存完整的完整历史记录。 SVN存储库具有相当复杂的历史,然后git-svn工作,它仅从特定修订开始,忽略所有早期历史。
更多细节:我想导入一个现在按照std-layout http://svn.../projects/myProject/trunk
定位的项目。然而,trunk
不是像现在这样在SVN中创建的。它最初被创建为一些自定义路径,如/my_project
,然后在SVN中重命名为myProject/trunk
,然后再进行几次移动和重命名,最终以标准布局结束。
因此,如果我只是导入指向我需要的SVN项目文件夹的repo,那么git-svn
结果将从引入标准布局的修订版开始历史记录,而忽略了projects/myProject/trunk
之前多次在存储库中移动的事实。
从技术上讲,我需要导入SVN文件夹的历史记录,如果它从同一存储库的某个其他位置(主干外)移动/复制到主干中。
有没有人有任何想法如何从这样的存储库中恢复历史记录?也许以某种方式使用多个导入,然后git移植,或其他一些魔术?有什么简单的方法吗?
reposurgeon已成功转换了一些毛茸茸的旧SVN存储库,可能可以解决这个问题。看看它的man page,尤其是“Working with Subversion”部分。
从文档中,看起来branchify
option应该包含您的主干所在的路径列表:
以下是用于将Subversion存储库中的子目录映射到分支的规则:
- 在任何给定时间,都有一组符合条件的路径和路径通配符,用于声明潜在的分支。有关如何更改此集的信息,请参阅
branchify
选项的文档,该集最初由{trunk,tags / *,branches / *和'*'}组成。…
- 如果branchify集的元素以*结尾,则它的每个直接子目录都被视为潜在分支。如果'*'在branchify集中(默认情况下为true),除/ trunk,/ tags和/ branches之外的所有顶级目录也被视为潜在分支。
branchify [path-set]
在分析Subversion仓库时,指定要作为潜在分支处理的目录列表(如果在创建副本后没有修改,则成为标记)。使用
--nobranch
读取选项时,将忽略此列表。它默认为“标准布局”目录集,以及存储库根目录中的任何无法识别的目录。
branchify
选项的默认值包含*
,这可能已经为您检测到了旧分支。如果没有,你可以尝试将branchify
设置为包含my_project
,myProject/trunk
和trunk
,以及默认路径tags/*
和branches/*
。
在此之后你可能会得到多个Git分支 - 一个用于my_project
,一个用于trunk
等。如果发生这种情况,reposurgeon的unite
or graft
commands可能能够将它们结合起来;我不确定。如果这些命令仅适用于存储库而不是分支,则可以创建Git移植并按照git filter-branch
中的描述运行this answer。