迁移回购并不总是使用SVN到GIT的trunk / branches / tags结构

时间:2011-09-26 15:11:38

标签: git svn git-svn

我正在寻找永久的方法(即导入后不会使用git-svn,并且将再次克隆repo以摆脱所有git-svn余数)将我的一个SVN存储库迁移到git。通常这很容易 - 只需执行http://www.jonmaddox.com/2008/03/05/cleanly-migrate-your-subversion-repository-to-a-git-repository/中解释的步骤。

然而,在SVN存储库中,我在一段时间后切换到trunk / branches / tags结构,因此大约一半的~2000次提交正在使用实际的trunk进入/而另一半使用/ trunk / (即,有一个大提交移动所有内容)所以在执行git svn初始化时既不使用-s也不使用它将正常工作。

我现在正在寻找一种方法来将存储库正确导入git,即保留分支信息(没有标记,我从未创建任何标记),同时不会弄乱旧的提交。在不可能的情况下,我想知道是否有办法重写旧提交以更改仓库,因此它使用trunk / branches / tags结构 - 然后我可以在git-svn中使用-s

1 个答案:

答案 0 :(得分:2)

TL,DR:当某些手动工作可以接受时,它 可以修复一个混乱的存储库,如问题中描述的那样。最简单的方法是使用SVN转储文件,然后使用带有 stdlayout 选项的git-svn进行导入。


我设法通过重写存储库的svndump来从头开始包含适当的结构:

svnadmin dump orig/ --incremental > repo.svndump

然后我使用一个小的内联Perl脚本来更改文件夹:

perl -pe 's/^Node-path: (?!trunk|branches|tags)(.+)$/Node-path: trunk\/$1/g' repo.svndump > repo2.svndump

由于转储现在无效 - 需要在r0中创建trunk文件夹,并且需要删除提交从//trunk的所有内容 - 我编辑了转储文件手动(幸运的是所有元数据都是明文)并在r0:

的更改开始时添加以下内容
Node-path: trunk
Node-kind: dir
Node-action: add
Prop-content-length: 10
Content-length: 10

PROPS-END

在提交移动所有文件时,我删除了所有操作并添加了以下内容以创建branches文件夹(如果我使用了tags文件夹,则同样如此)

Node-path: branches
Node-kind: dir
Node-action: add
Prop-content-length: 10
Content-length: 10

PROPS-END

现在可以使用svnadmin load加载已编辑的转储文件,为我提供了一个可以由git-svn导入而没有任何问题的存储库。