SVN迁移至Git
PS:进入正文前,提一句题外话,建议参考官网教程看,因为很多情况,别人写的只是针对自己所对应的场景,可能并不符合你所面对的场景,这里附上官网教程链接:Git官网迁移教程
收集SVN上的人员信息,并编辑成git能识别的账号
到svn项目目录右键选中gitbash打开窗口,执行获取用户并映射成git样式账号命令如下:
svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2"@wenxiang.cn>"}' | sort -u > userinfo.txt
svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2"@wenxiang.cn>"}' | sort -u > userinfo.txt
然后会在目录生成文件userinfo.txt样式如:zhansan = 张三 <zhansan@qq.com>
使用git svn clone克隆代码
新建个文件夹,将生成的userinfo.txt放入新建的文件夹
然后在新建的文件夹中右键选中gitbash弹出窗口后执行下面命令,拉取svn代码到本地新建文件夹中
ps:以下命令中"https://svn_project_url"为你的svn代码地址
参数说明:
--authors-file=userinfo.txt:指定了用户文件
--no-metadata:不导出SVN元数据信息(导出时本地不会生成.svn目录)。若还需要从git反向导入至git,需要导出SVN元数据信息,则不能使用此选项
--no-minimize-url:表示不尝试读取上级目录
--prefix=svn/: 前缀
-s:标准svn项目结构
git svn clone ["SVN repo URL"] --no-metadata --no-minimize-url --authors-file=userinfo.txt --stdlayout
若是第一次拉取svn中一般会出现这个窗口提示,这个提示就填:p,
![](https://i-blog.csdnimg.cn/blog_migrate/7767ab8b937206b98e83c8dc911fda80.png)
填完p后,后面还会弹出窗口做相关验证,分别是操作系统的密码(若你电脑或者服务器设置了密码),svn的账号,svn的密码
都填完了,就会开始拉去svn代码了
![](https://i-blog.csdnimg.cn/blog_migrate/4c6e30a26d34aa31997dd9018c913cff.png)
拉取完之后,目录中会有个.git文件,为了后续
![](https://i-blog.csdnimg.cn/blog_migrate/215baf4dc30b4b32af7f78b6020775ac.png)
PS:为了后续出错不用再重新拉取,这里可以将.git文件拷贝备份
用git命令查看提交记录(按q退出)
右键选中gitbash在窗口中用git命令查看提交记录 (按q退出 )
git log
svn的分支、标签对应git
在svn转git,拉到本地后,由于svn上的规则与git上有出入,所以需要进行以下操作进行匹配:
首先,处理标签,创建本地标签并删除对应的远程分支:
//创建本地标签
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
![](https://i-blog.csdnimg.cn/blog_migrate/b742207ca6ea284c09644b022d09cd76.png)
//删除多余分支标签
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
![](https://i-blog.csdnimg.cn/blog_migrate/0f5bb7b8fa209567049d375b46cd4d9b.png)
说明:
![](https://i-blog.csdnimg.cn/blog_migrate/b54458da97b179115885ebfa73d6aab6.png)
然后,在本地针对每一个远程分支创建对应的本地跟踪分支:
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
根据官方文档的描述,git svn会创建一个名为trunk的额外分支,它对应于Subversion的默认分支,然而trunk引用和master指向同一个位置。鉴于在Git中master最为常用,因此我们可以移除额外的分支:
git branch -d trunk
至此,分支结构就正常了
PS:这一步的目的就是将分支结构转换正常,如果经过以上转换,分支结构还是不正常,可以自行调整
关联git上的项目地址
关联需要迁移的git库上项目地址(建议创建新的创库,避免合并出错,这个地方直接用新建的空仓库就行,任何文件都不要放,分支也不用建,会有默认的master,后面传的时候会自动创建分支),会弹窗验证,输入git账号密码
git remote add origin https://gitee.com/xxxx.git
报错解决:
错误:error: remote origin already exists.
原因:项目已经绑定了远程仓库
解决:
先输入以下命令删除关联的origin的远程库
git remote rm origin
再次绑定自己的远程库
将远程仓库代码拉取到本地(注意分支)【全新仓库,这步可以省略】
将远程仓库代码拉取到本地(注意当前分支)
git pull origin master
如果拉取时报错 ,说明远程仓库有操作记录,可以使用强制合并提交
git pull origin master --allow-unrelated-histories
这一步是拉取了远程仓库,对应的文件夹操作是在“/.git/refs/remotes/origin”目录下拉到了远程仓库的master分支
将本地代码提交到远程仓库
合并到远程master分支
#推送分支到远程仓库
git push origin --all
#推送标签到远程仓库
git push --tags
这一步需注意,如果本地分支和线上分支名不同,可以用以下命令改名,改名之后再提交到远程就可以了
# 重命名命令:
git branch -m 旧名字 新名字
# 实例
git branch -m master pre
![](https://i-blog.csdnimg.cn/blog_migrate/a827ed4d7995f1f5ad0debd495ee567e.png)
ps:查看branche和tag命令:
git branch --all
git tag