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 |
案例背景
公司近期对于"版本管理工具是否进行切换SVN-->Git"的问题进行了讨论,于是对svn和git进行了相关研究,进而梳理出了Git的特点(优,缺点),最后将Git与SVN进行了对比,对比结果详细见下方内容。
部署SVN服务器
yum -y install subversion
mkdir -p /application/svndata/yunjisuan
mkdir -p /application/svnpasswd
创建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
anon-access = none
auth-access = write
password-db = /application/svnpasswd/passwd
authz-db = /application/svnpasswd/authz
将配置文件覆盖另外两个分支
/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
yunjisuan = 123123
benet = 123123
stu001 = 123
stu002 = 456
vim authz
egrep -v "#|^$" authz
[aliases]
[groups]
testgroup = stu001,stu002
[yunjisuan/master:/]
yunjisuan = rw #master主分支代码提交者---开发经理
benet = r
[yunjisuan/dev:/]
benet = rw #dev开发分支代码提交者---普通程序员
yunjisuan = r #dev开发分支代码下载者---开发经理
[yunjisuan/test:/]
@testgroup = r #test测试分支代码下载者----测试人员
yunjisuan = rw #test测试分支代码提交者---开发经理
svnserve -d -r /application/svndata/
ps -ef | grep svn
使用svn客户端(windows版)
下载链接
链接:https://pan.baidu.com/s/1dKq_JVJN3tFxY_AvMKKTcA
提取码:kn9z
svn客户端软件安装
一路yes即可
在宿主机创建三个svn目录checkout代码,如下图
随便在三个目录上传点代码文件
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包,好处是自动解决依赖问题
初始化GitLab,只需要执行一次
gitlab-ctl reconfigure
查看gitlab启动状态
gitlab-ctl status
在宿主机输入网址进行就可以访问了
登陆管理员账号:root,密码:linyaonie
GitLab中文社区版补丁包安装
ls
tar xf gitlab-11-2-stable-zh.tar.gz
查看系统已经安装的GitLab版本号
cat /opt/gitlab/embedded/service/gitlab-rails/VERSION
查看解压后的补丁版本号
cat gitlab-11-2-stable-zh/VERSION
特别提示:补丁包版本号和安装的GitLab版本号需要一致
备份英文版GitLab
cp -r /opt/gitlab/embedded/service/gitlab-rails{,.bak}
将中文补丁包的内容覆盖英文版
ls
/bin/cp -rf gitlab-11-2-stable-zh/* /opt/gitlab/embedded/service/gitlab-rails/
特别提示:报错不需要管,因为已经设置过root密码,登陆过,所以会报错
重新配置GitLab
gitlab-ctl reconfigure
gitlab-ctl restart
重新刷新浏览器访问GitLab
修改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'
13 external_url 'http://192.168.200.107:8888'
943 nginx['listen_port'] = 8888
重新配置GitLab
gitlab-ctl reconfigure
重新启动GitLab
gitlab-ctl restart
重新访问浏览器
利用git-svn克隆svn代码
特别提示
Yum安装的git没有git-svn功能,要源码安装最新版本
在Git01上操作
安装git-svn支持程序(没有这两个包git-svn报错)
yum -y install subversion-perl perl-Digest-MD5
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
创建Git工作目录并克隆SVN分支代码到本地
mkdir -p /backup
cd /backup
将SVN服务器master分支代码克隆到本地Git工作目录
git svn clone --no-metadata svn://192.168.200.70/yunjisuan/master/ /backup/master/
初始化空的 Git 仓库于 /backup/master/.git/
Authentication realm: <svn://192.168.200.70:3690> 072f4de9-e153-4bf7-ba81-3d5e5f12c9f7
Password for 'root': #输入root登陆密码
Authentication realm: <svn://192.168.200.70:3690> 072f4de9-e153-4bf7-ba81-3d5e5f12c9f7
Username: yunjisuan #输入svn的master分支的授权账户名
Password for 'yunjisuan': #输入svn的master分支的授权账户密码
A testmaster.txt
r1 = 2d14ff71cd66adc7ab59579e1df091d942341d15 (refs/remotes/git-svn)
Checked out HEAD:
svn://192.168.200.70/yunjisuan/master r1
将SVN服务器dev分支代码克隆到本地Git工作目录
git svn clone --no-metadata svn://192.168.200.70/yunjisuan/dev/ /backup/dev/
初始化空的 Git 仓库于 /backup/dev/.git/
Authentication realm: <svn://192.168.200.70:3690> 9149d004-cc0e-48a9-b8a2-3caa58aa2092
Password for 'root': #输入root登陆密码
Authentication realm: <svn://192.168.200.70:3690> 9149d004-cc0e-48a9-b8a2-3caa58aa2092
Username: benet #输入svn的dev分支的授权账户名
Password for 'benet': #输入svn的dev分支的授权账户密码
A testdev.txt
r1 = 29ce1125dcb4e7edd5d7b7765efed357864da6b9 (refs/remotes/git-svn)
D testdev.txt
W: -empty_dir: testdev.txt
r2 = 28513bd8b7caf7add694384f776d4438e89df595 (refs/remotes/git-svn)
W: +empty_dir: testdev
r3 = 4c81bad5817f0d8e1cd8bcde6d6f870d6ef75b82 (refs/remotes/git-svn)
A testdev.txt
r4 = 444d8fe3775f14b22a48650b38331f1541f2b47d (refs/remotes/git-svn)
D testdev
W: -empty_dir: testdev
r5 = f61851f06712ee8519112eb8335e59e4d14e05cf (refs/remotes/git-svn)
Checked out HEAD:
svn://192.168.200.70/yunjisuan/dev r5
将SVN服务器test分支代码克隆到本地Git工作目录
git svn clone --no-metadata svn://192.168.200.70/yunjisuan/test/ /backup/test/
初始化空的 Git 仓库于 /backup/test/.git/
Authentication realm: <svn://192.168.200.70:3690> cf8ca014-62dd-4f60-b821-38db9bf1a0d3
Password for 'root': #输入root登陆密码
Authentication realm: <svn://192.168.200.70:3690> cf8ca014-62dd-4f60-b821-38db9bf1a0d3
Username: yunjisuan #输入svn的test分支的授权账户名
Password for 'yunjisuan': #输入svn的test分支的授权账户密码
A testtest.txt
r1 = 7b428e68cc3bd68c1ddfa12ebe146f0c4881394b (refs/remotes/git-svn)
Checked out HEAD:
svn://192.168.200.70/yunjisuan/test r1
ls
tree
├── dev
│ └── testdev.txt
├── master
│ └── testmaster.txt
└── test
└── testtest.txt
创建组及组权限问题
在GitLab上创建一个组,在组里添加3个成员(主程序员,开发者,报告者)
GitLab默认情况下,master分支是受到保护的(只能主程序员推送和合并)
主程序员=产品经理:推送和合并受保护分支
开发者=开发人员:推送不受保护分支
报告者=测试人员:只能clone代码
通过主程序员账号将从SVN克隆下来的master分支,dev分支,test分支的代码推送到Demo项目里。分支名称不变
在GitLab这个组里创建一个项目叫做demo
图片说明
克隆代码远程仓库到本地
ls
cd master/
ls
git remote add origin http://192.168.200.107:8888/test/demo.git
ls -a
将master目录代码推送到GitLab仓库的Demo项目里
git push -u origin master
Username for 'http://192.168.200.107:8888': master
Password for 'http://215379068@qq.com@192.168.200.187:8888':
对象计数中: 5, 完成.
压缩对象中: 100% (2/2), 完成.
写入对象中: 100% (5/5), 383 bytes | 0 bytes/s, 完成.
Total 5 (delta 1), reused 0 (delta 0)
To http://192.168.200.187:8888/test/demo.git
* [new branch] master -> master
分支 master 设置为跟踪来自 origin 的远程分支 master。
将dev目录代码推送到GitLab仓库的Demo项目里
cd ../dev
git branch
git branch dev
git checkout dev
git branch
ls
git add *
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)')
git config --global user.email "1123400300@qq.com"
git config --global user.name "Mr.sun"
git commit -m "开发分支代码提交"
位于分支 dev
nothing to commit, working tree clean
Username for 'http://192.168.200.187:8888': 1123400300@qq.com
Password for 'http://215379068@qq.com@192.168.200.187:8888':
对象计数中: 8, 完成.
压缩对象中: 100% (3/3), 完成.
写入对象中: 100% (8/8), 628 bytes | 0 bytes/s, 完成.
Total 8 (delta 0), reused 0 (delta 0)
remote:
remote: To create a merge request for dev, visit:
remote: http://192.168.200.187:8888/test/demo/merge_requests/new?merge_request%5Bsource_branch%5D=dev
remote:
To http://192.168.200.187:8888/test/demo.git
* [new branch] dev -> dev
分支 dev 设置为跟踪来自 origin 的远程分支 dev。
git remote add origin http://192.168.200.107:8888/test/demo.git
git push -u origin dev
将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 "测试分支代码提交"
位于分支 test
nothing to commit, working tree clean
git remote add origin http://192.168.200.107:8888/test/demo.git
git push -u origin test
Username for 'http://192.168.200.187:8888': 215379068@qq.com
Password for 'http://215379068@qq.com@192.168.200.187:8888':
对象计数中: 5, 完成.
压缩对象中: 100% (2/2), 完成.
写入对象中: 100% (5/5), 379 bytes | 0 bytes/s, 完成.
Total 5 (delta 1), reused 0 (delta 0)
remote:
remote: To create a merge request for test, visit:
remote: http://192.168.200.187:8888/test/demo/merge_requests/new?merge_request%5Bsource_branch%5D=test
remote:
To http://192.168.200.187:8888/test/demo.git
* [new branch] test -> test
分支 test 设置为跟踪来自 origin 的远程分支 test。
查浏览器查看上传代码结果
项目案例二:测试环境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 邮件配置备份
cd /var/opt/gitlab/backups
ls
执行命令生成备份压缩包
gitlab-rake gitlab:backup:create
查看备份包
ll
6.2.2 更改Gitlab备份目录
GitLab配置文件路径:/etc/gitlab/gitlab.rb
mkdir -p /gitlab-backup
修改如下配置文件
cat -n /etc/gitlab/gitlab.rb.bak | sed -n '299p'
299 # gitlab_rails['backup_path'] = "/var/opt/gitlab/backups"
vim /etc/gitlab/gitlab.rb
cat -n /etc/gitlab/gitlab.rb | sed -n '299p'
299 gitlab_rails['backup_path'] = "/gitlab-backup"
重载GitLab配置文件
gitlab-ctl reconfigure
再次进行备份尝试
cd /gitlab--backup/
ls
gitlab-rake gitlab:backup:create
ls
GitLab的自动备份
将命令写成定时任务,每天凌晨两点执行一次备份操作
设置备份过期时间
设置只保存最近7天的备份,编辑/etc/gitlab/gitlab.rb配置文件,找到如下配置并修改
cat -n /etc/gitlab/gitlab.rb.bak | sed -n '307p'
307 # gitlab_rails['backup_keep_time'] = 604800
cat -n /etc/gitlab/gitlab.rb | sed -n '307p'
307 gitlab_rails['backup_keep_time'] = 604800
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/
在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
给备份文件增加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
执行命令停止相关数据连接服务
第二步:执行命令停止相关数据连接服务
停止相关数据连接服务
gitlab-ctl stop unicorn
gitlab-ctl stop sidekiq
执行命令从备份文件中恢复GitLab
第三步:执行命令从备份文件中恢复GitLab
gitlab-rake gitlab:backup:restore BACKUP=备份文件编号
执行命令恢复数据
ls
gitlab-rake gitlab:backup:restore BACKUP=1546813129_2019_01_07_11.2.3
说明:
恢复过程中出现两个(yes/no),输入两个yes即可
重新启动GitLab
第四步:启动GitLab
gitlab-ctl start
进行Web访问检查
最终我们发现,两台GitLab除了IP和端口不同外,项目内容完全一致