我们在多个地理位置独立的网站上工作。
今天我将我们的git克隆全部存放在一个站点A上。然后来自站点B的用户必须ssh over来执行git克隆或推送更改。这些是通过推送更新的裸仓。
理想情况下,对于git clone / push性能,我想限制不得不超过ssh。
我想在网站A和网站B上有一个git repo X的副本......并且它们之间有一些同步机制。或者在两个站点上都有X,但只允许推送到A(并且在B上的克隆时正确设置)
我很担心网站A上有人推送网站A上的回购更改,同时网站B上的某人将某个真正冲突的更改推送到网站B的回购。
在这样的分布式开放式回购中,是否有一些内置于git中的'同步'解决方案?
或者从X获得克隆的方法将原点/父级设置为来自其他站点的X?
感谢,
-John
答案 0 :(得分:0)
我知道这不是你提出的主要问题的答案,但如果你不必处理整合两个可能相互冲突的中央存储库的问题,这将会更容易 - 当然,你可以提出来使用设置自动同步它们,但在某些时候,冲突必须由人为解决。
如果来自站点B的用户可以ssh到站点A,他们应该能够直接从站点A上的repo推/拉 - 通过ssh推/拉是在git中使用遥控器的主要方法之一。查看man page - 您将在列表中搜索URL。
所以在B站点,你只需添加一个遥控器:
git remote add siteA ssh://user@site.A/path/to/repo.git
如果你真的有不好的带宽限制并且需要非常频繁地推/拉,我想这确实可能是性能问题?我自己从来没有遇到任何麻烦。
理论上你可以给两个中央回购后更新钩子立即推送到另一个中央仓库。这可以很好地工作,直到两个方向同时发生推动(可能这不太可能?) - 然后你需要一个真正的合并,需要一个非裸的存储库,可能还有一个人工集成商来处理冲突。但只要没有同步推送,回购将永远在同一个地方,你不必担心冲突。如果B得到更新,A也会更新,并且用户试图将冲突的东西推送到A中将被迫自行解决。
答案 1 :(得分:0)
有几种方法可以做到这一点。听起来你最想让人们离开远程站点B更近的地方。
由于git repos不会对现有文件(主要是refs / heads文件)进行很多更改,因此使用像rsync这样的东西非常适合制作repos的备份/重复副本。通过这种方式,您可以拥有一个站点B repo,人们可以从站点B获取/提取。
这并不能完全解决您担心的两个站点 - 推送到同一分支的问题(此问题是非破坏性的;在最坏的情况下,有人必须创建合并提交然后将它推送到两个repos以协调补丁集。)
要解决此问题,您可以将站点A作为主要仓库,将站点B作为只读从站。您可以在git-fetch联机帮助页中描述的.git / config中指定一个选项:pushInsteadOf
。假设您的网址是“ssh:// siteB”和“ssh:// siteA”。支持这种情况的配置是这样的:
[url "ssh://siteB"] pushInsteadOf = ssh://siteA