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

我正在寻找永久的方法(即导入后不会使用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 /中使用它(即有一个大提交移动一切)所以在执行git svn初始化时既不使用-s也不使用它将正常工作.

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

最佳答案 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文件夹,并且需要删除从/ to / trunk移动所有内容的提交 – 我手动编辑了转储文件(幸运的是所有元数据都是明文)并在r0变化的开头:

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

PROPS-END

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

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

PROPS-END

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

点赞