Gitlab存储库镜像

时间:2013-01-11 23:24:24

标签: git version-control mirroring gitlab

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

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

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

9 个答案:

答案 0 :(得分:18)

2016年12月更新:使用GitLAb EE 8.2+支持镜像:请参阅“Repository mirroring”。

Xiaodong Qi评论:

  

这个答案可以在不使用任何命令行的情况下简化(只需在Gitlab repo管理界面上设置)


原始答案(2013年1月)

如果您的远程镜像仓库是bare repo,那么您可以在gitlab管理的仓库中添加一个post-receive挂钩,并将其推送到其中的远程仓库。

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

作为Gitolite(由Gitlab使用)mentions

  

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

将在:

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

警告(更新Ocotober 2014)

Ciro Santilli指出in the comments

  

今天(2014年第四季度)这将失败,因为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)可能很棘手:

  

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

     

我正在从GitHub导入所有存储库,但是当我尝试关闭Mirror Repository并使用原始GitHub URL启用Remote Mirror Repository时,我收到错误消息:

Remote mirrors url is already in use

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

  

结果显示,它只需要多个步骤:

     
      
  • 禁用镜像存储库
  •   
  • 按保存
  •   
  • 删除URl
  •   
  • 按保存
  •   
  • 然后添加Remote Mirror
  •   

答案 1 :(得分:8)

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

  1. 在项目中使用齿轮图标选择镜像存储库
  2. 向下滚动到推送到远程存储库
  3. 选中标记远程镜像存储库:每小时自动更新远程镜像的分支,标记和提交。
  4. 输入要更新的存储库;对于GitHub,至少可以在URL中包含您的用户名和密码,如下所示:https://yourgithubusername:yourgithubpassword@github.com/agaric/guts_discuss_resource.git
  5. 请注意,如果您从远程存储库中提取,它仍将继续到此处设置的远程存储库。我还没有尝试过,但你应该可以从同一个存储库中推送和拉出。

答案 2 :(得分:4)

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

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

答案 3 :(得分:3)

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

如果有人实现它们,

services是最好的选择:它们存在于源代码树中,只需一次推送,并且不需要额外的部署开销。

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

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

答案 4 :(得分:3)

使用GitLab和GitHub配置镜像存储库的快速摘要


  1. GitHub :设置>开发者设置>个人访问令牌
    • 您需要启用:public_repo
  2. GitLab :GitLab项目>设置>存储库>镜像存储库


推动

  • Git存储库URL https://username@github.com/username/repo.git
  • 镜像方向Push
  • 身份验证方法Password
    • 密码your_token


拉动

  • Git存储库URL https://github.com/username/repo.git
  • 镜像方向Pull
  • 身份验证方法leave_empty


Official GitLab documentation

答案 5 :(得分:1)

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

答案 6 :(得分:1)

UPDATE 2020

众所周知,免费的Gitlab镜像支持已于3月22日终止,用于外部私有存储库。

使用cron自动化,这是php中的少量代码:-

https://github.com/DeepLinkCode/GithubToGitlab

答案 7 :(得分:0)

最好的选择不是使用post-receive钩子,而是使用rsync执行同步的部署命令,如果你喜欢Ruby则使用Capistrano,如果你喜欢Javascript(Grunt),则使用Shipit。 / p>

答案 8 :(得分:0)

GitLab Enterprise Edition现在支持版本8.2的存储库镜像。有关如何配置此信息的信息位于Repository Mirroring help topic