SVN-GitLab数据迁移
一、生产环境SVN数据迁移到测试环境GitLab
主机名 |
IP地址 |
备份 |
特殊要求 |
SVN |
192.168.200.188 |
SVN服务器 |
无 |
Git01 |
192.168.200.186 |
Git客户端 |
无 |
Git02 |
192.168.200.187 |
GitLab服务器01 |
内存2G |
1.1 Git与SVN对比:优缺点
1.2 部署SVN服务器
1.[root@SVN ~]# yum -y install subversion 2.[root@SVN ~]# mkdir -p /application/svndata/yunjisuan 3.[root@SVN ~]# mkdir -p /application/svnpasswd 4. 5.#创建yunjisuan项目主分支,开发分支,测试分子 6.[root@SVN ~]# svnadmin create /application/svndata/yunjisuan/master 7.[root@SVN ~]# svnadmin create /application/svndata/yunjisuan/dev 8.[root@SVN ~]# svnadmin create /application/svndata/yunjisuan/test 9. 10.[root@SVN ~]# cd /application/svndata/yunjisuan/master/conf/
11.[root@SVN conf]# cp svnserve.conf{,.bak} 12.[root@SVN conf]# vim svnserve.conf 13.[root@SVN conf]# sed -n '19p;20p;27p;34p' svnserve.conf 14.anon-access = none 15.auth-access = write 16.password-db = /application/svnpasswd/passwd 17.authz-db = /application/svnpasswd/authz 18. 19.#将配置文件覆盖另外两个分支 20.[root@SVN conf]# /bin/cp svnserve.conf /application/svndata/yunjisuan/dev/conf/
21.[root@SVN conf]# /bin/cp svnserve.conf /application/svndata/yunjisuan/test/conf/
22.[root@SVN conf]# cp /application/svndata/yunjisuan/master/conf/authz /application/svnpasswd/
23.[root@SVN conf]# cp /application/svndata/yunjisuan/master/conf/passwd /application/svnpasswd/
24.[root@SVN conf]# cd /application/svnpasswd/
25.[root@SVN svnpasswd]# vim passwd 26.[root@SVN svnpasswd]# tail -4 passwd 27.yunjisuan = 123123
28.benet = 123123
29.stu001 = 123
30.stu002 = 456
31.[root@SVN svnpasswd]# vim authz 32.[root@SVN svnpasswd]# egrep -v "#|^$" authz 33.[aliases] 34.[groups] 35.testgroup = stu001,stu002 36.[yunjisuan/master:/] 37.yunjisuan = rw #master主分支代码提交者---开发经理 38.benet = r 39. 40.[yunjisuan/dev:/] 41.benet = rw #dev开发分支代码提交者---普通程序员 42.yunjisuan = r #dev开发分支代码下载者---开发经理 43. 44.[yunjisuan/test:/] 45.@testgroup = r #test测试分支代码下载者----测试人员 46.yunjisuan = rw #test测试分支代码提交者---开发经理 47. 48.[root@SVN svnpasswd]# svnserve -d -r /application/svndata/
49.[root@SVN svnpasswd]# ps -ef | grep svn 50.root 1388 1 0 21:59 ? 00:00:00 svnserve -d -r /application/svndata/ root 1390 1225 0 21:59 pts/0 00:00:00 grep --color=auto svn
在宿主机创建三个svn目录checkout代码,如下图
随便在三个目录上传点代码文件
1.3 利用git-svn克隆svn代码
特别提示:
Yum安装的git没有git-svn功能,要源码安装最新版本
1.#在Git01上操作 2.#安装git-svn支持程序(没有这两个包git-svn报错) 3.[root@Git01 ~]# yum -y install subversion-perl 4.[root@Git01 backup]# yum -y install perl-Digest-MD5 5. 6.#创建Git工作目录并克隆SVN分支代码到本地 7.[root@Git01 ~]# mkdir -p /backup 8.[root@Git01 ~]# cd /backup 9. 10.#将SVN服务器master分支代码克隆到本地Git工作目录 11.[root@Git01 backup]# git svn clone --no-metadata svn://192.168.200.188/yunjisuan/master/ /backup/master/
12.初始化空的 Git 仓库于 /backup/master/.git/
13.Authentication realm: <svn://192.168.200.188:3690> 072f4de9-e153-4bf7-ba81-3d5e5f12c9f7
14.Password for 'root': #输入root登陆密码 15.Authentication realm: <svn://192.168.200.188:3690> 072f4de9-e153-4bf7-ba81-3d5e5f12c9f7
16.Username: yunjisuan #输入svn的master分支的授权账户名 17.Password for 'yunjisuan': #输入svn的master分支的授权账户密码 18. A test.txt 19.r1 = 91d6150e732f2a0191a3609dda47a78592d1406e (refs/remotes/git-svn) 20. D test.txt 21. A testmaster.txt 22.W: -empty_dir: test.txt 23.r2 = 67a5085e0fbc4b2d22a9d381e3b6ad076d2eb31e (refs/remotes/git-svn) 24.Checked out HEAD: 25. svn://192.168.200.188/yunjisuan/master r2
26. 27. 28.#将SVN服务器dev分支代码克隆到本地Git工作目录 29.[root@Git01 backup]# git svn clone --no-metadata svn://192.168.200.188/yunjisuan/dev/ /backup/dev/
30.初始化空的 Git 仓库于 /backup/dev/.git/
31.Authentication realm: <svn://192.168.200.188:3690> 9149d004-cc0e-48a9-b8a2-3caa58aa2092
32.Password for 'root': #输入root登陆密码 33.Authentication realm: <svn://192.168.200.188:3690> 9149d004-cc0e-48a9-b8a2-3caa58aa2092
34.Username: benet #输入svn的dev分支的授权账户名 35.Password for 'benet': #输入svn的dev分支的授权账户密码 36. A test.txt 37.r1 = b7e184a3080b3f046969f39dbf18a07c367d37a2 (refs/remotes/git-svn) 38. M test.txt 39.r2 = 7e33b02be20bc4244086dcd622a18873f7ea93af (refs/remotes/git-svn) 40. D test.txt 41. A testdev.txt 42.W: -empty_dir: test.txt 43.r3 = 5a3189eeff8b15228c78858c27dabeda6c417940 (refs/remotes/git-svn) 44.Checked out HEAD: 45. svn://192.168.200.188/yunjisuan/dev r3
46. 47. 48.#将SVN服务器test分支代码克隆到本地Git工作目录 49.[root@Git01 backup]# git svn clone --no-metadata svn://192.168.200.188/yunjisuan/test/ /backup/test/
50.初始化空的 Git 仓库于 /backup/test/.git/
51.Authentication realm: <svn://192.168.200.188:3690> cf8ca014-62dd-4f60-b821-38db9bf1a0d3
52.Password for 'root': #输入root登陆密码 53.Authentication realm: <svn://192.168.200.188:3690> cf8ca014-62dd-4f60-b821-38db9bf1a0d3
54.Username: yunjisuan #输入svn的test分支的授权账户名 55.Password for 'yunjisuan': #输入svn的test分支的授权账户密码 56. A test.txt 57.r1 = b2d971b3c80708c858dffcdd5a542561b677d93f (refs/remotes/git-svn) 58. D test.txt 59. A testtest.txt 60.W: -empty_dir: test.txt 61.r2 = e57f1c1dab5a12df3cda337726bf89382f572135 (refs/remotes/git-svn) 62.Checked out HEAD: 63. svn://192.168.200.188/yunjisuan/test r2
64. 65.[root@Git01 backup]# ls 66.dev master test 67.[root@Git01 backup]# tree 68.. 69.├── dev 70.│ └── testdev.txt 71.├── master 72.│ └── testmaster.txt 73.└── test 74. └── testtest.txt 75. 76.3 directories, 3 files
在GitLab上创建一个组,在组里添加3个成员(主程序员,开发者,报告者)
GitLab默认情况下,master分支是受到保护的(只能主程序员推送和合并)
主程序员=产品经理:推送和合并受保护分支
开发者=开发人员:推送不受保护分支
报告者=测试人员:只能clone代码
在GitLab这个组里创建一个项目叫做Demo
通过主程序员账号将从SVN克隆下来的master分支,dev分支,test分支的代码推送到Demo项目里。分支名称不变
1.[root@Git01 backup]# ls 2.dev master test 3.[root@Git01 backup]# cd master/
4.[root@Git01 master]# ls 5.testmaster.txt 6.[root@Git01 master]# git remote add origin http://192.168.200.187:8888/test/demo.git
7. 8.#将master目录代码推送到GitLab仓库的Demo项目里 9.[root@Git01 master]# git push -u origin master 10.Username for 'http://192.168.200.187:8888': 215379068@qq.com 11.Password for 'http://215379068@qq.com@192.168.200.187:8888': 12.对象计数中: 5, 完成. 13.压缩对象中: 100% (2/2), 完成. 14.写入对象中: 100% (5/5), 383 bytes | 0 bytes/s, 完成. 15.Total 5 (delta 1), reused 0 (delta 0) 16.To http://192.168.200.187:8888/test/demo.git
17. * [new branch] master -> master 18.分支 master 设置为跟踪来自 origin 的远程分支 master。 19. 20.#将dev目录代码推送到GitLab仓库的Demo项目里 21.[root@Git01 master]# cd /backup/dev 22.[root@Git01 dev]# git branch 23.* master 24.[root@Git01 dev]# git branch dev 25.[root@Git01 dev]# git checkout dev 26.切换到分支 'dev'
27.[root@Git01 dev]# git branch 28.* dev 29. master 30.[root@Git01 dev]# ls 31.testdev.txt 32.[root@Git01 dev]# git add *
33.[root@Git01 dev]# git commit -m "开发分支代码提交"
34. 35.*** Please tell me who you are. 36. 37.Run 38. 39. git config --global user.email "you@example.com"
40. git config --global user.name "Your Name"
41. 42.to set your accounts default identity. 43.Omit --global to set the identity only in this repository. 44. 45.fatal: unable to auto-detect email address (got 'root@Git01.(none)') 46.[root@Git01 dev]# git config --global user.email "215379068@qq.com"
47.[root@Git01 dev]# git config --global user.name "Mr.chen"
48.[root@Git01 dev]# git commit -m "开发分支代码提交"
49.位于分支 dev 50.nothing to commit, working tree clean 51.[root@Git01 dev]# git push -u origin dev 52.Username for 'http://192.168.200.187:8888': 215379068@qq.com 53.Password for 'http://215379068@qq.com@192.168.200.187:8888': 54.对象计数中: 8, 完成. 55.压缩对象中: 100% (3/3), 完成. 56.写入对象中: 100% (8/8), 628 bytes | 0 bytes/s, 完成. 57.Total 8 (delta 0), reused 0 (delta 0) 58.remote: 59.remote: To create a merge request for dev, visit: 60.remote: http://192.168.200.187:8888/test/demo/merge_requests/new?merge_request%5Bsource_branch%5D=dev
61.remote: 62.To http://192.168.200.187:8888/test/demo.git
63. * [new branch] dev -> dev 64.分支 dev 设置为跟踪来自 origin 的远程分支 dev。 65. 66. 67.#将test目录代码推送到GitLab仓库的Demo项目里 68.[root@Git01 dev]# cd /backup/test/
69.[root@Git01 test]# git branch 70.* master 71.[root@Git01 test]# git branch test 72.[root@Git01 test]# git checkout test 73.切换到分支 'test'
74.[root@Git01 test]# git add *
75.[root@Git01 test]# git config --global user.email "215379068@qq.com"
76.[root@Git01 test]# git config --global user.name "Mr.chen"
77.[root@Git01 test]# git commit -m "测试分支代码提交"
78.位于分支 test 79.nothing to commit, working tree clean 80.[root@Git01 test]# git remote add origin http://192.168.200.187:8888/test/demo.git
81.[root@Git01 test]# git push -u origin test 82.Username for 'http://192.168.200.187:8888': 215379068@qq.com 83.Password for 'http://215379068@qq.com@192.168.200.187:8888': 84.对象计数中: 5, 完成. 85.压缩对象中: 100% (2/2), 完成. 86.写入对象中: 100% (5/5), 379 bytes | 0 bytes/s, 完成. 87.Total 5 (delta 1), reused 0 (delta 0) 88.remote: 89.remote: To create a merge request for test, visit: 90.remote: http://192.168.200.187:8888/test/demo/merge_requests/new?merge_request%5Bsource_branch%5D=test
91.remote: 92.To http://192.168.200.187:8888/test/demo.git
93. * [new branch] test -> test 94.分支 test 设置为跟踪来自 origin 的远程分支 test。
二、测试环境GitLab数据迁移到生产环境GitLab
2.1 案例背景
前段时间,在某台CentOS服务器上搭建了GitLab环境,并且其他开发组的同仁都陆陆续续把代码从svn迁移到了GitLab,但是之前的CentOS服务器并不是搭建在公司的机房环境,而是搭建在办公室的某台闲置的电脑上,因此为了保证数据安全性,领导要求将之前的GitLab数据全部重新迁移到公司机房的服务器上去。
主机名 |
IP地址 |
备份 |
特殊要求 |
Git01 |
192.168.200.186 |
GitLab服务器01 |
内存2G |
Git02 |
192.168.200.187 |
GitLab服务器02 |
内存2G |
2.2 GitLab的数据备份
2.2.1 创建备份文件
首先,我们得把老服务器上的Gitlab整体备份,使用Gitlab一键安装包安装Gitlab非常简单,同样的备份恢复与迁移也非常简单。使用一条命令即可创建完整的Gitlab备份。
gitlab-rake gitlab:backup:create
使用以上命令会在/var/opt/gitlab/backups目录下创建一个名称类似为1537115457_2018_09_17_11.2.3_gitlab_backup.tar的压缩包,这个压缩包就是Gitlab整个的完整部分,其中开头1537115457_2018_09_17\是备份创建的日期,11.2.3是Gitlab的版本号
- /etc/gitlab/gitlab.rb配置文件需要备份
- /var/opt/gitlab/nginx/conf nginx配置文件
- /etc/postfix/main.cf postfix 邮件配置备份
1.[root@Git02 backups]# pwd 2./var/opt/gitlab/backups 3.[root@Git02 backups]# ls 4. 5.#执行命令生成备份压缩包 6.[root@Git02 backups]# gitlab-rake gitlab:backup:create 7. 8.#查看备份包 9.[root@Git02 backups]# ls 10.1537370009_2018_09_19_11.2.3_gitlab_backup.tar 1537370260_2018_09_19_11.2.3_gitlab_backup.tar 11.[root@Git02 backups]# ll 12.总用量 184
13.-rw------- 1 git git 92160 9月 19 23:13 1537370009_2018_09_19_11.2.3_gitlab_backup.tar 14.-rw------- 1 git git 92160 9月 19 23:17 1537370260_2018_09_19_11.2.3_gitlab_backup.tar #最后一次备份
2.2.2 更改GitLab备份目录
GitLab配置文件路径:/etc/gitlab/gitlab.rb
1.[root@Git02 ~]# mkdir -p /backup 2.#修改如下配置文件 3.[root@Git02 ~]# cat -n /etc/gitlab/gitlab.rb.bak | sed -n '299p'
4. 299 # gitlab_rails['backup_path'] = "/var/opt/gitlab/backups"
5.[root@Git02 ~]# cat -n /etc/gitlab/gitlab.rb | sed -n '299p'
6. 299 gitlab_rails['backup_path'] = "/backup"
7. 8.#重载GitLab配置文件 9.[root@Git02 ~]# gitlab-ctl reconfigure 10. 11.#再次进行备份尝试 12.[root@Git02 ~]# cd /backup/
13.[root@Git02 backup]# ls 14.[root@Git02 backup]# gitlab-rake gitlab:backup:create 15.[root@Git02 backup]# ls 16.1537371499_2018_09_19_11.2.3_gitlab_backup.tar
2.2.3 GitLab的自动备份
将命令写成定时任务,每天凌晨两点执行一次备份操作
2.2.4 设置备份过期时间
设置只保存最近7天的备份,编辑/etc/gitlab/gitlab.rb配置文件,找到如下配置并修改
1.[root@Git02 ~]# cat -n /etc/gitlab/gitlab.rb.bak | sed -n '307p'
2. 307 # gitlab_rails['backup_keep_time'] = 604800
3.[root@Git02 ~]# cat -n /etc/gitlab/gitlab.rb | sed -n '307p'
4. 307 gitlab_rails['backup_keep_time'] = 604800
2.3 copy老服务器上面的备份文件到新服务器
2.3.1 确保新GitLab服务器和老GitLab服务器版本相同
在G01上和G02上都部署同版本的GitLab服务器
2.3.2 copy老服务器上面的备份文件到新服务器
1.[root@Git02 ~]# cd /backup/
2.[root@Git02 backup]# ls 3.1537371499_2018_09_19_11.2.3_gitlab_backup.tar 4.[root@Git02 backup]# scp 1537371499_2018_09_19_11.2.3_gitlab_backup.tar root@192.168.200.186:/root/
5.root@192.168.200.186's password:
1537371499_2018_09_19_11.2.3_gitlab_backup.tar 100% 90KB 23.4MB/s 00:00
2.4 从备份数据中恢复GitLab
2.4.1 将备份文件权限修改为777
第一步:将备份文件权限修改为777,不然可能恢复的时候会出现权限不够,不能解压的问题。
1.#将拷贝过来的备份文件移动到新GitLab的备份目录下 2.[root@Git01 ~]# mv 1537371499_2018_09_19_11.2.3_gitlab_backup.tar /var/opt/gitlab/backups/
3.[root@Git01 ~]# cd /var/opt/gitlab/backups/
4.[root@Git01 backups]# ls 5.1537371499_2018_09_19_11.2.3_gitlab_backup.tar 6. 7.#给备份文件增加777权限 8.[root@Git01 backups]# chmod 777 1537371499_2018_09_19_11.2.3_gitlab_backup.tar 9.[root@Git01 backups]# ll 1537371499_2018_09_19_11.2.3_gitlab_backup.tar 10.-rwxrwxrwx 1 root root 92160 9月 20 22:17 1537371499_2018_09_19_11.2.3_gitlab_backup.tar
2.4.2 执行命令停止相关数据连接服务
第二步:执行命令停止相关数据连接服务
1.#停止相关数据连接服务 2.[root@Git01 ~]# gitlab-ctl stop unicorn 3.ok: down: unicorn: 0s, normally up 4. 5.[root@Git01 ~]# gitlab-ctl stop sidekiq 6.ok: down: sidekiq: 0s, normally up
2.4.3 执行命令从备份文件中恢复GitLab
第三步:执行命令从备份文件中恢复GitLab
gitlab-rake gitlab:backup:restore BACKUP=备份文件编号
1.#执行命令恢复数据 2.[root@Git01 ~]# gitlab-rake gitlab:backup:restore BACKUP=1537371499_2018_09_19_11.2.3
3. 4.说明: 恢复过程中出现两个(yes/no),输入两个yes即可
2.4.4 重新启动GitLab
第四步:启动GitLab
1.[root@Git01 ~]# gitlab-ctl start 2.ok: run: alertmanager: (pid 30942) 1078s 3.ok: run: gitaly: (pid 30950) 1077s 4.ok: run: gitlab-monitor: (pid 30971) 1077s 5.ok: run: gitlab-workhorse: (pid 30976) 1077s 6.ok: run: logrotate: (pid 30984) 1076s 7.ok: run: nginx: (pid 30991) 1076s 8.ok: run: node-exporter: (pid 30996) 1075s 9.ok: run: postgres-exporter: (pid 31075) 1075s 10.ok: run: postgresql: (pid 31084) 1074s 11.ok: run: prometheus: (pid 31093) 1074s 12.ok: run: redis: (pid 31102) 1073s 13.ok: run: redis-exporter: (pid 31106) 1073s 14.ok: run: sidekiq: (pid 32321) 1s ok: run: unicorn: (pid 32328) 0s
2.4.5 进行Web访问检查
两台GitLab除了IP和端口不同外,项目内容完全一致