目录
环境信息
迁移步骤
SVN和Git都是优秀的版本管理工具。不幸的是,对于从SVN迁移到Git的过程、命令和说明,网上不少文章存在误导性。因此本文以Gitea为例,演示从SVN迁移到Git的详细过程。
本文前提条件:
在以上git Repository创建完成且未被初始化的情况下,需要从原SVN仓库迁移导入至Git,包括在SVN的提交Commit 和作者log日志。需要导出的SVN信息:
以下步骤通过git svn命令完成从SVN至Git的迁移:
1、在任意PC电脑上(能够访问SVN和Gitea)创建迁移临时用目录:migrate_svn_to_git/
2、进入该目录。创建文本authors_map.txt,存放SVN作者至Git作者映射信息文件,格式形式如下:
loginname=JoeUser |
或者可通过以下方式自动生成该作者映射文件。
进入本地既有的SVN目录(该目录已经完成从SVN checkout至最新)通过以下命令生成(在Bash中执行)authors_map.txt文件,然后将生成得到的该txt文件拷贝至 migrate_svn_to_git/ 目录下:
svn log -r 1:HEAD --xml | grep "' '{print $2}' | awk -F ' ' '{print $1"="$1"<"$1"@yykj.com>" }' > authors_map.txt
3、通过以下两条git svn命令从SVN仓导出至本地(在Bash中执行):
#以SVN仓根URL对当前本地目录进行git初始化
git svn init http://20.1.1.11:7001/usvn/svn/sys_pm --prefix fromsvn/ --no-metadata --username=LOGIN_SVNUSER --trunk=pmis/01develop/02code/trunk --branches=pmis/01develop/02code/branches
#从SVN仓导出到本地git仓中(耗时可能很长甚至几天几夜)
git svn fetch -r 1:HEAD --authors-file=authors_map.txt
选项说明:
4、导出后tags和branch信息在.git/svn/目录下,需要先据此创建git本地tags和branch,然后待后面步骤推送至gitea的远端。即,tags和branch的refs信息有三类:
通过以下命令将“SVN的remote远端refs信息”转换为“git本地仓的refs信息”,然后清理删除“SVN的remote远端refs信息”:(在Bash中执行)
#先for循环调整tags(其中“fromsvn”为前文指定的--prefix)
for t in $(git for-each-ref --format='%(refname:short)' refs/remotes/fromsvn/tags);
do
tagname=${t/fromsvn\/tags\//}
git tag ${tagname} $t && git branch -D -r $t;
done;
【注】refs在git内部就是指针,指向40字节的SHA-1哈希值。命令中refs/remotes为指向远程各分支的head指针,refs/tags本地tags列表。
命令说明:
#然后再for循环调整branch(其中“fromsvn”为前文指定的--prefix)
for b in $(git for-each-ref --format='%(refname:short)' refs/remotes/fromsvn);
do
branchname=${b/fromsvn\//}
git branch ${branchname,,} refs/remotes/$b && git branch -D -r $b;
done;
命令说明:
5、转换ignore文件(根据实际需要选择是否执行,此处不执行)
git svn show-ignore > .gitignore
git add .gitignore
git commit -m 'Convert svn:ignore properties to .gitignore'
6、其他调整。以上处理完成后,应检查分支和tag项是否正确,若需要重命名或删除历史不用的branch/tags等,则可以通过手工执行git命令完成。
7、查看并检查结果(在Bash中执行)
8、至此已经完成从SVN到git本地迁移工作。
git branch
git log
git tag
9、下一步,从git本地推送到gitea远端仓(在Bash中执行):
#增加git远端仓定义
git remote add origin_base http://20.200.54.51:3000/gsyspm/base_repos.git
#将本地仓所有分支推送至远端仓(若弹出输入用户密码,请输入gitea_admin用户和密码)
git push --all origin_base
#将本地仓所有tag信息推送至远端仓(若弹出输入用户密码,请输入gitea_admin用户和密码)
git push --tags origin_base
选项说明:
10、通过浏览器查看gitea服务端的结果。