参考链接

在迁移的过程中,参考了以下的链接:

第一步、建立SVN用户到git用户的映射文件在 Subversion,每个提交者在都在主机上有一个用户名,记录在提交信息中。如果想让已有的信息更好的映射到 Git 作者数据里,则需要 从 Subversion 用户名到 Git 作者的一个映射关系,因为Git是用邮箱来标识一个提交者的。建立一个叫做 userinfo.txt 的文件,每行一条svn作者 = 作者昵称 ,用如下格式表示映射关系:

因为网易云音乐这个项目有ouyangpeng和huxiaoqiao的提交记录,所以userinfo.txt内容如下所示:ouyangpeng = ouyangpeng

huxiaoqiao = huxiaoqiao 12

现在SVN代码的文件中,使用如下命令获取到所有提交者的名字。

SVN代码的所有提交者的作者名可以通过以下命令获得:

获取svn提交的作者名svn log --xml | grep "^' '{print $2}' | awk -F '' '{print $1}' > userinfo.txt1

得到以下文本,然后根据以上的格式编辑作者的邮件信息等。lihongmeng

liyang

wangshuyin

wuqi

youpeng

ouyangpeng 123456

这样我们的把有svn的提交记录的作者、邮箱userinfo.txt都准备好了,接下来就克隆svn的地址。lihongmeng = lihongmeng liyang = liyang wangshuyin = wangshuyin wuqi = wuqi youpeng = youpeng ouyangpeng = ouyangpeng 123456

第二步、通过git svn clone克隆一个git版本库,SVN里面包含trunk,branches和tags。

SVN版本库的内容如下所示:

把上面的userinfo.txt 拷贝到 新建好的准备克隆svn代码的git目录下,

然后执行 git svn clone命令克隆一个git版本库

git svn clone svn://172.28.1.171/XTCWatch_device_I3_APP/NetEaseCloudeMusic/ --no-metadata --authors-file=userinfo.txt --trunk=trunk --tags=tags --branches=branches1参数–no-metadata表示阻止git导出SVN包含的一些无用信息

参数–authors-file表示SVN账号映射到git账号文件,所有svn作者都要做映射

参数–trunk表示主开发项目

参数–branches表示分支项目

敲完命令后,会要求填写SSH相关信息,填写好svn的账户名和密码 即可继续执行。

填写用户名

填写密码

填写完毕后,回车则会开始执行clone操作。

执行过程中,在不断的从svn服务器拉取代码到本地git版本库

使用git log 命令查看转换好的代码库,可以看到历史记录

widgetPhone的提交历史记录如下:

这个时候执行* git branch* 命令发现只有 master一个分支。

但是实际上我有好几个分支,

APP_NetEaseCloudMusic_SearchSongs ,

APP_NetEaseCloudMusic_UseByAnonymous,

App_NetEaseCloudMusic_V0.1_backup

执行命令 git show-ref可以看到所有的引用,如下所示,

可以看到有master这个本地分支,同时有remote 分支trunk, APP_NetEaseCloudMusic_SearchSongs , APP_NetEaseCloudMusic_UseByAnonymous,

App_NetEaseCloudMusic_V0.1_backup 等,

通过Git Version 发现trunk 和 Master分支的版本是一样的, 其他几个分支和SVN客户端branches 目录下的结构是一样的。 说明 git svn 将svn的主干和其他分支 转换为了git的 master 和其他branch 。

这时我们发现有一些remote 分支,不是本地仓库的分支, 我们还没有设置remote, 那就需要执行以下的命令将remote 分支移回本地分支。

尝试方法1

