如果之前已经询问过,如果它已经没有明确标记,则道歉。
我在两个不同的国家/地区有两个开发团队,每个团队都在同一个项目上工作,但开发人员正在与当地办事处的Git repos进行合作。每个办公室都在不同的时区运营,相隔约8小时,但我们希望每小时更新一次。所以OfficeA中的开发人员拉/推他们自己的repo和OfficeB拉/推给他们自己。项目代码/结构完全相同。
OfficeA是真正的主服务器,可以进行CI和UAT的部署。所以我们按如下方式进行设置:
OfficeB将其repo设置为OfficeA的repo的克隆镜像:
git clone --mirror git @ gitlab:project.git
为OfficeB设置每小时任务,通过OfficeA的更改来更新他们的仓库(没有人分支,我们都只是在主分支上工作:
git fetch
git push
现在因为时区没有出现问题,但似乎上面提到的这个解决方案不是我们应该做的,因为我们正在丢失代码,通常OfficeB早上有一个提交或两个丢失,这是通过一个从每个开发者的机器上简单推送,因为它们的本地机器回购不会丢失更改。
我看得更远了,看来这种方法不正确,而不是我们应该做的事情,因为镜子就是这样。那么用远程维护HQ仓库的最佳解决方案是什么?本地开发人员使用每个仓库,并且两端的变更合并在一起并推出,因此两台服务器相互反映?我猜测OfficeB应该有两个repos,一个供开发人员使用,另一个是镜像的HQ克隆。然后,同步脚本将在OfficeB中的这两个repo文件夹之间进行更新和合并。
请确认这是否可以提供您的想法或脚本或任何可能有用的内容。 Git看起来很强大但是很混乱,文档中装满了git lingo,它在整个组织中给它起了一个非常糟糕的名字: - (
我希望这对于在国际公司工作的人来说是一个非常常见的设置,所以很惊讶它不容易找到清晰简洁的提示或者我的'google'ing'明显sux: - )
先谢谢你们
提案
OfficeA保持原样... OfficeB创建了一个OfficeA的裸镜像克隆...另一个克隆是从镜像克隆生成的,这是DEV所有的工作。原始镜像纯粹用于同步过程,作为安全处理冲突的中间人,一旦参与+解决它就推送到远程主控..
或者两个克隆的repos都应该是带有工作目录的标准克隆吗?
答案 0 :(得分:0)
这不是一个简单的问题。
如果您有两个同时更新其中每个存储库的存储库,则在同步时会出现冲突。
冲突可能需要以正确的方式解决人与人之间的互动。解决这个问题的一种方法是始终同步,同时按下B,A被锁定,然后B推到A,A再次解锁,反之亦然。这可能不是一个很好的解决方案。我想你有带宽限制,否则所有开发人员都会直接使用A。
所以,让我们做一些魔术。你有时区差异。让我们每天两次移动主存储库。
让B读取,让所有开发者都推到A.让B做拉。将A设为只读并让所有开发人员推送到B.让A做拉,依此类推。
您将始终拥有快进更新(如果您不重写历史记录,那么您需要一些其他方式进行同步,例如rsync)。因此没有合并问题。
使用一些智能DNS(或者可能是git-hooks)逻辑,你可以让它对开发者完全透明。例如,当只读B时从B按下将自动推送到A,当然速度较慢,但它仍然可以工作。