最近我们需要把正在使用的git库在自建的gitlab服务上做个备份。我们有一台Gerrit服务器,一个jenkins服务器。代码开发、review都在Gerrit服务器上,而集成发布是通过jenkins服务器完成的。现在新建了一个gitlab服务器,准备将代码迁移到gitlab作为备份。于是就有了这样的一个需求,如何在两个git仓库之间同步。在网上找到一些方法,大致是这三种思路,使用git clone命令同步、使用git的pull,push命令同步和使用第三方工具来同步。

使用git clone命令同步

  1. 从原地址克隆一份裸版本库
1
git clone –bare git://github.com/username/project.git
  1. 以镜像推送的方式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