首先要移动标签,把它们从奇怪的远程分支变成实际的标签,然后把剩下的分支移动到本地。要把标签变成合适的Git标签,运行cp -Rf .git/refs/remotes/tags/* .git/refs/tags/

rm -Rf .git/refs/remotes/tags12

该命令将原本以tag/开头的远程分支的索引变成真正的(轻巧的)标签。

接下来,把refs/remotes下面剩下的索引变成本地分支:cp -Rf .git/refs/remotes/* .git/refs/heads/

rm -Rf .git/refs/remotes12

合并一起一共执行4条命令。cp -Rf .git/refs/remotes/tags/* .git/refs/tags/rm -Rf .git/refs/remotes/tags

cp -Rf .git/refs/remotes/* .git/refs/heads/rm -Rf .git/refs/remotes1234567

尝试方法2

在迁移 WidgetPhone 的时候,git/refs/remotes/tags/目录不存在,而目录.git/refs/remotes/origin/tags/存在,于是命令改为cp -rf .git/refs/remotes/origin/tags/* .git/refs/tags/rm -rf .git/refs/remotes/origin/tags

cp -rf .git/refs/remotes/origin/* .git/refs/heads/rm -rf .git/refs/remotes1234567

现在所有的旧分支都变成真正的分支,所有的旧标签也变成真正的标签。

执行后效果如下所示,可以看到其他的branch都挪到了本地。

尝试方法3

迁移 WidgetCommon 项目的时候,上面两种命令都无效,都提示 .git/refs/remotes/origin/tags/* 目录不存在,如下图所示:

没办法,去官网查询了下

使用如下的方法做操作。

首先要移动标签,把它们从奇怪的远程分支变成实际的标签,然后把剩下的分支移动到本地。要把标签变成合适的 Git 标签,运行$ git for-each-ref refs/remotes/tags | cut -d / -f 4- | grep -v @ | while read tagname; do git tag "$tagname" "tags/$tagname"; git branch -r -d "tags/$tagname"; done1

该命令将原本以 tag/ 开头的远程分支的索引变成真正的(轻巧的)标签。

接下来,把 refs/remotes 下面剩下的索引变成本地分支:$ git for-each-ref refs/remotes | cut -d / -f 3- | grep -v @ | while read branchname; do git branch "$branchname" "refs/remotes/$branchname"; git branch -r -d "$branchname"; done1

第三步、添加远程git服务器地址

1、添加远程git remote 地址

在本地的仓库中,增加远程git remote 地址:git remote add origin git@172.28.10.23:AndroidWatch/NetEaseCloudMusic.git1

2、配置git 的 username 和 emailgit config --global user.name ouyangpeng

git config --global user.email ouyangpeng@oaserver.dw.gdbbk.com123

下面是配置好的内容

3、执行* git push origin –all* 命令

然后执行* git push origin –all* 命令,推送到远程Gitlab仓库

$ git push origin --all

Counting objects: 7210, done.

Delta compression using up to 8 threads.

Compressing objects: 100% (5548/5548), done.

Writing objects: 100% (7210/7210), 16.08 MiB | 9.68 MiB/s, done.

Total 7210 (delta 3588), reused 0 (delta 0)

remote: Resolving deltas: 100% (3588/3588), done.

remote: GitLab: You are not allowed to push code to protected branches on this p                                                                                            roject.To 172.28.10.23:AndroidWatch/NetEaseCloudMusic.git

! [remote rejected] master -> master (pre-receive hook declined)error: failed to push some refs to 'git@172.28.10.23:AndroidWatch/NetEaseCloudMu                                                                                            sic.git'123456789101112

如上图所示,有可能push失败,是因为master分支没有给我授予权限push。

因为我是管理员,所以我在该项目中,设置我为master,如下图所示:

将我设置我为master

然后就提交成功了。

DH207891+OuyangPeng@DH207891 MINGW32 /d/git test/AndroidWatch_NetEaseCloudMusic/                                                                                            NetEaseCloudeMusic (master)

$ git push -u origin --all

Counting objects: 7210, done.

Delta compression using up to 8 threads.

Compressing objects: 100% (5548/5548), done.

Writing objects: 100% (7210/7210), 16.08 MiB | 9.87 MiB/s, done.

Total 7210 (delta 3586), reused 0 (delta 0)

remote: Resolving deltas: 100% (3586/3586), done.

To 172.28.10.23:AndroidWatch/NetEaseCloudMusic.git

* [new branch]      master -> master

Branch master set up to track remote branch master from origin.123456789101112

4、执行  git push -u origin –tags 命令

如果你的项目有Tags的话,上面最后部分git push -u origin –all,运行之后并不能如它所说,分支和标签(branches and tags)都在gitlab服务器中。

实际上,只提交了branches到gitlab上面,并没有提交tags,当然,很简单,你可以使用git push –h查看下帮助,就会发现,你应该知道怎么做了,使用git push –tags就可以了。

执行下面命令即可,由于网易并没有建立tags,所以没有任何代码push到gitlab.DH207891+OuyangPeng@DH207891 MINGW32 /d/git test/AndroidWatch_NetEaseCloudMusic/                                                                                            NetEaseCloudeMusic (master)

$ git push -u origin --tagsEverything up-to-date1234

第四步、查看gitlab上面是否正常提交

master分支

点击master下拉框,切换分支

切换到 APP_NetEaseCloudMusic_SearchSongs 分支

查看commit 提交记录

切换到 Branch 选项 可以查看所有的 Branch

第四步、定期同步SVN后续提交的代码到Git仓库

第一步,通过git show-ref命令查看分支情况

其中 refs/remotes/git-svn 分支就是刚才用git svn clone 之后的远程分支,可以在本地建立一个分支来同步svn后续的提交记录

第二步,建立本地分支 local-git-svn 对应远程分支git-svn

[root@xtgl207940 trunk]# git show-ref9caa27cc211162aeed6e944144f4c676d2f1dfe1 refs/heads/develop9caa27cc211162aeed6e944144f4c676d2f1dfe1 refs/heads/master

0ba94e3383d6f478844b1e674465fbc6ae0277e3 refs/remotes/git-svn9caa27cc211162aeed6e944144f4c676d2f1dfe1 refs/remotes/origin/develop62333dcb3beeb73e28538f815abfdfe791b88c00 refs/remotes/origin/local-git-svn9caa27cc211162aeed6e944144f4c676d2f1dfe1 refs/remotes/origin/master

[root@xtgl207940 trunk]# git checkout -b local-git-svn remotes/git-svn切换到一个新分支 'local-git-svn'[root@xtgl207940 trunk]#1234567891011

第三步,同步svn最新的提交记录

使用 git svn fetch 命令同步SVN最新的提交记录,然后可以通过 git log命令查看git的提交记录对应的svn记录相同。

[root@xtgl207940 trunk]# git svn fetch [root@xtgl207940 trunk]# git log123

第四步,切换分支到master分支,然后merge刚才的local-git-svn分支

[root@xtgl207940 trunk]# git checkout master切换到分支 'master'您的分支与上游分支 'origin/master' 一致。

[root@xtgl207940 trunk]# git branch

develop  local-git-svn

* master

[root@xtgl207940 trunk]# git merge local-git-svn 更新 9caa27c..0ba94e3

Fast-forward

watch/src/main/java/com/xtc/watch/view/contact/activity/ContactPhoneActivity.java | 2 +-

watch/src/main/res/values/strings.xml                                             | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)

[root@xtgl207940 trunk]#123456789101112131415

第五步,提交master分支到GitLab远程仓库

第六步,查看gitlab上的代码

终于将之前写好的指导文件迁移到了CSDN博客上,这份指导文件已经完成了它的历史使命,因为我们团队内部所有代码都已经成功迁移到了GitLab上,SVN已经成为过去式,但是这份文件可以分享出来给有需要的人。作者:欧阳鹏 欢迎转载,与人分享是进步的源泉!

原文出处

使用git命令导出项目_【git学习】SVN项目迁移到Git操作指南相关推荐

  1. git 命令详解_再次学习Git版本控制工具

    微信公众号:PHP在线 Git 究竟是怎样的一个系统呢?为什么在SVN作为版本控制工具已经非常流行的时候,还有Git这样一个版本控制工具呢?Git和SVN的区别在哪儿呢?Git优势又在哪呢?下面PHP ...

  2. svn 代码迁移到git

    svn 代码迁移到git 1.收集svn上的人员信息,并编辑成git能识别的账号 2.使用 git svn clone 命令 克隆代码(以下步骤建议在win10上操作) 3.用git命令查看提交记录 ...

  3. 将 svn 仓库迁移到 git 仓库

    将 svn 仓库迁移到 git 仓库 1. 找回 svn 仓库的 url 2.将 svn 仓库迁移到 git 仓库 2.1.git命令版 2.2.小乌龟 TortoiseGit版本 1. 找回 svn ...

  4. SVN仓库迁移到Git遇到的两个问题和解决办法

    SVN仓库迁移到Git遇到的两个问题和解决办法 参考文章: (1)SVN仓库迁移到Git遇到的两个问题和解决办法 (2)https://www.cnblogs.com/shawnpoo/p/SVN-c ...

  5. 品达物流TMS项目_第12章 项目总结

    品达物流TMS项目_第12章 项目总结 文章目录 品达物流TMS项目_第12章 项目总结 第12章 项目总结 1. 微服务架构 2. 软件架构体系 3. 系统架构 4. 技术架构 5. 业务流程 6. ...

  6. 2020.2idea怎么创建html项目_如何为IDEA项目创建GitHub存储库和本地Git存储库

    有几种方法可以使用IntelliJ IDEA来发布我们在GitHub上编写的代码.在此博客中,我们将介绍两种方法.第一个步骤是最快的一步,您可以在其中创建本地和远程存储库.第二种方法是多步骤,当您要为 ...

  7. android git提交整个项目_使用子模块和子树来管理 Git 项目 | Linux 中国

    使用子模块和子树来帮助你管理多个存储库中共有的子项目.https://linux.cn/article-12244-1.html作者:Manaswini Das译者:Xiaobin.Liu 如果你参与 ...

  8. git 命令 导出有变动的文件

    Git想要导出一段时间内,有变动的文件,方便做服务器文件更新,但是本地上没有安装TortoiseGit 工具,那就只能采用git命令方式了. git命令仅能比较两个版本号间的文件差异,然后导出,首先我 ...

  9. [Git命令]上传单个文件到GitHub项目已有文件夹

    要将"xxx-第五章"文件夹里新修改的文件"修改4.0"上传到GitHub仓库中 在当前文件夹右键选择"Git Bash Here" 首先g ...

最新文章

  1. 广东电大计算机绘图试题,电大计算机绘图期末复习试题及答案参考小抄.doc
  2. 优秀工程师至关重要的一项技能,你解锁了吗?
  3. 2017 3月16日,上午
  4. [读书] Computer Vision: Algorithms and Applications
  5. JDK下载地址、SecureCRT中JDK安装和环境配置、SecureCRT窗口编程、linux下命令运行小程序
  6. 2015 Autodesk 开发者日( DevDays)和 助力开发周火热报名中
  7. vux安装中遇到的坑(转)
  8. java内存模型(netty权威指南)
  9. 数组遍历,判断数组中的对象中某一属性值时候为空
  10. 楼层平面放线及标高实测记录_建筑施工基础测量放线工作内容
  11. 《Java设计模式》刘伟 超清晰版本 下载链接
  12. DXGI_FORMAT enumeration (dxgiformat.h)
  13. python read()读取图片_可以python sitk.ReadImage读取列表/系列图像吗?
  14. 超微服务器性能,读取性能强劲 超微2U机架F228服务器评测
  15. 那些一秒搞定微软公司Excel的神操作(上)!
  16. Winform UI界面设计例程——自定义comboBox
  17. 传美云商系统开发源码
  18. 和免疫荧光标记说拜拜 | 谷歌Cell论文:深度学习模型预测荧光位置
  19. 9.1-9.4 因特网与网络互连技术(上)
  20. android sd卡名称,Android系统中SD卡各文件夹名称及功能详解

热门文章

  1. Metasploit设置VERBOSE参数技巧
  2. SSL/TLS抓包出现提示Ignored Unknown Record
  3. 环形动画加载视图AnimatedCircleLoadingView
  4. 精灵动画Animation对话框组成Idle动画的各精灵
  5. 服务器文件数量监控,服务器监控指标有哪些?好文章一定要收藏
  6. python消找出img中的src标签_使用beautifulsoup从img标签获取src
  7. requests payload_python+Requests接口自动化测试之传递 URL 参数
  8. 饥荒自建服务器崩了之后没有记录了,请问一下为什么服务器建一次之后就再也成功不了了。。...
  9. bat 取得服务列表_基于IDEA热部署更新服务器Tomcat类,服务器Tomcat热更新
  10. 初识、理解生成器模式