Fork me on GitHub

使用post receive hook同步Git仓库

工作原因,笔者需实现多个Git仓库数据的同步。

前面我们已经讲过使用GitLab Mirrors同步多个Git仓库( http://www.itmuch.com/work/git-repo-sync-with-gitlab-mirrors/ ),不过毕竟是定时任务,有一定的延时。本文探讨如何使用post receive hook同步多个Git仓库。

方便起见:

  • GitLab仓库(原始仓库):http://192.168.1.102/root/test
  • GitHub仓库(镜像仓库,开始是一个未经初始化的空仓库):https://github.com/eacdy/test-can-del

下面演示如何同步。

原理比较简单,利用Git Hook中的post-receive 钩子,当提交代码到GitLab时会触发该钩子,指定我们编写的代码(本例中就是提交到镜像仓库啦)。

GitLab自定义Hook官方文档:https://docs.gitlab.com/ee/administration/custom_hooks.html

1 在GitLab所在的机器,切换用户到git

GitLab默认使用的用户是git ,因此需要切换成git用户。

1
su - git

以下命令均使用git用户执行。

2 找到git用户的家目录

1
2
3
su - git
cd ~
pwd

显示/var/opt/gitlab/ ,说明该目录是git用户的家目录。

3 在git用户的家目录生成SSH key

1
ssh-keygen  # 生成SSH key,一路输入Enter键即可

4 为GitLab(镜像仓库)配置免密码登录

1
more /var/opt/gitlab/.ssh/id_rsa.pub   # 即:git用户家目录/.ssh/id_rsa.pub

将内容贴到GitLab以及GitHub,方法比较简单,登录后找到SSH key的选项,然后粘贴即可。

执行如下命令,测试SSH key是否添加成功:

1
ssh -T git@github.com

如配置无误,会看到类似Hi eacdy! You've successfully authenticated, but GitHub does not provide shell access. 的文字。

5 添加镜像仓库

找到GitLab(原始仓库)的存储路径,并为原始仓库添加镜像仓库。

GitLab存储路径的规律如下:例如有一个仓库叫root/test4 ,那么该仓库的存储路径则是:~/git-data/repositories/root/test.git

1
2
cd /var/opt/gitlab/git-data/repositories/root/test.git/
git remote add --mirror=push github git@github.com:eacdy/test-can-del.git

6 同步仓库

在该目录下创建目录custom_hooks ,并新建文件post-receive

对于本例,执行的命令如下:

1
2
3
4
mkdir custom_hooks
cd custom_hooks
touch post-receive
chmod -R 755 post-receive # 这一步非常重要,必须为该文件赋予可执行权限

post-receive 中添加如下内容:

1
2
3
#!/bin/bash
echo "$USER"
exec git push -u github &

7 完成

经过以上配置后,当我们执行命令提交到GitLab仓库时,代码也会同步提交到GitHub。

参考文档

评论系统未开启,无法评论!