是否可以设置gitlab来自动同步(镜像)在其他位置托管的存储库?
目前,我知道这样做的最简单方法是手动推送到两个(gitlab和另一个)存储库,但这很费时且容易出错。
最大的问题是镜像可以重新同步是两个用户同时将更改推送到两个不同的存储库。我可以提出的防止此问题的最佳方法是确保用户只能推送到其中一个存储库。
答案 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
请注意,最近的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
- 按保存
- 然后添加Remote Mirror
答案 1 :(得分:8)
如果没有托管您自己的GitLab,那么值得了解的是GitLab.com直接引入了此功能,没有任何解决方法。
https://yourgithubusername:yourgithubpassword@github.com/agaric/guts_discuss_resource.git
请注意,如果您从远程存储库中提取,它仍将继续到此处设置的远程存储库。我还没有尝试过,但你应该可以从同一个存储库中推送和拉出。
答案 2 :(得分:4)
我还创建了一个项目,通过API镜像GitLab 6中的存储库(API主要用于创建项目)。
答案 3 :(得分:3)
今天最好的选择是使用GitLab CI。它本质上是一个已经实现的webhook服务器,它会自动为你克隆,让你运行任意shell命令:你所要做的就是推送。
如果有人实现它们,services是最好的选择:它们存在于源代码树中,只需一次推送,并且不需要额外的部署开销。
现在的关键实现难点是如何安全地存储推送凭证:可能GitHub的最佳选择是以某种方式获取密钥(通过该服务在UI上的Oauth将是完美的)并存储该明文。
刚刚添加的另一个选项是custom hooks。
答案 4 :(得分:3)
https://username@github.com/username/repo.git
Push
Password
your_token
https://github.com/username/repo.git
Pull
leave_empty
答案 5 :(得分:1)
您可以使用挂钩来自定义在提交后运行的脚本。有了它,您可以将新更改发送到另一个存储库。在以下页面中查找有关挂钩的更多信息:http://git-scm.com/book/en/Customizing-Git-Git-Hooks
答案 6 :(得分:1)
UPDATE 2020
众所周知,免费的Gitlab镜像支持已于3月22日终止,用于外部私有存储库。
使用cron自动化,这是php中的少量代码:-
答案 7 :(得分:0)
最好的选择不是使用post-receive钩子,而是使用rsync执行同步的部署命令,如果你喜欢Ruby则使用Capistrano,如果你喜欢Javascript(Grunt),则使用Shipit。 / p>
答案 8 :(得分:0)
GitLab Enterprise Edition现在支持版本8.2的存储库镜像。有关如何配置此信息的信息位于Repository Mirroring help topic。