如何设置多级git工作流程

时间:2017-01-25 14:45:53

标签: git

我们正处于从svn过渡到git的过程中,其中一个动机是在我们的一个远程办公室中设置一个本地缓存仓库,以便那里的开发人员无需推送和拉出一直在慢速网络上的主要回购。

因此,基本过程将是localCache将定期从主repo中获取,并且devs将从localCache中获取。 Devs将推送到localCache,一旦完成一个功能,他们将从localCache推送到main。

localCache配置为--mirror

这似乎工作正常,除非我想在同一分支上的main更改时从localCache推送更改。如果我在推送之前从main获取,则main的分支将覆盖刚刚从devs中推送的内容;如果我在获取之前推送到main,则localCache的分支将覆盖main。在这两种情况下,git都给我一个“强制更新”消息,即使我没有指定--force。

这让我觉得我的方式错了。我敢肯定这是git应该擅长的东西,但它对我来说似乎不是一个顺畅的工作流程。在git book的“分布式工作流程”部分,他们描述的所有工作流程都让开发人员总是从“主要”开始,但这正是我想要避免的。

1 个答案:

答案 0 :(得分:0)

听起来你想要的是所谓的“三角工作流程”。注意:这不是你要求的,但我已经在实践中运作良好。它运作良好的原因是推送往往很小而且不常见,而克隆和提取很大且频繁。

以下是假设您使用Git 2.0或更高版本以及ssh身份验证的三角形工作流示例:

$ git clone ssh://localoffice.company.com/repos/project
$ cd project
$ git remote add hq ssh://companyhq.company.com/repos/project
$ git config remote.pushdefault hq

现在,当我在project工作时,来自git fetchlocaloffice.company.com/repos/project的每次git push次提取都会推送到companyhq.company.com/repos/project。详情如下。

三角工作流程,图示:

definitive-source
      /    ^
     /      \
    v        \
 cache ---> work

缓存是您的本地镜像,而权威源是从中更新缓存的主服务器。在保持本地缓存“足够最新”的同时不会给网络带来很大压力(通常使用慢速链接的VPN),这是一个轻微的麻烦。

Git通过配置变量remote.pushDefaultbranch.branch.pushDefault支持自Git版本1.8.3以来“开箱即用”的三角工作流程。这需要由每个正在工作的人完成或代表每个人完成的一些配置:他们必须git clone从缓存中,以便他们的origin URL指向缓存镜像,但配置推送转到不同的远程,因此不同的URL(通过推送的默认远程或每个分支的URL)。

(然后他们必须在没有命名遥控器的情况下推动,或者,如果他们命名遥控器,则命名最终来源。)

(在之前的工作中,很久以前 - 在Git 1.8版本甚至存在之前 - 我已经设法通过git://协议设置本地镜像,但所有推送都通过ssh://进行。我们有一些自定义包装器脚本可以完成所有这些操作,而不是使用那些当时不存在的配置变量。)