SVN-->GitLab-->GitLab数据迁移

项目案例一:生产环境SVN数据迁移到测试环境GitLab

主机名IP地址备份特殊要求
SVN 192.168.200.70 SVN服务器
Git01 192.168.200.107 Git客户端 内存2G
Git02 192.168.200.108 GitLab服务器 内存2G

image_1cv22m3rndtb8anb5jc0m1edv1m.png-92.2kB

 

案例背景

公司近期对于"版本管理工具是否进行切换SVN-->Git"的问题进行了讨论,于是对svn和git进行了相关研究,进而梳理出了Git的特点(优,缺点),最后将Git与SVN进行了对比,对比结果详细见下方内容。

image_1cv22nr1u1sj01frb2om1v0t12vf36.png-354.4kB


image_1cv22ogs7nlk1vk71a3t1mdr9923j.png-286.5kB

 

部署SVN服务器

yum -y install subversion

mkdir -p /application/svndata/yunjisuan

mkdir -p /application/svnpasswd

image_1d0hahk3b1lsp1l1brhn1pjev049.png-143.7kB

 

创建yunjisuan项目主分支,开发分支,测试分支

svnadmin create /application/svndata/yunjisuan/master

svnadmin create /application/svndata/yunjisuan/dev

svnadmin create /application/svndata/yunjisuan/test

cd /application/svndata/yunjisuan/master/conf/

cp svnserve.conf{,.bak}

vim svnserve.conf

sed -n '19p;20p;27p;34p' svnserve.conf

 
  1. anon-access = none
  2. auth-access = write
  3. password-db = /application/svnpasswd/passwd
  4. authz-db = /application/svnpasswd/authz

image_1d0haomfb581kb5179c1rdpb98m.png-43.5kB

 

将配置文件覆盖另外两个分支

/bin/cp svnserve.conf /application/svndata/yunjisuan/dev/conf/

/bin/cp svnserve.conf /application/svndata/yunjisuan/test/conf/

cp /application/svndata/yunjisuan/master/conf/authz /application/svnpasswd/

cp /application/svndata/yunjisuan/master/conf/passwd /application/svnpasswd/

cd /application/svnpasswd/

vim passwd

tail -4 passwd

 
  1. yunjisuan = 123123
  2. benet = 123123
  3. stu001 = 123
  4. stu002 = 456

vim authz

egrep -v "#|^$" authz

 
  1. [aliases]
  2. [groups]
  3. testgroup = stu001,stu002
  4. [yunjisuan/master:/]
  5. yunjisuan = rw #master主分支代码提交者---开发经理
  6. benet = r
  7. [yunjisuan/dev:/]
  8. benet = rw #dev开发分支代码提交者---普通程序员
  9. yunjisuan = r #dev开发分支代码下载者---开发经理
  10. [yunjisuan/test:/]
  11. @testgroup = r #test测试分支代码下载者----测试人员
  12. yunjisuan = rw #test测试分支代码提交者---开发经理

svnserve -d -r /application/svndata/

ps -ef | grep svn

image_1d0hbcoma15kk1bi418l5c6n1sp01j.png-90.6kB

 

使用svn客户端(windows版)

下载链接 
链接:https://pan.baidu.com/s/1dKq_JVJN3tFxY_AvMKKTcA 
提取码:kn9z

 

svn客户端软件安装

一路yes即可

 

在宿主机创建三个svn目录checkout代码,如下图

image_1d0hbj0hu9k3vkmsob1mfqqrv20.png-170.9kB


image_1d0hia962fe0mfk1di31es8f81bo.png-180.4kB


image_1d0hblr68jih1rg81kr81jkp72l2q.png-167kB


image_1d0hbnjqs13kbk6t16kr1pmo1ce537.png-99.4kB

随便在三个目录上传点代码文件

 

GitLab软件包下载

链接:https://pan.baidu.com/s/1TYJnh6M01MAVhLRXr-qfLw 
提取码:mqxp

 

在Git01和02上都安装GitLab

ls

yum localinstall gitlab-ce-11.2.3-ce.0.el7.x86_64.rpm -y

yum localinstall -y --->代表利用yum安装本地指定的rpm包,好处是自动解决依赖问题

