我们处于分布式团队的情况,其中团队成员来自不同的公司,并且无权访问彼此的服务器。我们在一个项目上工作,并且有一个需要同步的 git 存储库。团队的两个部分(出于简单起见,称他们为团队 A 或 B)都在进行更改。
- 团队 A 有权访问服务器 A,但不能访问服务器 B 团队 B 有权访问服务器
- B,但不能访问服务器 A
我们没有可以访问这两个服务器的系统,并且不太可能很快获得它。
我们如何使存储库在不同位置之间保持同步?
到目前为止,我们一直在尝试以下方法,但收效甚微。
A队:
-
git clone --mirror https://server_a.com/repository_origin.git
获取完整副本,包括原始存储库中的所有分支和标签 -
将生成的文件夹包装在 zip 文件中并传输到团队 B
B队:
-
提取压缩
-
cd repository_origin.git
-
git remote set-url --push origin https://server_b.com/repository_mirror.git
方法
-
git push --mirror
导致团队 B 的更改被完全丢弃,但团队 A 的所有更改都已合并到镜像仓库中,即团队 B 的更改不在镜像仓库中。
-
git fetch --all
正确获取团队 B 的所有本地更改git push --mirror
结果是说没有更改,即团队 A 更改不在镜像存储库中。
显然,我们还需要将更改从团队 B 更改为原始存储库,但是如果没有从 A 到 B 的方式按预期工作,尝试让 B 到 A 按预期工作似乎不是很有用。
因此,我们尝试了这些方法,但都没有奏效。有没有人知道如何解决这个问题?当然,我们希望每个人都在同一个原始存储库上工作,但由于法规,这在目前和可预见的未来是不可能的。
Git 旨在支持通过电子邮件进行全功能协作。Pro Git 书中有一章讨论这个问题,但基本上您可以使用git format-patch
生成更改,将它们与git imap-send
一起发送,并使用git am
将它们应用于另一侧。同一本书的另一章包括一个简短的例子。
这可能感觉技术含量低,但它是一个成熟的工作流程,对于 Git 本身的开发效果很好。
如果您的团队无法直接克隆存储库的初始副本,则可以生成一个包含git bundle
的捆绑包,然后从中克隆。
如果您不喜欢电子邮件流,还可以使用git bundle
来更新隔离的系统。一般来说,git bundle
可能比手动压缩克隆更好。