最近我们需要把正在使用的git库在自建的gitlab服务上做个备份。我们有一台Gerrit服务器,一个jenkins服务器。代码开发、review都在Gerrit服务器上,而集成发布是通过jenkins服务器完成的。现在新建了一个gitlab服务器,准备将代码迁移到gitlab作为备份。于是就有了这样的一个需求,如何在两个git仓库之间同步。在网上找到一些方法,大致是这三种思路,使用git clone命令同步、使用git的pull,push命令同步和使用第三方工具来同步。
使用git clone命令同步
- 从原地址克隆一份裸版本库
1
|
git clone –bare git://github.com/username/project.git
|
- 以镜像推送的方式push到gitlab 服务器上
1
2
|
cd project.git
git push –mirror ssh://git@gitlab.com/username/newproject.git
|
该方法比较简单,由于我们项目没有采用,也没有做更多的研究。
使用git的pull,push命令同步
使用pull,push命令是最容易想到的一个办法,我们也是采用的这个方法。它流程比较简单,就是先pull原始库,然后push到新的gitlab库上,但在操作过程中遇到了一些问题。
如何clone出所有远程分支
我们在使用git clone命令时默认是在本地仓库中新建一个master分支,跟踪远程的origin/master分支,但是我们是要同步整个git库,也就是所有分支都需要pull到本地,然后push到新的gitlab库上,这就带来一个问题,如何clone出所有远程分支。 先给出结果:
1
|
git branch -r --list "origin/*" | grep -v HEAD | grep -v master | xargs -I @ git checkout -t @
|
这个命令步骤是先使用 git branch -r –list “origin/*” 命令,获取到所有的origin服务器上的远程分支。
1
2
3
4
5
|
git branch -r --list "origin/*"
输出:
origin/HEAD -> origin/master
origin/develop
origin/master
|
然后使用 grep 命令 过滤掉 HEAD 和 master。
最后使用 git checkout -t 命令新建和远程分支同名的本地分支,把这些命令串起来就是上面给出命令。
如何push所有本地分支到远端仓库
使用git clone命令后,在本地默认有个名为origin远端仓库。但是我们现在要将所有分支推送到gitlab的仓库,所以先要添加一个远端仓库。
1
2
|
# 添加一个名为gitlab的远端仓库
git remote add gitlab ssh://git@gitlab.com/username/newproject.git
|
然后使用push命令推送所有分支及tag
1
2
|
git push -u gitlab --all
git push -u gitlab --tags
|
可用脚本
将上面的步骤串起来就是可以工作的脚本。在本地仓库目录下执行这个脚本就可以把仓库同步到远端的gitlab服务器上。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
#!/bin/bash
GITLAB_URL='ssh://git@gitlab.com/username/newproject.git'
# 删除gitlab服务器
git remote | grep gitlab | xargs -I @ git remote remove @
# 更新master分支
git fetch --all
git checkout master
git branch --set-upstream-to=origin/master master
git pull
# 删除所有本地分支(保留master),拉取创建所有远程分支
git branch | grep -v HEAD | grep -v master | xargs -I @ git branch -D @
git branch -r --list "origin/*" | grep -v HEAD | grep -v master | xargs -I @ git checkout -t @
# 添加gitlab服务器
git remote add gitlab $GITLAB_URL
git push -u gitlab --all
git push -u gitlab --tags
# 删除gitlab服务器
git remote remove gitlab
|
使用第三方工具来同步
在网上还有一些使用第三方工具来做同步的,这个我们没有在现有项目上做尝试。大家有兴趣可以去试试。
gitlab-mirrors
hpr