Gitlab存储库镜像

是否有可能让gitlab设置自动同步(镜像)托pipe在另一个位置的存储库?

目前,我知道这样做的最简单的方法是手动推送到两个(gitlab和其他)存储库,但这是非常耗时且容易出错的。

最大的问题是镜像可以重新同步,两个用户同时将更改推送到两个不同的存储库。 我可以想出的最好的方法来防止这个问题是确保用户只能推送到其中一个存储库。

2016年12月更新:镜像支持GitLAb EE 8.2+:请参阅“ 存储库镜像 ”。

正如晓东奇评论:

这个答案可以简化,而不使用任何命令行(只需在Gitlab回购pipe理界面上设置)


原始答案(2013年1月)

如果你的远程镜像仓库是一个仓库 ,那么你可以添加一个post-receive钩子到你的gitlabpipe理的仓库,并推送到你的远程仓库。

#!/bin/bash git push --mirror slave_user@mirror.host:/path/to/repo.git 

由于Gitolite(Gitlab使用) 提到 :

如果只想在几个特定的​​存储库中安装一个钩子,请直接在服务器上执行。

这将在:

 ~git/repositories/yourRepo.git/hook/post-receive 

警告(更新2014年10月)

Ciro Santilli 在评论中指出 :

今天(2014年第四季度),这将失败,因为GitLab自动 github.com/gitlabhq/gitlab-shell/tree/…链接到它pipe理的每个存储库。
所以,如果你做这个改变,你修改的每个存储库都会尝试推送。
更不用说升级gitlab-shell时可能发生的冲突,而且当前的脚本是ruby脚本,而不是bash(而且你不应该删除它!)。

你可以通过阅读当前的目录名称并确保它与远程服务器之间的双向注入来解决这个问题,但是我build议人们远离这些东西

查看(并投票) feeadback“ 推到GitLab回购后自动推远程镜像回购 ” 。


2016年7月更新:我看到为GitLab EE(企业版)添加了这种function: MR 249

  • 添加在Mirror Repository设置下input远程推送URL的function
  • 添加实现代码以推送到远程存储库
  • 添加新的后台工作者
  • 显示最新的更新date和同步错误(如果存在)。
  • 每小时同步远程镜像。

请注意,最近的Remote Mirror Repository ( 问题17940 )可能会非常棘手:

目前,我正尝试将我公司Lossless GmbH( https://www.npmjs.com/~lossless )的开源npm模块的主要开发工作从GitHub.com转移到GitLab.com

我从GitHub导入所有的回购,但是当我试图closuresMirror Repository并开启Remote Mirror Repository与原始的GitHub的URL我得到一个错误说:

 Remote mirrors url is already in use 

这里是其中一个回购失败: https : //gitlab.com/pushrocks/npmts编辑2个月前

事实certificate,它只需要多个步骤:

  • 禁用镜像库
  • 按保存
  • 删除URl
  • 按保存
  • 然后添加远程镜像

如果没有托pipe你自己的GitLab,那么值得知道GitLab.com直接引入了这个特性,没有任何解决方法。

  1. 在一个项目中使用齿轮图标来select镜像库
  2. 向下滚动到推送到远程存储库
  3. 选中标记远程镜像存储库 :每小时自动更新此存储库中远程镜像的分支,标记和提交。
  4. input您要更新的存储库; 对于GitHub,至less你可以在URL中包含你的用户名和密码,如下所示: https://yourgithubusername:yourgithubpassword@github.com/agaric/guts_discuss_resource.git

请注意,如果您正在从远程存储库中提取数据,它仍然会推送到此处设置的远程存储库。 我没有尝试过,但你应该能够推动和从同一个存储库拉。

我还创build了一个项目,通过API(主要用于项目创build的API)在GitLab 6中镜像存储库。

https://github.com/sag47/gitlab-mirrors

今天最好的select是使用GitLab CI。 它本质上是一个已经实现的webhooks服务器,它自动克隆你,让我们运行任意的shell命令:你所要做的就是推送。

如果有人实现它们, 服务是最好的select:它们位于源代码树中,只需一次推送,不需要额外的部署开销。

现在关键的实现困难是如何安全地存储推送凭证:可能GitHub的最佳select是以某种方式获得密钥(通过服务的UI上的Oauth将是完美的)并存储该明文。

另一个刚添加的选项是自定义钩子 。

您可以使用挂钩来自定义一些提交后运行的脚本。 有了这个,你可以发送新的更改到另一个存储库。 请在以下页面中查找有关挂钩的更多信息: http : //git-scm.com/book/en/Customizing-Git-Git-Hooks

最好的select不是使用post-receive hook,而是部署通过rsync执行同步的命令,如果你喜欢Ruby,使用Capistrano ,如果你喜欢Javascript(Grunt),可以使用Shipit 。

从版本8.2开始,GitLab Enterprise Edition现在支持存储库镜像。 有关如何configuration的信息位于“ 存储库镜像”帮助主题中 。