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

问题描述 投票:4回答:1

我正在尝试将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移植,或其他一些魔术?有什么简单的方法吗?

git svn git-svn
1个回答
0
投票

reposurgeon已成功转换了一些毛茸茸的旧SVN存储库,可能可以解决这个问题。看看它的man page,尤其是“Working with Subversion”部分。

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

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

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

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

branchify [path-set]

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.