是否可以将gitlab设置为自动同步(镜像)托管在另一个位置的存储库?
目前,我知道的最简单的方法是手动推送到两个(gitlab 和另一个)存储库,但这既费时又容易出错。
最大的问题是,如果两个用户同时将更改推送到两个不同的存储库,镜像可能会重新同步。我能想出的防止此问题的最佳方法是确保用户只能推送到其中一个存储库。
是否可以将gitlab设置为自动同步(镜像)托管在另一个位置的存储库?
目前,我知道的最简单的方法是手动推送到两个(gitlab 和另一个)存储库,但这既费时又容易出错。
最大的问题是,如果两个用户同时将更改推送到两个不同的存储库,镜像可能会重新同步。我能想出的防止此问题的最佳方法是确保用户只能推送到其中一个存储库。
2016 年 12 月更新:GitLAb EE 8.2+ 支持镜像:请参阅“存储库镜像”。
正如齐晓东评论的那样:
这个答案可以在不使用任何命令行的情况下简化(只需在 Gitlab repo 管理界面上设置)
原始答案(2013 年 1 月)
如果您的远程镜像仓库是一个裸仓库,那么您可以在您的gitlab管理的仓库中添加一个 post-receive 挂钩,并在其中推送到您的远程仓库。
#!/bin/bash
git push --mirror slave_user@mirror.host:/path/to/repo.git
正如 Gitolite(Gitlab 使用)提到的那样:
如果您只想在几个特定的存储库中安装挂钩,请直接在服务器上进行。
这将是:
~git/repositories/yourRepo.git/hook/post-receive
警告(2014 年 10 月更新)
今天(2014 年第四季度)这将失败,因为 GitLab 自动将 github.com/gitlabhq/gitlab-shell/tree/... 符号链接到它管理的每个存储库中。
因此,如果您进行此更改,您修改的每个存储库都将尝试推送。
更不用说升级时可能发生的冲突gitlab-shell
,并且当前脚本是 ruby 脚本,而不是 bash(而且你不应该删除它!)。您可以通过读取当前目录名称并确保它与远程之间的双射来纠正此问题,但我建议人们远离这些东西
请参阅(并投票支持)反馈“推送到 GitLab 存储库后自动推送到远程镜像存储库”。
2016 年 7 月更新:我看到为 GitLab EE(企业版)添加了这种功能:MR 249
请注意,最近的Remote Mirror Repository
(问题 17940)可能很棘手:
我目前正在尝试将我公司 Lossless GmbH ( https://www.npmjs.com/~lossless ) 的开源 npm 模块的主要开发从 GitHub.com 转移到 GitLab.com
我正在从 GitHub 导入所有存储库,但是当我尝试关闭
Mirror Repository
并Remote Mirror Repository
使用原始 GitHub URL 打开时,我收到一条错误消息:
Remote mirrors url is already in use
这是失败的存储库之一:https: //gitlab.com/pushrocks/npmts 2 个月前编辑
事实证明,它只需要多个步骤:
- 禁用镜像存储库
- 按保存
- 删除网址
- 按保存
- 然后添加远程镜像
如果没有托管您自己的 GitLab,值得知道 GitLab.com 直接引入了此功能,没有任何变通方法。
https://yourgithubusername:yourgithubpassword@github.com/agaric/guts_discuss_resource.git
请注意,如果您从远程存储库中提取,它仍将推送到此处设置的远程存储库。我还没有尝试过,但是您应该能够从同一个存储库中推送和拉取。
https://username@github.com/username/repo.git
Push
Password
your_github_token
https://github.com/username/repo.git
Pull
leave_empty
我还通过 API 创建了一个项目来镜像 GitLab 6 中的存储库(API 主要用于项目创建)。
今天最好的选择是使用 GitLab CI。它本质上是一个已经为 webhook 实现的服务器,它会自动为您克隆并让您运行任意 shell 命令:您所要做的就是推送。
如果有人实现它们,服务是最好的选择:它们存在于源代码树中,会进行一次推送,并且不需要额外的部署开销。
现在的关键实现困难是如何安全地存储推送凭据:可能 GitHub 的最佳选择是以某种方式获取密钥(通过服务在 UI 上进行 Oauth 将是完美的)并存储该明文。
刚刚添加的另一个选项是自定义挂钩。
您可以使用挂钩来自定义在某些提交后运行的脚本。有了它,您可以将新更改发送到另一个存储库。在以下页面中查找有关钩子的更多信息:http: //git-scm.com/book/en/Customizing-Git-Git-Hooks
2020 年更新
众所周知,对于外部私有存储库的免费 Gitlab 镜像支持已于 3 月 22 日结束。
使用 cron 自动化,这里的 php 代码很少:-
最好的选择不是使用 post-receive 钩子,而是通过 rsync 执行同步的部署命令,如果你喜欢 Ruby,使用Capistrano ,如果你喜欢 Javascript (Grunt) ,使用Shipit 。
GitBitLabHub允许您使用简单的 webhook 在 Bitbucket / Gitlab / Github 之间自动镜像存储库。
ssh-keygen -t rsa -f ~/.ssh/project_id_rsa
docker run -it \
-e SRC_REPO=git@bitbucket.org:vendor/src_repo.git \
-e DEST_REPO=git@gitlab.example.com:2222/vendor/dest_repo.git \
-e SRC_DEPLOY_KEY=base64_encoded_key== \
-e DEST_DEPLOY_KEY=base64_encoded_key== \
-p 8181:8080/tcp \
karser/gitbitlabhub
base64 -w 0 < ~/.ssh/project_id_rsa
GitLab 企业版现在支持版本 8.2 的存储库镜像。有关如何配置它的信息,请参见Repository Mirroring 帮助主题。