SVN迁移到Git保留完整的log
Comment普通的迁移
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中能看到记录,但是迁移时并不会将移动前的记录同时迁移,保留移动前的记录的方式:
按正常的迁移方式迁移最后位置的svn仓库
在.git/config 添加一个新的svn remote
[svn-remote "svn_old"]
url = https://server:ip/repo/project_v1
fetch = :refs/remotes/git-svn-oldsvn-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获取svn_old的历史
git svn fetch --remote svn_old
获取svn_old的最后提交id
git show-ref -s remotes/git-svn-old
根据id将svn_old合并到svn
git filter-branch --parent-filter 'sed "s/^\$/-p id/"' remotes/git-svn
查看是否合并正常
git log remotes/git-svn
设置主干
git reset --hard remotes/git-svn
之后正常进行远程仓库添加和push即可
如果有多次移动
多次移动时添加多个svn remote,按倒序合并到svn.(就像是在git-svn的前面部分不断接上旧的记录)
其他
如果最开始git svn clone的是移动之前的url,比如是从url1移动到了url2,那获取url1的id合并到url2即可,最终将url2的设置为主干
即两种情况:
- 之前的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 - 最开始的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
快速操作
- clone最后的svnUrl,修改.git/config添加移动之前的url的remote名称为
svn_old
remotes为git-svn-old
- 按如下命令顺序执行,第三条命令的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 - 如果还有更早的移动记录,修改.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