66

是否可以将gitlab设置为自动同步(镜像)托管在另一个位置的存储库?

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

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

4

10 回答 10

23

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 月更新)

Ciro Santilli在评论中指出:

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

您可以通过读取当前目录名称并确保它与远程之间的双射来纠正此问题,但我建议人们远离这些东西

请参阅(并投票支持)反馈“推送到 GitLab 存储库后自动推送到远程镜像存储库”


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

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

请注意,最近的Remote Mirror Repository问题 17940)可能很棘手:

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

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

Remote mirrors url is already in use

这是失败的存储库之一:https: //gitlab.com/pushrocks/npmts 2 个月前编辑

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

  • 禁用镜像存储库
  • 按保存
  • 删除网址
  • 按保存
  • 然后添加远程镜像
于 2013-01-12T08:33:43.630 回答
11

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

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

请注意,如果您从远程存储库中提取,它仍将推送到此处设置的远程存储库。我还没有尝试过,但是您应该能够从同一个存储库中推送和拉取。

于 2016-07-11T09:00:31.753 回答
8

使用 GitLab 和 GitHub配置镜像存储库的快速总结


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


  • Git 存储库 URLhttps://username@github.com/username/repo.git
  • 镜像方向Push
  • 认证方式Password
    • 密码your_github_token


  • Git 存储库 URLhttps://github.com/username/repo.git
  • 镜像方向Pull
  • 认证方式leave_empty


GitLab 官方文档

于 2018-09-27T19:19:51.907 回答
4

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

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

于 2013-09-16T14:54:20.007 回答
3

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

如果有人实现它们,服务是最好的选择:它们存在于源代码树中,会进行一次推送,并且不需要额外的部署开销。

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

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

于 2014-11-05T08:52:35.847 回答
1

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

于 2013-01-11T23:29:51.827 回答
1

2020 年更新

众所周知,对于外部私有存储库的免费 G​​itlab 镜像支持已于 3 月 22 日结束。

使用 cron 自动化,这里的 php 代码很少:-

https://github.com/DeepLinkCode/GithubToGitlab

于 2020-08-16T23:23:30.463 回答
0

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

于 2015-03-15T09:10:56.503 回答
0

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

  1. 为源和目标存储库生成 ssh 密钥:
ssh-keygen -t rsa -f ~/.ssh/project_id_rsa
  • 它将生成 2 个密钥,即 ~/.ssh/project_id_rsa 的 PRIVATE 密钥和 ~/.ssh/project_id_rsa.pub 的 PUBLIC 密钥。
  • PUBLIC 密钥用作部署密钥,而 PRIVATE 密钥应在 SRC_DEPLOY_KEY 和 DEST_DEPLOY_KEY 环境变量中使用。
  1. 将此 PUBLIC 密钥添加为源和目标存储库的部署密钥。根据平台,它被称为部署密钥或访问密钥。了解如何将 Deploy/Access Key 添加到bitbucketbitbucket 访问密钥gitlabgithub
  • 将 PUBLIC 密钥添加到具有只读访问权限的源存储库。
  • 将 PUBLIC 密钥添加到具有写入权限的目标存储库。
  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 环境变量使用 PRIVATE 密钥。不要忘记使用 base64 对其进行编码: base64 -w 0 < ~/.ssh/project_id_rsa
  • 如果您正确配置了所有内容,它应该在第一次启动后镜像 repo。如果它没有在容器输出中看到日志。
  1. 在源存储库中创建 webhook。使用默认设置就足够了。了解如何在bitbucketgitlabgithub中创建 webhook 。
于 2022-01-15T13:01:49.753 回答
0

GitLab 企业版现在支持版本 8.2 的存储库镜像。有关如何配置它的信息,请参见Repository Mirroring 帮助主题

于 2016-12-29T18:54:53.013 回答