2013-01-11 107 views
41

是否有可能让gitlab设置自动同步(镜像)托管在其他位置的存储库?Gitlab存储库镜像

目前,我所知道的最简单的方法是手动推送到两个(gitlab和另一个)存储库,但这很耗时且容易出错。

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

+0

此请求已在:http://feedback.gitlab.com/forums/176466-general/suggestions/4614663-automatic-push-to-remote-mirror-repo-after-push-to Go并将其取消。 –

回答

15

更新2016年12月:镜像与GitLAb EE 8.2或以上版本支载:见“Repository mirroring”。

正如评论说Xiaodong Qi

这个答案可以在不使用任何命令行来简化(只需将它安放Gitlab回购管理界面)


原来的答复(2013年1月)

如果您的远程镜像回购是bare repo,那么您可以将后接收挂钩添加到您的gitla B管理回购,并推到你的远程回购。

#!/bin/bash 
git push --mirror [email protected]:/path/to/repo.git 

由于Gitolite(由Gitlab使用)mentions

如果要安装只在少数特定的仓库钩

,直接做在服务器上。

这将是:

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

买者(更新Ocotober 2014)

Ciro Santilli指出in the comments

今天(Q4 2014)这将b。失败 b因为GitLab自动将github.com/gitlabhq/gitlab-shell/tree/...链接到它管理的每个存储库中。
因此,如果您进行此更改,则修改的每个存储库都会尝试推送。
更不用说在升级gitlab-shell时可能发生冲突,并且当前脚本是ruby脚本,而不是bash(并且您不应删除它!)。

你可以通过读取当前目录名,并确保与远程之间的一一对应解决这个问题,但我建议人们从那些东西

看到(和投票)feeadback "Automatic push to remote mirror repo after push to GitLab Repo"留很远很远。


更新2016年7月:我看到添加的GitLab EE(企业版)这样的功能:MR 249

  • 下添加镜像版本库的设置,进入远程推送URL能力
  • 添加实现代码推到远程仓库
  • 添加新的后台工作
  • 显示最新更新日期和是否存在这些同步错误。
  • 每小时同步远程镜像。

注意到,最近Remote Mirror Repositoryissues 17940)可能会非常棘手:

我目前竟将我公司无损从GitHub公司(https://www.npmjs.com/~lossless)的开源NPM模块的主要发展。 com可以GitLab.com

我导入所有的回购从GitHub,但是当我尝试关掉Mirror Repository并打开Remote Mirror Repository与原来的GitHub网址我得到一个错误说:

Remote mirrors url is already in use 

下面是这个失败的回购之一:https://gitlab.com/pushrocks/npmts 编辑2个月前

事实证明,它只是需要多个步骤:

  • 禁用镜像版本库
  • 按保存
  • 删除的网址
  • 按保存
  • 然后添加远程镜像
+1

远程回购不可用时,此设置会发生什么,例如由于维护或网络hickups?我猜想要么推到gitlab仓库是不可能的,否则在远程仓库中推送的提交将会丢失? – jfrantzius

+2

@jfrantzius后者:你的提交仍然会被推送到你的GitLab仓库,但是不会将它提交给奴隶。 – VonC

+0

今天,这将失败,因为GitLab自动将https://github.com/gitlabhq/gitlab-shell/tree/7eb45672b77a0337e6568ef64cd84e13027f2d7b/挂钩挂钩到它管理的每个存储库中。因此,如果您进行此更改,则修改的每个存储库都会尝试推送。更不用说升级gitlab-shell时可能发生的冲突,并且当前脚本是ruby脚本,而不是bash(并且不应该删除它!)。您可以通过阅读当前目录名称并确保它与远程设备之间的双向注入来更正此问题,但我建议人们远离这些事情。 –

3

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

services如果有人实现它们,是最好的选择:它们生活在源代码树中,只需一次推送,并且不需要额外的部署开销。

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

刚刚添加的另一个选项是custom hooks

0

最好的选择是不使用post-receive挂钩,但是部署通过rsync执行同步的命令,如果你喜欢Ruby的话使用Capistrano,如果你喜欢Javascript(Grunt),则使用Shipit

6

如果没有托管自己的GitLab,值得了解GitLab.com直接引入了此功能,没有任何解决方法。

  1. 从项目中使用的齿轮图标,选择镜像版本库
  2. 向下滚动到推送到远程仓库
  3. 对号远程镜像库:自动更新远程镜像的分支机构,标签,并且每小时从这个仓库提交。
  4. 输入您要更新的存储库;对GitHub上至少可以包括你的URL的用户名和密码,就像这样:https://yourgithubusername:[email protected]/agaric/guts_discuss_resource.git

请注意,如果你从远程仓库拉,它仍然会推动在此处设置远程仓库。我还没有尝试过,但你应该能够推送到同一个存储库并从中拉出。