p1、查询端口号占用,根据端口查看进程信息/p

2017年6月份的时候,我就着手在公司推广git,首先我自己尝试搭建了GitLab来管理代码,并且通过以下博客记录了GitLab的搭建,以及GitLab备份,GitLab升级等事情。

  • git学习——>在CenterOS系统上安装GitLab并自定义域名访问GitLab管理页面
  • git学习——>如何汉化GitLab?
  • (转)git学习——>Git 分支管理最佳实践
  • git学习——> Gitlab如何进行备份恢复与迁移?
  • git学习——> 解决Gitlab 版本升级之后,发送 merge request 出现 http 500 的返回码错误
  • Git学习–>如何通过Shell脚本自动定时将Gitlab备份文件复制到远程服务器?
  • Git学习–>如何通过Shell脚本实现 监控Gitlab备份整个过程并且通过邮件通知得到备份结果?
  • Git学习–>关于Jenkins编译时候,如何获取Git分支的当前分支名?
  • Git学习–>GitLab如何屏蔽掉注册功能?
  • Git学习–>GitLab如何修改时区?

但是关于从SVN迁移到Git的具体操作到是没有记录下来,只记录了一份博客。

  • git学习——>从SVN迁移到Git之后,项目开发代码继续在SVN提交,如何同步迁移之后继续在SVN提交的代码到Git?

现在想想,今年年初的时候,我们部门的软件代码已经全部成功迁移到了GitLab上,管理的项目已经达到300+,GitLab成员已经达到100+,Group分了60+来进行管理,整个管理起来有条不紊的,权限分配的都很合理。

这里写图片描述

现在我们来讲一讲,去年是怎么从SVN迁移到Git的,可能很多人这一步都很难走对。因为你要迁移过来,但是又不能将原来的SVN的commit记录丢失,所以得用一套比较靠谱的方案。当时我自己用我自己的一份代码做好了迁移test之后,输出了一份《SVN项目迁移到Git操作指南》,然后将每个项目小组的组长包括Android、IOS、Html5等组长都培训了一轮之后,大家都成功的将已有的SVN项目迁移到了GitLab上,后续的新项目都直接在GitLab上新建了。


下面以网易云音乐为例,记录SVN代码仓库迁移到GitLab仓库的过程。

参考链接

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

  • git与svn 共舞

  • 走进git时代系列二》 从SVN迁移到GIT教程

  • SVN迁移到Git的过程(+一些技巧)

  • svn 迁移到git下全过程

  • 将代码库从 SVN 迁移至 Git 并保留所有 commit 记录

  • Git 与其他系统 - 迁移到 Git

  • 从SVN迁移代码到Git实践总结

第一步、建立SVN用户到git用户的映射文件

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

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

ouyangpeng = ouyangpeng <ouyangpeng@oaserver.dw.gdbbk.com>
huxiaoqiao = huxiaoqiao <huxiaoqiao@oaserver.dw.gdbbk.com>
  • 1
  • 2

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

这里写图片描述

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

获取svn提交的作者名

svn log --xml | grep "^<author" | sort -u | \awk -F '<author>' '{print $2}' | awk -F '</author>' '{print $1}' > userinfo.txt
  • 1

这里写图片描述

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

lihongmeng
liyang
wangshuyin
wuqi
youpeng
ouyangpeng 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

lihongmeng = lihongmeng <lihongmeng@oaserver.dw.gdbbk.com>
liyang = liyang <liyang@oaserver.dw.gdbbk.com>
wangshuyin = wangshuyin <wangshuyin@oaserver.dw.gdbbk.com> wuqi = wuqi <wuqi@oaserver.dw.gdbbk.com> youpeng = youpeng <youpeng@oaserver.dw.gdbbk.com> ouyangpeng = ouyangpeng <ouyangpeng@oaserver.dw.gdbbk.com>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

第二步、通过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=branches
  • 1
  • 参数–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/tags
  • 1
  • 2

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

接下来,把refs/remotes下面剩下的索引变成本地分支:

