2

抱歉,如果以前有人问过这个问题,如果有,那么它没有明确标记为这样。

我在两个不同的国家有两个开发团队,每个都在同一个项目上工作,但开发人员正在针对当地办公室的 Git 存储库工作。每个办公室在不同的时区运营,相隔约 8 小时,但我们希望每小时更新一次。因此,OfficeA 中的开发人员拉/推到他们自己的仓库,OfficeB 拉/推到他们自己的仓库。项目代码/结构相同。

OfficeA 是真正的主人,是 CI 和 UAT 部署的地方。所以我们设置如下:

  • OfficeB 将其存储库设置为 OfficeA 存储库的克隆镜像:

    git clone --mirror git@gitlab:project.git

  • 每小时为 OfficeB 设置一个任务,以通过 OfficeA 的更改更新他们的 repo(没有人在分支,我们都只是在 master 分支上工作:

    git 获取
    git 推送

现在由于时区的原因,一段时间内没有出现任何问题,但似乎上述解决方案不是我们应该做的,因为我们正在丢失代码,通常 OfficeB 在早上丢失一两个提交,这是通过简单的推送来解决的每个开发人员的机器,因为更改不会从他们的本地机器存储库中丢失。

我进一步观察,似乎这种整体方法是不正确的,而不是我们应该做的,因为镜子就是这样。那么,使用远程维护 HQ 存储库的最佳解决方案是什么,每个存储库都由本地开发人员使用,并且来自双方的更改合并在一起并推出以便两个服务器相互反映?我猜 OfficeB 应该有两个存储库,一个供开发人员使用,一个是 HQ 的镜像克隆。然后,同步脚本会在 OfficeB 中的这两个 repo 文件夹之间进行更新和合并。

请确认这是否是可行的方法,并提供您的想法或脚本或任何可能有帮助的东西。Git 看起来很强大,但是太令人困惑了,文档中充斥着 git 术语,它在我们的组织中给了它一个非常糟糕的名字:-(

我希望这对于在国际公司工作的人来说是一个非常常见的设置,所以很惊讶它并不容易找到清晰简洁的提示,或者我的“谷歌”显然是 sux :-)

提前谢谢各位

提议

OfficeA 保持原样... OfficeB 创建 OfficeA 的裸镜像克隆... 从镜像克隆创建一个额外的克隆,开发人员都使用这个克隆。原始镜像纯粹用于同步过程,充当安全处理冲突的中介,一旦处理 + 解决,它就会推送到其远程主机。

或者两个克隆的存储库都应该是具有工作目录的标准克隆吗?

4

1 回答 1

0

这不是一个简单的问题。

当您有两个存储库同时更新每个存储库时,同步它们时可能会发生冲突。

冲突可能需要人际互动才能以正确的方式解决。解决此问题的一种方法是始终同步,在推到 B 时,A 被锁定,然后 B 推到 A 并且 A 再次解锁,反之亦然。这对您来说可能不是一个好的解决方案。我想你有带宽限制,否则所有开发人员都会直接使用 A。

所以,让我们做点魔法吧。你有一个时区差异。让我们每天移动两次主存储库。

将 B 设为只读,让所有开发人员推送到 A。让 B 拉动。将 A 设为只读,让所有开发人员推送到 B。让 A 进行拉取,依此类推。

你总是会有快进更新(如果你不重写历史,那么你需要一些其他的同步方式,比如 rsync)。因此没有合并问题。

通过一些智能 DNS(或者可能是 git-hooks)逻辑,您可以使这对开发人员完全透明。例如,当 B 为只读时从 B 推送将自动推送到 A,当然速度较低,但它仍然可以工作。

于 2013-06-07T10:06:25.453 回答