工作原因,笔者需实现多个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用户。
su - git
以下命令均使用git用户执行。
2 找到git用户的家目录
su - git
cd ~
pwd
显示/var/opt/gitlab/
,说明该目录是git用户的家目录。
3 在git用户的家目录生成SSH key
ssh-keygen # 生成SSH key,一路输入Enter键即可
4 为GitLab(镜像仓库)配置免密码登录
more /var/opt/gitlab/.ssh/id_rsa.pub # 即:git用户家目录/.ssh/id_rsa.pub
将内容贴到GitLab以及GitHub,方法比较简单,登录后找到SSH key的选项,然后粘贴即可。
执行如下命令,测试SSH key是否添加成功:
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
。
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
。
对于本例,执行的命令如下:
mkdir custom_hooks
cd custom_hooks
touch post-receive
chmod -R 755 post-receive # 这一步非常重要,必须为该文件赋予可执行权限
在post-receive
中添加如下内容:
#!/bin/bash
echo "$USER"
exec git push -u github &
7 完成
经过以上配置后,当我们执行命令提交到GitLab仓库时,代码也会同步提交到GitHub。
参考文档
本文链接: http://www.itmuch.com/work/git-repo-sync-with-post-receive/
**版权声明: **本博客由周立创作,采用 CC BY 3.0 CN 许可协议。可*转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。