cp -Rf .git/refs/remotes/* .git/refs/heads/
rm -Rf .git/refs/remotes
  • 1
  • 2

合并一起一共执行4条命令。

cp -Rf .git/refs/remotes/tags/* .git/refs/tags/rm -Rf .git/refs/remotes/tagscp -Rf .git/refs/remotes/* .git/refs/heads/rm -Rf .git/refs/remotes
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

尝试方法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/tagscp -rf .git/refs/remotes/origin/* .git/refs/heads/rm -rf .git/refs/remotes
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

现在所有的旧分支都变成真正的分支,所有的旧标签也变成真正的标签。 
执行后效果如下所示,可以看到其他的branch都挪到了本地。

这里写图片描述

尝试方法3

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

这里写图片描述

没办法,去官网查询了下

  • https://git-scm.com/book/zh/v1/Git-%E4%B8%8E%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F-%E8%BF%81%E7%A7%BB%E5%88%B0-Git

使用如下的方法做操作。

首先要移动标签,把它们从奇怪的远程分支变成实际的标签,然后把剩下的分支移动到本地。要把标签变成合适的 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"; done
  • 1

该命令将原本以 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"; done
  • 1

这里写图片描述

这里写图片描述

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

1、添加远程git remote 地址

在本地的仓库中,增加远程git remote 地址:

git remote add origin git@172.28.10.23:AndroidWatch/NetEaseCloudMusic.git
  • 1

2、配置git 的 username 和 email

git config --global user.name ouyangpeng
git config --global user.email ouyangpeng@oaserver.dw.gdbbk.com 
  • 1
  • 2
  • 3

下面是配置好的内容

这里写图片描述

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' 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

如上图所示,有可能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. 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

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 --tags
Everything up-to-date
  • 1
  • 2
  • 3
  • 4

这里写图片描述

第四步、查看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-ref
9caa27cc211162aeed6e944144f4c676d2f1dfe1 refs/heads/develop
9caa27cc211162aeed6e944144f4c676d2f1dfe1 refs/heads/master
0ba94e3383d6f478844b1e674465fbc6ae0277e3 refs/remotes/git-svn
9caa27cc211162aeed6e944144f4c676d2f1dfe1 refs/remotes/origin/develop 62333dcb3beeb73e28538f815abfdfe791b88c00 refs/remotes/origin/local-git-svn 9caa27cc211162aeed6e944144f4c676d2f1dfe1 refs/remotes/origin/master [root@xtgl207940 trunk]# git checkout -b local-git-svn remotes/git-svn 切换到一个新分支 'local-git-svn' [root@xtgl207940 trunk]# 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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

这里写图片描述

[root@xtgl207940 trunk]# git svn fetch 
[root@xtgl207940 trunk]# git log
  • 1
  • 2
  • 3

第四步,切换分支到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]# 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

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

这里写图片描述

第六步,查看gitlab上的代码

这里写图片描述


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

转载于:https://www.cnblogs.com/itrena/p/9062653.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/570835.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

point-position2修改版

说明&#xff1a; 在共面直线测试中&#xff0c;由于计算误差等原因&#xff0c;共面条件判断不准&#xff0c;但计算结果依然正确。 // point-position2.cpp : 定义控制台应用程序的入口点。 #include "stdafx.h" #include <stdio.h> #include <iostream&g…

Linux学习总结(十六)系统用户及用户组管理

先来认识两个文件/etc/passwd/etc/shadow我们打印出首尾三行&#xff0c;来了解下&#xff1a;每行由&#xff1a;分割为7段&#xff0c;每段含义为&#xff1a;第一段&#xff1a;用户名&#xff0c;比如root 用户&#xff0c;普通用户test,lv,test1第二段&#xff1a;早期存放…

hadoop综合大作业

Hadoop综合大作业 要求&#xff1a; 1.用Hive对爬虫大作业产生的文本文件&#xff08;或者英文词频统计下载的英文长篇小说&#xff09;词频统计。 词频统计的截图如下&#xff1a; 上次我所使用的文章是一篇中文文章&#xff0c;所以这次我用了一篇英文文档来进行分词&#xf…

MPI对道路车辆情况的Nagel-Schreckenberg 模型进行蒙特卡洛模拟

平台Ubuntu 16.04&#xff0c;Linux下MPI环境的安装见链接&#xff1a;https://blog.csdn.net/lusongno1/article/details/61709460据 Nagel-Schreckenberg 模型&#xff0c;车辆的运动满足以下规则&#xff1a;1. 假设当前速度是 v &#xff0c;和前一辆车的距离为d。2. 如…

Android 中.aar文件生成方法与用法

https://i.cnblogs.com/EditPosts.aspx?opt1 无论是用Eclipse还是用Android Studio做android开发&#xff0c;都会接触到jar包&#xff0c;全称应该是&#xff1a;Java Archive&#xff0c;即java归档文件。在用AS的过程中&#xff0c;你会发现有aar这么个东西&#xff0c;经查…

windows10上安装mysql

环境&#xff1a;windwos 10&#xff08;1511&#xff09; 64bit、mysql 5.7.14 一、下载mysql1. 在浏览器里打开mysql的官网http://www.mysql.com/2. 进入页面顶部的"Downloads"3. 打开页面底部的“Community(GPL) Downloads” 4. 在页面中间的位置找到我们windows上…

sql server 内存初探

sql server 内存初探 原文:sql server 内存初探一. 前言 对于sql server 这个产品来说&#xff0c;内存这块是最重要的一个资源&#xff0c; 当我们新建一个会话&#xff0c;相同的sql语句查询第二次查询时间往往会比第一次快&#xff0c;特别是在sql统计或大量查询数据输出时&…

使用TcpClient的例程

例子1&#xff1a; ///假定一切工作正常 ///连接后发送一次消息&#xff0c;然后不停接受消息并且打印 主要API说明 TcpClient clientnew TcpClient(); client.Connect("127.0.0.1",8888); NetworkStream streamclient.GetStream(); 发送&#xff1a; stream.Write(o…

20172324 2017-2018-2《程序设计与数据结构》实验三报告

20172324 2017-2018-2《程序设计与数据结构》实验三报告 课程&#xff1a;《程序设计与数据结构》 班级&#xff1a; 1723 姓名&#xff1a; 曾程 学号&#xff1a;20172324 实验教师&#xff1a;王志强 实验日期&#xff1a;2018年5月23日 必修/选修&#xff1a; 必修 一、实验…

mysql if--else

SQL之case when then用法 case具有两种格式。简单case函数和case搜索函数。 --简单case函数 case sexwhen 1 then 男when 2 then 女’else 其他 end --case搜索函数 case when sex 1 then 男when sex 2 then 女else 其他 end 这两种方式&#xff0c;可以实现相同的功能。简…

笔记41 Spring Web Flow——Demo

订购披萨的应用整体比较比较复杂&#xff0c;现拿出其中一个简化版的流程&#xff1a;即用户访问首页&#xff0c;然后输入电话号&#xff08;假定未注册&#xff09;后跳转到注册页面&#xff0c;注册完成后跳转到配送区域检查页面&#xff0c;最后再跳转回首页。通过这个简单…

CSS3弹性盒子Flex

CSS3弹性盒子Flex 基础知识和术语 原文链接&#xff1a;https://css-tricks.com/snippets/css/a-guide-to-flexbox/ 父级&#xff08;flex容器&#xff09;的属性 &#xff03;显示 这定义了一个flex容器; 内联或块取决于给定的值。它为所有直接的孩子提供了一个弹性环境。 .co…

cloudera manager的7180 web界面访问不了的解决办法(图文详解)

说在前面的话 我的机器是总共4台&#xff0c;分别为ubuntucmbigdata1、ubuntucmbigdata2、ubuntucmbigdata3和ubuntucmbigdata4。&#xff08;注意啦&#xff0c;以下是针对Ubuntu系统的&#xff09; 在ubuntucmbigdata1上执行了 sudo apt-get install cloudera-manager-daemon…

2018 ios开发者账号同意新协议加联系电话教程

苹果开发者账号经常会更新协议&#xff0c;需要同意新的协议账号才能正常使用。 1、首先登录苹果开发者中心https://developer.apple.com/account/ 会出现下面飘红的提示&#xff0c;就是提示你要同意新协议。因为苹果规则的改变&#xff0c;需要先到appid管理中心加个联系手机…

Django REST FRAMEWORK swagger(一)框架详解

Django REST FRAMEWORK swagger&#xff08;一、框架详解&#xff09; 一.Django REST SWAGGER框架图 具体见下图 二.说明 RESTFul说明 每一个URI代表一种资源&#xff1b; 客户端和服务器之间&#xff0c;传递这种资源的某种表现层&#xff1b; 客户端通过四个HTTP动词&…

Prism for WPF初探(构建简单的模块化开发框架)

Prism for WPF初探&#xff08;构建简单的模块化开发框架&#xff09; 原文:Prism for WPF初探&#xff08;构建简单的模块化开发框架&#xff09;先简单的介绍一下Prism框架&#xff0c;引用微软官方的解释&#xff1a; Prism provides guidance to help you more easily desi…

15-[JavaScript]-ECMAScript 1

0.javaScript的发展历程 https://zhuanlan.zhihu.com/p/27985124 1、javaScript是什么&#xff1f; javaScript是一种web前端的描述语言&#xff0c;也是一种基于对象&#xff08;object&#xff09;和事件驱动&#xff08;Event Driven&#xff09;的、安全性好的脚本语言。 它…

WPF MVVM 架构 Step By Step(2)(简单的三层架构示例及粘合代码GLUE code)

WPF MVVM 架构 Step By Step(2)&#xff08;简单的三层架构示例及粘合代码GLUE code&#xff09; 原文:WPF MVVM 架构 Step By Step(2)&#xff08;简单的三层架构示例及粘合代码GLUE code&#xff09;我们第一步就是去了解三层架构和问题然后去看MVVM是怎么去解决这些问题的。…

基于YARN集群构建运行PySpark Application

文章转载&#xff1a;https://www.tuicool.com/articles/eaYVN3v Spark Application可以直接运行在YARN集群上&#xff0c;这种运行模式&#xff0c;会将资源的管理与协调统一交给YARN集群去处理&#xff0c;这样能够实现构建于YARN集群之上Application的多样性&#xff0c;比…

Apache nifi 集群安装

原文地址&#xff1a;https://pierrevillard.com/2016/08/13/apache-nifi-1-0-0-cluster-setup/ 文章写的很好了&#xff0c;步骤性的英文写得也比较易懂&#xff0c;原样搬过来了&#xff0c;没有再翻译 As you may know a version 1.0.0-BETA of Apache NiFi has been rele…