Gitlab仓库镜像

66

是否可以将GitLab设置为自动同步(镜像)托管在其他位置的仓库?

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

最大的问题在于如果两个用户同时将更改推送到两个不同的存储库,那么镜像就会重新同步。我能想到的防止此问题的最佳方法是确保用户只能向其中一个存储库推送。


这个功能的请求已经在 http://feedback.gitlab.com/forums/176466-general/suggestions/4614663-automatic-push-to-remote-mirror-repo-after-push-to 上提出,请前往投票支持。 - Ciro Santilli OurBigBook.com
10个回答

23

2016年12月更新:使用GitLab EE 8.2+支持镜像功能,请参见“仓库镜像”。

Xiaodong Qi评论道:

无需使用任何命令行即可简化此答案(只需在Gitlab仓库管理界面上设置即可)


原始答案(2013年1月)

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

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

作为Gitlab使用的Gitolite 提到

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

这将位于:

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

注意事项(2014年10月更新)

Ciro Santilli评论中指出:

在当前情况下(Q4 2014) 这将失败,因为GitLab会自动将github.com/gitlabhq/gitlab-shell/tree/…软链接到它管理的每个仓库中。
因此,如果您进行此更改,您修改的每个仓库都会尝试推送。
更不用说升级gitlab-shell时可能产生的冲突,以及当前脚本是Ruby脚本而不是Bash(您不应该删除它!)。

您可以通过读取当前目录名称并确保其与远程目录一一对应来纠正此问题,但我建议人们远离这些事情。

看看(并投票)feeadback "推送到GitLab Repo后自动推送到远程镜像仓库"


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

  • 添加在镜像仓库设置下输入远程推送URL的能力
  • 添加实现代码以推送到远程仓库
  • 添加新的后台工作者
  • 如果存在,则显示最新更新日期和同步错误。
  • 每小时同步远程镜像。

请注意,最近的Remote Mirror Repository(issues 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
  • 点击保存
  • 然后添加远程镜像

1
在这种设置下,如果远程仓库不可用,例如由于维护或网络故障,会发生什么情况?我猜可能无法将提交推送到GitLab仓库,或者推送的提交将在远程仓库中丢失。 - jfrantzius
2
@jfrantzius 后者:您的提交仍将推送到您的GitLab存储库,但不会传输到从属服务器。 - VonC
@XiaodongQi 自版本8.15(.2?)起,CE版本已经可以使用了。我按照这些说明在我的主服务器和备份服务器之间进行同步。 - Carel
1
@Carel,是的,现在它可以工作了。我还在那里做了几个镜像仓库 :) 因此,这个答案可以简化,而不需要使用任何命令行(只需在Gitlab仓库管理界面上设置即可)。 - Xiaodong Qi
@XiaodongQi 谢谢您。我已将您的评论包含在答案中以增加可见性。 - VonC
显示剩余4条评论

11

如果您没有托管自己的GitLab,那么值得知道的是,GitLab.com已经直接引入了此功能,无需任何变通方法。

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

请注意,如果您正在从远程存储库拉取,它仍将推送到此处设置的远程存储库。我尚未尝试过,但您应该能够将数据推送到并从同一个存储库拉取。


1
我只是有点多虑,但是你的密码作为URL请求的一部分发送,这样安全吗?我知道 https 会确保使用 SSL,但是它是否加密了实际的 URL 字符串被请求(在这种情况下将包括密码)? - user2490003
1
看起来你可以使用 GitHub 个人访问令牌代替密码。GitLab 最近似乎已经引入了相关文档,可以在这里查看:https://gitlab.com/help/workflow/repository_mirroring.md#setting-up-a-push-mirror-from-gitlab-to-github - user2490003
1
@user2490003 关于你的问题 - “我只是有点多虑,但是将密码作为URL请求的一部分发送有多安全?我知道https会确保使用SSL,但是它是否加密实际请求的URL字符串(在这种情况下将包括密码?)”,答案是凭据将被加密(请参见 https://dev59.com/LXE85IYBdhLWcg3wkkU8 获取更多详细信息)。 - narayan

8
使用GitLab和GitHub配置镜像仓库的简要概述


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


推送

  • Git 仓库 URL: https://username@github.com/username/repo.git
  • 镜像方向: 推送
  • 认证方式: 密码
    • 密码: your_github_token


拉取

  • Git 仓库 URL: https://github.com/username/repo.git
  • 镜像方向: 拉取(Pull)
  • 认证方式: 不需要认证(leave_empty)


GitLab官方文档


在SSH连接下从GitLab镜像到GitHub的方法可以在这里找到。 - alierdogan7
那么推送镜像对私有存储库不起作用? - Arsinclair

4

3
今天最好的选择是使用GitLab CI。它本质上是一个已经实现了Webhooks服务器,会自动为您克隆并让您运行任意shell命令:然后您所需要做的就是推送代码。
如果有人实现,那么服务是最好的选择:它们存在于源代码树中,只需进行一次推送,并且不需要额外的部署开销。
现在的关键实现困难是如何安全地存储推送凭据:GitHub可能的最佳选择是以某种方式获取密钥(通过服务UI上的Oauth将是完美的),并将其明文存储。
另一个刚刚添加的选项是自定义钩子

2

1

0

GitBitLabHub 允许您使用简单的 Webhooks 在 Bitbucket / Gitlab / Github 之间自动镜像存储库。

  1. 为源和目标存储库生成 SSH 密钥:
ssh-keygen -t rsa -f ~/.ssh/project_id_rsa
  • 它将生成2个密钥,私钥保存在~/.ssh/project_id_rsa,公钥保存在~/.ssh/project_id_rsa.pub。
  • 公钥用作部署密钥,而私钥应在SRC_DEPLOY_KEY和DEST_DEPLOY_KEY环境变量中使用。
  1. 将此公钥添加为源和目标存储库的部署密钥。 根据平台的不同,它被称为部署密钥或访问密钥。 请参阅如何将部署/访问密钥添加到bitbucketbitbucket access keysgitlabgithub
  • 将公钥添加到具有只读访问权限的源代码库中。
  • 将公钥添加到具有写入访问权限的目标代码库中。
  1. 使用正确配置的所有环境变量在Docker中运行此容器。
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
  • 使用私钥作为SRC_DEPLOY_KEY和DEST_DEPLOY_KEY环境变量。别忘了用base64编码:base64 -w 0 < ~/.ssh/project_id_rsa
  • 如果你正确配置了一切,它应该在第一次启动后镜像仓库。如果没有,请查看容器输出中的日志。
  1. 在源代码仓库中创建Webhook。使用默认设置即可。 请参阅如何在BitbucketGitLabGitHub中创建Webhook。

0

从8.2版本开始,GitLab企业版现在支持仓库镜像。有关如何配置的信息,请参阅仓库镜像帮助主题


0

最好的选择不是使用post-receive钩子,而是使用部署命令通过rsync进行同步,如果您喜欢Ruby,则可以使用Capistrano,如果您更喜欢Javascript(Grunt),则可以使用Shipit


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接