image_1d0hcu67vora1hmb24j5ur93m9.png-61.6kB

 

初始化GitLab,只需要执行一次

gitlab-ctl reconfigure

image_1d0hd4hqa152i1bqmihgc6s10aum.png-9.3kB

 

查看gitlab启动状态

gitlab-ctl status

image_1d0hdf9v074717ch1a4lmav13pj13.png-60.6kB

 

在宿主机输入网址进行就可以访问了

http://192.168.200.107

登陆管理员账号:root,密码:linyaonie

image_1d0hdhjsc5q11n7buucv6tdo51g.png-100.7kB


image_1d0hdi1578kjebs196ao8a16t11t.png-94kB


image_1d0hdi9sqq08m9dj3c8ji6h2a.png-109.4kB

 

GitLab中文社区版补丁包安装

ls

tar xf gitlab-11-2-stable-zh.tar.gz

image_1d0hdjs547qk14h31b0m7d81nc72n.png-16.9kB

 

查看系统已经安装的GitLab版本号

cat /opt/gitlab/embedded/service/gitlab-rails/VERSION

image_1d0hdkcab1qevh71lop12e31fnm34.png-12.1kB

 

查看解压后的补丁版本号

cat gitlab-11-2-stable-zh/VERSION

特别提示:补丁包版本号和安装的GitLab版本号需要一致

image_1d0hdko59tlkhgha341hhut1e3h.png-10.8kB

 

备份英文版GitLab

cp -r /opt/gitlab/embedded/service/gitlab-rails{,.bak}

image_1d0hdn2u610a788396r1g9e1pik3u.png-10.8kB

 

将中文补丁包的内容覆盖英文版

ls

