SVN到Git的一键迁移脚本(保留所有分支、Tag及提交记录)

2021-05-14  本文已影响0人  简单点的笨演员

注意:
1、由于用到grep、sort、awk,因此在Windows环境中需要在bash中运行,如果没有的话先安装Git即可;
2、需要安装svn的命令号工具,如果没有的话需要安装下:


一、准备SVN用户到Git用户的映射文件

在SVN中,每一个人提交时都需要在系统中有一个用户,它会被记录在提交信息内。如果想要将SVN用户映射到一个更好的Git作者数据中,你需要一个SVN用户到Git用户的映射。参考《一键获取所有SVN提交作者用户名的列表》获取所有SVN提交作者,参考下面的格式建立authors.txt文件:

svn_username1=git_username1<sfddsfsdf@xxx.com>
svn_username2=git_username2<sfddsfsdf@xxx.com>
svn_username3=git_username3<sfddsfsdf@xxx.com>
.....

二、保存下面脚本为:svn2git.sh

保存到与authors.txt同一目录,并且修改里面的SVN地址。

# 要转换的SVN地址
SVN_URL=http://127.0.0.1:8080/svn/test/

# svn转git
git svn clone $SVN_URL "./svn2git" --no-metadata --trunk=trunk --branches=branches --tags=tags  --authors-file ./authors.txt --no-minimize-url eisp-eipsc-parent-to-git

cd svn2git

# 创建本地标签并删除对应的远程分支
git for-each-ref refs/remotes/origin/tags |cut -d / -f 5-|grep -v @| while read tagname; do git tag "$tagname" "origin/tags/$tagname"; done
git for-each-ref refs/remotes/origin/tags |cut -d / -f 5-|grep -v @| while read tagname; do git branch -r -d "origin/tags/$tagname"; done

# 在本地针对每一个远程分支创建对应的本地跟踪分支
git for-each-ref refs/remotes/origin/ |cut -d / -f 4-|grep -v @| while read branchname; do git branch "$branchname" "refs/remotes/origin/$branchname"; done
git for-each-ref refs/remotes/origin/ |cut -d / -f 4-|grep -v @| while read branchname; do git branch -r -D "origin/$branchname"; done

# 删除无用的trunk分支
git branch -d trunk

# 删除与SVN的关联
rm -rf .git/svn

# 删除所有的远程分支
for i in $(git branch -r); do git branch -D -r "$i"; done;

# 删除SVN中被删除的分支
svn ls $SVN_URL/branches | sed 's|/$||' > svn-branch.txt
git branch |sed 's|^\*||' |sed 's|^[[:space:]]*||' | grep -v '^origin/tags/' | sed 's|origin/||' > git-branch.txt
diff -u git-branch.txt svn-branch.txt |grep -v '^--'|grep '^-' |sed 's|-||'|grep -v '^master' > deleted-branch.txt
for i in $(cat deleted-branch.txt); do echo "$i"; git branch -D "$i"; done;

# 删除SVN中被删除的tags
svn ls $SVN_URL/tags | sed 's|/$||' > svn-branch.txt
git tag  > git-branch.txt
diff -u git-branch.txt svn-branch.txt |grep -v '^--'|grep '^-' |sed 's|-||'|grep -v '^master' > deleted-branch.txt
for i in $(cat deleted-branch.txt); do echo "$i"; git tag -d "$i"; done;

三、执行脚本开始转换

在终端下(windows在bash下),切换到 svn2git.sh 所在的目录,执行:sh ./svn2git.sh执行需要比较久的时间,需要耐心等待 ^o^。转换完成后,转换结果在当前目录下的svn2git。

参考:
http://www.meilongkui.com/archives/1965

上一篇下一篇

猜你喜欢

热点阅读