普通的迁移

git svn clone svnUrl
如果需要从某个提交点开始迁移可以使用-r svnVersion:HEAD来指定
eg: git svn clone https://server:ip/repo/xxx -r 12345:HEAD

svn有移动和复制操作时保留移动或复制之前的log

SVN的内容有移动时迁移到git时会丢失移动前的记录,虽然通过svn命令进行移动的内容移动后在svn中能看到记录,但是迁移时并不会将移动前的记录同时迁移,保留移动前的记录的方式:

  1. 按正常的迁移方式迁移最后位置的svn仓库

  2. 在.git/config 添加一个新的svn remote

    [svn-remote "svn_old"]
    url = https://server:ip/repo/project_v1
    fetch = :refs/remotes/git-svn-old

    svn-remote名称为合法标识符与其他名称不相同即可,一般为svn_old之类
    url为对应svn仓库移动之前的url
    fetch的:refs/remotes/部分固定,之后的名称与其他不同即可,其中包含-,一般移动前的命名为git-svn-old.
    添加完成之后的结果:

    [svn-remote "svn"]
    url = url1
    fetch = :refs/remotes/git-svn
    [svn-remote "svn_old"]
    url = url2
    fetch = :refs/remotes/git-svn-old
  3. 获取svn_old的历史
    git svn fetch --remote svn_old

  4. 获取svn_old的最后提交id
    git show-ref -s remotes/git-svn-old

  5. 根据id将svn_old合并到svn
    git filter-branch --parent-filter 'sed "s/^\$/-p id/"' remotes/git-svn

  6. 查看是否合并正常
    git log remotes/git-svn

  7. 设置主干
    git reset --hard remotes/git-svn

  8. 之后正常进行远程仓库添加和push即可

如果有多次移动

多次移动时添加多个svn remote,按倒序合并到svn.(就像是在git-svn的前面部分不断接上旧的记录)

其他

如果最开始git svn clone的是移动之前的url,比如是从url1移动到了url2,那获取url1的id合并到url2即可,最终将url2的设置为主干
即两种情况:

  1. 之前的svn如果是move后的,即是从url2移动到了url1,先git svn clone url1,要合并url2的log到url1
    git show-ref -s remotes/git-svn-v1 得到<graft-id>
    git filter-branch --parent-filter 'sed "s/^\$/-p <graft-id>/"' remotes/git-svn
    git log remotes/git-svn 查看所有历史记录
    git reset --hard remotes/git-svn
  2. 最开始的svn如果是move之前的 是从url1移动到了url2,先git svn clone url2,要合并url1的log到url2
    git show-ref -s remotes/git-svn 得到<graft-id>
    git filter-branch --parent-filter 'sed "s/^\$/-p <graft-id>/"' remotes/git-svn-v1
    git log remotes/git-svn-v1 查看所有历史记录
    git reset --hard remotes/git-svn-v1

快速操作

  1. clone最后的svnUrl,修改.git/config添加移动之前的url的remote名称为svn_oldremotes为git-svn-old
  2. 按如下命令顺序执行,第三条命令的id替换为第二条命令的输出
    git svn fetch --remote svn_old
    git show-ref -s remotes/git-svn-old
    git filter-branch --parent-filter 'sed "s/^\$/-p id/"' remotes/git-svn
    git log remotes/git-svn
  3. 如果还有更早的移动记录,修改.git/config添加为svn_old2,remotes为git-svn-old2
    git show-ref -s remotes/git-svn-old2
    git filter-branch -f --parent-filter 'sed "s/^\$/-p id/"' remotes/git-svn