/bin/cp -rf gitlab-11-2-stable-zh/* /opt/gitlab/embedded/service/gitlab-rails/

特别提示:报错不需要管,因为已经设置过root密码,登陆过,所以会报错

image_1d0hdq2ic1ptlp3b19tp1goue884b.png-35.9kB

 

重新配置GitLab

gitlab-ctl reconfigure

gitlab-ctl restart

image_1d0hdrjve14gbe5ic59t54ii94o.png-9.6kB


image_1d0he5nqp12kvbb612vm1eku1k6i55.png-44.9kB

 

重新刷新浏览器访问GitLab

http://192.168.200.107/

image_1d0her8hvg99ov91dgalhla96p.png-92.3kB

 

修改GitLab配置文件/etc/gitlab/gitlab.rb

我们需要修改GitLab的默认域名(因为我们是在内网搭建的GitLab) 
GitLab默认的监听端口为80,但是在企业中,这个端口经常被别的服务占用,所以我们还需要更换端口号

cp /etc/gitlab/gitlab.rb{,.bak}

vim /etc/gitlab/gitlab.rb

cat -n /etc/gitlab/gitlab.rb | sed -n '13p;943p'

 
  1. 13 external_url 'http://192.168.200.107:8888'
  2. 943 nginx['listen_port'] = 8888

image_1d0hfj7ai187vji11m561lq81cnn8d.png-22.4kB

 

重新配置GitLab

gitlab-ctl reconfigure

image_1d0hfn3h27aif51odclo315km9a.png-98kB

 

重新启动GitLab

gitlab-ctl restart

image_1d0hg5h7e8l41l6v1ge61q0h1m8a9n.png-49.3kB

 

重新访问浏览器

http://192.168.200.107:8888

 

利用git-svn克隆svn代码

 

特别提示

Yum安装的git没有git-svn功能,要源码安装最新版本

 

在Git01上操作

安装git-svn支持程序(没有这两个包git-svn报错)

yum -y install subversion-perl perl-Digest-MD5

image_1d0he8vd311791rfcbj65a9a125i.png-36.9kB


image_1d0hebhv11u5ropethi1465cpa5v.png-155.3kB

 

Git软件包下载链接

链接:https://pan.baidu.com/s/1CHZpkPlGRDuA0nPGqMYJcg 
提取码:cjj6

 

Git01上源码包安装Git

yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker

rpm -qa curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker

ls

tar xf git-2.9.5.tar.gz -C /usr/src

cd /usr/src/git-2.9.5

./configure --prefix=/usr/local/git

make && make install

ln -sf /usr/local/git/bin/* /usr/bin

which git

image_1d0hhgkb615at4b71jap1nbknm4a4.png-135.4kB


image_1d0hhii9r1g225o91462130v7cjah.png-41.9kB


image_1d0hhj4rj1laddiclqno2i1pq2au.png-17.5kB


image_1d0hhnlo11aof1rpe1jq05dr1caubb.png-14.6kB

 

创建Git工作目录并克隆SVN分支代码到本地

mkdir -p /backup

cd /backup

image_1d0hee3mh1efi146kpi015qncvh6c.png-11.1kB

 

将SVN服务器master分支代码克隆到本地Git工作目录

git svn clone --no-metadata svn://192.168.200.70/yunjisuan/master/ /backup/master/

 
  1. 初始化空的 Git 仓库于 /backup/master/.git/
  2. Authentication realm: <svn://192.168.200.70:3690> 072f4de9-e153-4bf7-ba81-3d5e5f12c9f7
  3. Password for 'root': #输入root登陆密码
  4. Authentication realm: <svn://192.168.200.70:3690> 072f4de9-e153-4bf7-ba81-3d5e5f12c9f7
  5. Username: yunjisuan #输入svn的master分支的授权账户名
  6. Password for 'yunjisuan': #输入svn的master分支的授权账户密码
  7. A testmaster.txt
  8. r1 = 2d14ff71cd66adc7ab59579e1df091d942341d15 (refs/remotes/git-svn)
  9. Checked out HEAD:
  10. svn://192.168.200.70/yunjisuan/master r1

image_1d0hisbguis68jcppeedanrec5.png-29.8kB

 

将SVN服务器dev分支代码克隆到本地Git工作目录

git svn clone --no-metadata svn://192.168.200.70/yunjisuan/dev/ /backup/dev/

 
  1. 初始化空的 Git 仓库于 /backup/dev/.git/
  2. Authentication realm: <svn://192.168.200.70:3690> 9149d004-cc0e-48a9-b8a2-3caa58aa2092
  3. Password for 'root': #输入root登陆密码
  4. Authentication realm: <svn://192.168.200.70:3690> 9149d004-cc0e-48a9-b8a2-3caa58aa2092
  5. Username: benet #输入svn的dev分支的授权账户名
  6. Password for 'benet': #输入svn的dev分支的授权账户密码
  7. A testdev.txt
  8. r1 = 29ce1125dcb4e7edd5d7b7765efed357864da6b9 (refs/remotes/git-svn)
  9. D testdev.txt
  10. W: -empty_dir: testdev.txt
  11. r2 = 28513bd8b7caf7add694384f776d4438e89df595 (refs/remotes/git-svn)
  12. W: +empty_dir: testdev
  13. r3 = 4c81bad5817f0d8e1cd8bcde6d6f870d6ef75b82 (refs/remotes/git-svn)
  14. A testdev.txt
  15. r4 = 444d8fe3775f14b22a48650b38331f1541f2b47d (refs/remotes/git-svn)
  16. D testdev
  17. W: -empty_dir: testdev
  18. r5 = f61851f06712ee8519112eb8335e59e4d14e05cf (refs/remotes/git-svn)
  19. Checked out HEAD:
  20. svn://192.168.200.70/yunjisuan/dev r5

image_1d0hjspjb14qbcb96d41qgf1ufccv.png-60.2kB

 

将SVN服务器test分支代码克隆到本地Git工作目录

git svn clone --no-metadata svn://192.168.200.70/yunjisuan/test/ /backup/test/

 
  1. 初始化空的 Git 仓库于 /backup/test/.git/
  2. Authentication realm: <svn://192.168.200.70:3690> cf8ca014-62dd-4f60-b821-38db9bf1a0d3
  3. Password for 'root': #输入root登陆密码
  4. Authentication realm: <svn://192.168.200.70:3690> cf8ca014-62dd-4f60-b821-38db9bf1a0d3
  5. Username: yunjisuan #输入svn的test分支的授权账户名
  6. Password for 'yunjisuan': #输入svn的test分支的授权账户密码
  7. A testtest.txt
  8. r1 = 7b428e68cc3bd68c1ddfa12ebe146f0c4881394b (refs/remotes/git-svn)
  9. Checked out HEAD:
  10. svn://192.168.200.70/yunjisuan/test r1

image_1d0hj8gsav0011a8nbq1sc4fmtci.png-47kB


ls

tree

 
  1. ├── dev
  2. └── testdev.txt
  3. ├── master
  4. └── testmaster.txt
  5. └── test
  6. └── testtest.txt

image_1d0hjt23o1tlfdlb1ie51pgtj35dc.png-14.6kB

 

创建组及组权限问题

 
  1. GitLab上创建一个组,在组里添加3个成员(主程序员,开发者,报告者)
  2. GitLab默认情况下,master分支是受到保护的(只能主程序员推送和合并)
  3. 主程序员=产品经理:推送和合并受保护分支
  4. 开发者=开发人员:推送不受保护分支
  5. 报告者=测试人员:只能clone代码
  6. 通过主程序员账号将从SVN克隆下来的master分支,dev分支,test分支的代码推送到Demo项目里。分支名称不变

image_1d0hkiihhbe0120c41c82lrb6e6.png-41.5kB


image_1d0hkj1uvjgm1vc113qm19p01dpeej.png-82.9kB


image_1d0hl5fik5rlh6l1lvpf2r345f0.png-107.2kB


image_1d0hl6a2u15tr1ik3hjl1gjb1nqrfd.png-122.3kB


image_1d0hl7dfi46f2f91v5t142t1ertga.png-135.8kB


在GitLab这个组里创建一个项目叫做demo

image_1d0hlaeo19d1k9v8r41hk81jkpgn.png-117.1kB


image_1d0hlb6io1oig9041jvr2e2tkkh4.png-152kB


image_1d0hlcsu21fapfcm1bkbm8ojm3hh.png-135kB

图片说明image_1cv22r830qru1niqh1u10uf15h559.png-69.1kB

 

克隆代码远程仓库到本地

ls

cd master/

ls

git remote add origin http://192.168.200.107:8888/test/demo.git

ls -a

image_1d0hjvmrfn0u1uibrfugje1fc6dp.png-39.6kB

 

将master目录代码推送到GitLab仓库的Demo项目里

git push -u origin master

 
  1. Username for 'http://192.168.200.107:8888': master
  2. Password for 'http://215379068@qq.com@192.168.200.187:8888':
  3. 对象计数中: 5, 完成.
  4. 压缩对象中: 100% (2/2), 完成.
  5. 写入对象中: 100% (5/5), 383 bytes | 0 bytes/s, 完成.
  6. Total 5 (delta 1), reused 0 (delta 0)
  7. To http://192.168.200.187:8888/test/demo.git
  8. * [new branch] master -> master
  9. 分支 master 设置为跟踪来自 origin 的远程分支 master

image_1d0hlt8nf1svc1bnubld133q2thie.png-33.9kB

 

将dev目录代码推送到GitLab仓库的Demo项目里

cd ../dev

git branch

git branch dev

git checkout dev

git branch

ls

git add *

git commit -m "开发分支代码提交"

 
  1. 34.
  2. 35.*** Please tell me who you are.
  3. 36.
  4. 37.Run
  5. 38.
  6. 39. git config --global user.email "you@example.com"
  7. 40. git config --global user.name "Your Name"
  8. 41.
  9. 42.to set your accounts default identity.
  10. 43.Omit --global to set the identity only in this repository.
  11. 44.
  12. 45.fatal: unable to auto-detect email address (got 'root@Git01.(none)')

git config --global user.email "1123400300@qq.com"

git config --global user.name "Mr.sun"

git commit -m "开发分支代码提交"

 
  1. 位于分支 dev
  2. nothing to commit, working tree clean
 
  1. Username for 'http://192.168.200.187:8888': 1123400300@qq.com
  2. Password for 'http://215379068@qq.com@192.168.200.187:8888':
  3. 对象计数中: 8, 完成.
  4. 压缩对象中: 100% (3/3), 完成.
  5. 写入对象中: 100% (8/8), 628 bytes | 0 bytes/s, 完成.
  6. Total 8 (delta 0), reused 0 (delta 0)
  7. remote:
  8. remote: To create a merge request for dev, visit:
  9. remote: http://192.168.200.187:8888/test/demo/merge_requests/new?merge_request%5Bsource_branch%5D=dev
  10. remote:
  11. To http://192.168.200.187:8888/test/demo.git
  12. * [new branch] dev -> dev
  13. 分支 dev 设置为跟踪来自 origin 的远程分支 dev

image_1d0hm68ki1dq11rcf19i91s97tk1jb.png-75.9kB


git remote add origin http://192.168.200.107:8888/test/demo.git

git push -u origin dev

image_1d0hmt14ess41t58tj41g5lr2ojo.png-58.8kB

 

将test目录代码推送到GitLab仓库的Demo项目里

cd ../test

git branch

git branch test

git checkout test

git add *

git config --global user.email "1123400300@qq.com"

git config --global user.name "Mr.sun"

git commit -m "测试分支代码提交"

 
  1. 位于分支 test
  2. nothing to commit, working tree clean

git remote add origin http://192.168.200.107:8888/test/demo.git

git push -u origin test

 
  1. Username for 'http://192.168.200.187:8888': 215379068@qq.com
  2. Password for 'http://215379068@qq.com@192.168.200.187:8888':
  3. 对象计数中: 5, 完成.
  4. 压缩对象中: 100% (2/2), 完成.
  5. 写入对象中: 100% (5/5), 379 bytes | 0 bytes/s, 完成.
  6. Total 5 (delta 1), reused 0 (delta 0)
  7. remote:
  8. remote: To create a merge request for test, visit:
  9. remote: http://192.168.200.187:8888/test/demo/merge_requests/new?merge_request%5Bsource_branch%5D=test
  10. remote:
  11. To http://192.168.200.187:8888/test/demo.git
  12. * [new branch] test -> test
  13. 分支 test 设置为跟踪来自 origin 的远程分支 test

image_1d0hn419b126c1tmm4nd1g9fk5.png-97.7kB

 

查浏览器查看上传代码结果

image_1d0hn7cnq1kiv1ovm1e011msi1fe8l2.png-148.3kB

 

项目案例二:测试环境GitLab数据迁移到生产环境GitLab

 

案例背景

前段时间,在某台CentOS服务器上搭建了GitLab环境,并且其他开发组的同仁都陆陆续续把代码从svn迁移到了GitLab,但是之前的CentOS服务器并不是搭建在公司的机房环境,而是搭建在办公室的某台闲置的电脑上,因此为了保证数据安全性,领导要求将之前的GitLab数据全部重新迁移到公司机房的服务器上去。

主机名IP地址备份
Git01 192.168.200.107 GitLab服务器01
Git02 192.168.200.108 GitLab服务器02
 

GitLab的数据备份

 

在Git01上创建备份文件

首先,我们得把老服务器上的Gitlab整体备份,使用Gitlab一键安装包安装Gitlab非常简单,同样的备份恢复与迁移也非常简单。使用一条命令即可创建完整的Gitlab备份。

gitlab-rake gitlab:backup:create

使用以上命令会在/var/opt/gitlab/backups目录下创建一个名称类似为1546812061_2019_01_07_11.2.3_gitlab_backup.tar的压缩包,这个压缩包就是Gitlab整个的完整部分,其中开头1546812061_2019_01_07是备份创建的日期,11.2.3是Gitlab的版本号

/etc/gitlab/gitlab.rb配置文件需要备份 
/var/opt/gitlab/nginx/conf nginx配置文件 
/etc/postfix/main.cf postfix 邮件配置备份

image_1d0hnhm0s1si1gjti6a158nrf8lv.png-65kB


cd /var/opt/gitlab/backups

ls

image_1d0hnimfe11sihlh1qqp1k0t1od2mc.png-16.5kB

 

执行命令生成备份压缩包

gitlab-rake gitlab:backup:create

image_1d0hnphqa1eit1ocs4lrr3b8semp.png-66.3kB

 

查看备份包

ll

image_1d0hnqqid1lbd19nj1bsf1dqvescn6.png-41.1kB

 

6.2.2 更改Gitlab备份目录

GitLab配置文件路径:/etc/gitlab/gitlab.rb

mkdir -p /gitlab-backup

image_1d0ho332usjmugl167h1fp38sbnm.png-17.7kB

 

修改如下配置文件

cat -n /etc/gitlab/gitlab.rb.bak | sed -n '299p'

 
  1. 299 # gitlab_rails['backup_path'] = "/var/opt/gitlab/backups"

vim /etc/gitlab/gitlab.rb

cat -n /etc/gitlab/gitlab.rb | sed -n '299p'

 
  1. 299 gitlab_rails['backup_path'] = "/gitlab-backup"

image_1d0ho5f6g9koi8aa7a195418doo3.png-26.4kB

 

重载GitLab配置文件

gitlab-ctl reconfigure

image_1d0ho7im3165m1qka1sts1ads16emog.png-102.3kB

 

再次进行备份尝试

cd /gitlab--backup/

ls

gitlab-rake gitlab:backup:create

ls

image_1d0hohm3ab3n1ncscth1m851smbot.png-79.7kB

 

GitLab的自动备份

将命令写成定时任务,每天凌晨两点执行一次备份操作

 

设置备份过期时间

设置只保存最近7天的备份,编辑/etc/gitlab/gitlab.rb配置文件,找到如下配置并修改

cat -n /etc/gitlab/gitlab.rb.bak | sed -n '307p'

 
  1. 307 # gitlab_rails['backup_keep_time'] = 604800

cat -n /etc/gitlab/gitlab.rb | sed -n '307p'

 
  1. 307 gitlab_rails['backup_keep_time'] = 604800

image_1d0hoi2cj1ari8bl13bh1de1j24pa.png-15.1kB

 

copy老服务器上面的备份文件到新服务器

确保新GitLab服务器和老GitLab服务器版本相同

在G01上和G02上都部署同版本的GitLab服务器

 

copy老服务器上面的备份文件到新服务器

cd /gitlab-backup/

ls

scp 1546813129_2019_01_07_11.2.3_gitlab_backup.tar 192.168.200.108:/root/

image_1d0hojj2g16m4196djoo1ed611c3pn.png-65.8kB

 

在Git02服务器上从备份数据中恢复GitLab

 

将备份文件权限修改为777

第一步:将备份文件权限修改为777,不然可能恢复的时候会出现权限不够,不能解压的问题。

 

将拷贝过来的备份文件移动到新GitLab的备份目录下

ls

mv 1546813129_2019_01_07_11.2.3_gitlab_backup.tar /var/opt/gitlab/backups/

cd /var/opt/gitlab/backups/

ls

image_1d0hom4ur10o14jc15ji73r21uq4.png-38.5kB

 

给备份文件增加777权限

ls

chmod 777 1546813129_2019_01_07_11.2.3_gitlab_backup.tar

ll 1546813129_2019_01_07_11.2.3_gitlab_backup.tar

image_1d0honb7qcdjkm4df415ls10g9qh.png-31.7kB

 

执行命令停止相关数据连接服务

第二步:执行命令停止相关数据连接服务

 

停止相关数据连接服务

gitlab-ctl stop unicorn

gitlab-ctl stop sidekiq

image_1d0hop0021b9c1a0g37i1qhofgcqu.png-17.7kB

 

执行命令从备份文件中恢复GitLab

第三步:执行命令从备份文件中恢复GitLab

gitlab-rake gitlab:backup:restore BACKUP=备份文件编号

 

执行命令恢复数据

ls

gitlab-rake gitlab:backup:restore BACKUP=1546813129_2019_01_07_11.2.3

 
  1. 说明:
  2. 恢复过程中出现两个(yes/no),输入两个yes即可

image_1d0hosd7s3rcm02o8q1rb11pmhrb.png-58.5kB

 

重新启动GitLab

第四步:启动GitLab

gitlab-ctl start

image_1d0hot4ue249p2v79bpgnbv8ro.png-50.8kB

 

进行Web访问检查

http://192.168.200.107:8888

http://192.168.200.108

image_1d0hrekvs1kd8otq1rspasqo45s5.png-76.8kB

最终我们发现,两台GitLab除了IP和端口不同外,项目内容完全一致

posted @ 2019-07-24 15:30  L1n  阅读(1312)  评论(0编辑  收藏  举报