SVN转GIT

SVN迁移至Git

PS:进入正文前,提一句题外话,建议参考官网教程看,因为很多情况,别人写的只是针对自己所对应的场景,可能并不符合你所面对的场景,这里附上官网教程链接:Git官网迁移教程

  1. 收集SVN上的人员信息,并编辑成git能识别的账号

  1. 到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
  1. 然后会在目录生成文件userinfo.txt样式如:zhansan = 张三 <zhansan@qq.com>

  1. 使用git svn clone克隆代码

  1. 新建个文件夹,将生成的userinfo.txt放入新建的文件夹

  1. 然后在新建的文件夹中右键选中gitbash弹出窗口后执行下面命令,拉取svn代码到本地新建文件夹中

  1. ps:以下命令中"https://svn_project_url"为你的svn代码地址

  1. 参数说明:

  1. --authors-file=userinfo.txt:指定了用户文件

  1. --no-metadata:不导出SVN元数据信息(导出时本地不会生成.svn目录)。若还需要从git反向导入至git,需要导出SVN元数据信息,则不能使用此选项

  1. --no-minimize-url:表示不尝试读取上级目录

  1. --prefix=svn/: 前缀

  1. -s:标准svn项目结构

git svn clone ["SVN repo URL"] --no-metadata --no-minimize-url --authors-file=userinfo.txt --stdlayout
  1. 若是第一次拉取svn中一般会出现这个窗口提示,这个提示就填:p,

  1. 填完p后,后面还会弹出窗口做相关验证,分别是操作系统的密码(若你电脑或者服务器设置了密码),svn的账号,svn的密码

  1. 都填完了,就会开始拉去svn代码了

  1. 拉取完之后,目录中会有个.git文件,为了后续

  1. PS:为了后续出错不用再重新拉取,这里可以将.git文件拷贝备份

  1. 用git命令查看提交记录(按q退出)

  1. 右键选中gitbash在窗口中用git命令查看提交记录 (按q退出 )

git log
  1. svn的分支、标签对应git

  1. 在svn转git,拉到本地后,由于svn上的规则与git上有出入,所以需要进行以下操作进行匹配:

  1. 首先,处理标签,创建本地标签并删除对应的远程分支:
//创建本地标签
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

说明:

  1. 然后,在本地针对每一个远程分支创建对应的本地跟踪分支:
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
  1. 根据官方文档的描述,git svn会创建一个名为trunk的额外分支,它对应于Subversion的默认分支,然而trunk引用和master指向同一个位置。鉴于在Git中master最为常用,因此我们可以移除额外的分支:
git branch -d trunk
  1. 至此,分支结构就正常了
  • PS:这一步的目的就是将分支结构转换正常,如果经过以上转换,分支结构还是不正常,可以自行调整

  1. 关联git上的项目地址

  1. 关联需要迁移的git库上项目地址(建议创建新的创库,避免合并出错,这个地方直接用新建的空仓库就行,任何文件都不要放,分支也不用建,会有默认的master,后面传的时候会自动创建分支),会弹窗验证,输入git账号密码

git remote add origin https://gitee.com/xxxx.git
  1. 报错解决:
  1. 错误:error: remote origin already exists.

  1. 原因:项目已经绑定了远程仓库

  1. 解决:

  1. 先输入以下命令删除关联的origin的远程库

git remote rm origin 
  1. 再次绑定自己的远程库

  1. 将远程仓库代码拉取到本地(注意分支)【全新仓库,这步可以省略】

  1. 将远程仓库代码拉取到本地(注意当前分支)

git pull origin master
  1. 如果拉取时报错 ,说明远程仓库有操作记录,可以使用强制合并提交

git pull origin master --allow-unrelated-histories
  1. 这一步是拉取了远程仓库,对应的文件夹操作是在“/.git/refs/remotes/origin”目录下拉到了远程仓库的master分支

  1. 将本地代码提交到远程仓库

  1. 合并到远程master分支

#推送分支到远程仓库
git push origin --all
#推送标签到远程仓库
git push --tags
  1. 这一步需注意,如果本地分支和线上分支名不同,可以用以下命令改名,改名之后再提交到远程就可以了

# 重命名命令:
git branch -m 旧名字 新名字
# 实例
git branch -m master pre
  1. ps:查看branche和tag命令:

git branch --all
git tag

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值