中型到大型开发团队如何不断将更改推送到DVCS?

时间:2015-12-03 00:20:54

标签: git svn version-control mercurial dvcs

我工作的公司正试图摆脱集中式VCS StarTeam,并希望能够做得更好。我不想选择SVN,因为它是"简单的选项" (最类似于我们今天所做的)。有人可以帮助我了解每天更改大约150个文件的中型到大型开发团队如何在像Git或Mercurial这样的DVCS上运行吗?

我们有:

  • 50名开发人员在
  • 的单个存储库上工作
  • 15年的历史
  • 15,000个文件(主要是代码/文本)
  • 每天大约150个单一文件签到
  • 由于我们独特的语言要求和数据结构,需要每天从中心进行更改

经过数天的研究和实验,我了解了Git和Hg的流程和工作流程。我不明白的是,需要进行更改的大型团队(通常是单个文件)很快就可以在系统限制下运行吗?

例如:我可能会处理3个不同的事情,开发人员会向我提出一个小问题。我做了一点研究,做了必要的1行更改,并检查了文件。据我所知,使用git我需要提交更改,隐藏所有其他更改,拉,推,应用存储,处理任何合并应用我的藏匿在最近拉出的代码可能存在。还有更好的方法吗?

我已经阅读过有关Facebook从Git转换为Mercurial的文章。他们如何在40,000个文件存储库中每天管理数千个签到?我无法理解DVCS的拉/推模型是如何工作的。对于这些系统的工作流程或功能,我一定会缺少一些东西。也许他们不需要每天拉/重基地?

感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

我希望,它将作为火焰战争来源迅速关闭,但是......

  

我不想选择SVN,因为它是"简单的选项"

打扰一下,你想要有成效地工作还是受苦?由于您的最后一个(非常明确)要求,具有相当好的分支|合并的真实CVCS可能是比伪造的任何DVCS更好的选择(参见What does SVN do better than Git? fe) -CVCS模式

  

经过数天的研究和实验,我了解了Git和Hg的流程和工作流程。

相当粗略和浅薄的理解,BTW。即使在Git你也有

  • "分行" (虽然命中分支本身并不是其他DVCS的分支)
  • 可变历史
  • DAG
  

例如:我可能正在处理3种不同的事情

与VCS无关的共同方式(考虑到Mercurial,git-boys可能希望将其用于Git)

您创建了3个分支("基于任务的开发","每个任务分支"策略),每个分区提交了一些(任意)提交

  

开发人员向我提出了一个小问题

  • 提交您当前的工作目录"按原样#34;
  • 回到您当地历史的分歧点(最后一个共享变更集?)
  • "进行一些研究,进行必要的1行更改,并检入文件"
  • 开发人员将(您的)存储库的一部分与最后一个chanseset放在最上面
  • 您可以返回断点并继续工作

答案 1 :(得分:2)

  

我读过有关Facebook从Git切换到Mercurial的文章。他们如何在40,000个文件存储库中每天管理数千个签到?我无法理解DVCS的拉/推模型是如何工作的。关于这些系统的工作流程或功能,必须有一些我遗漏的东西。也许他们不需要每天拉/重基地?

首先,Facebook并没有以纯粹的DVCS方式使用Mercurial。他们使用remotefilelog extension(他们自己写的)只按需提取变更集(这是因为Mercurial存储历史记录,因此历史记录访​​问主要可以本地化)。他们还为他们的后端服务器use MySQL和memcached提高了可扩展性。

对于rebase / merge瓶颈(当数十个开发人员需要同时在主分支中集成他们的工作时),他们a work in progress feature主要在服务器端完成这项工作;我注意到这个瓶颈部分是(1)使用monorepo和(2)使用基于主干的开发的结果,这是一个并非每个大型组织都会遇到的问题。

  

例如:我可能会处理3个不同的事情,开发人员会向我提出一个小问题。我做了一点研究,做了必要的1行更改,并检查了文件。据我所知,使用git我需要提交更改,隐藏所有其他更改,拉,推,应用存储,处理任何合并应用我的藏匿在最近拉出的代码可能存在。还有更好的方法吗?

您可以使用新的Git工作树功能(或者,对于Mercurial,hg share),可以对同一个存储库进行多次检出并独立处理它们。 Bazaar和Fossil一直都能够做到这一点; Fossil还具有自动同步功能,以类似SVN的方式运行(有警告),Bazaar一直能够以准集中的方式工作,提交直接进入服务器。特别是,“每个存储库只有一个结账”主要是一个历史性的Git工件,并不代表DVCS系统(并且,正如我所说,从最新的Git版本开始)。

那就是说,你通常要提交 - >拉 - >合并或变基 - >推动对主分支的更改;这是一个权衡。分布式模型允许您必须具有简单的本地版本控制,以便正在进行的工作在准备好之前不会直接进入主存储库。它通常还假设您的大部分工作都将在个人分支上进行,因此90%的时间它只是提交(偶尔推送)。

请注意,与集中式VCS相比,您不会有更多或更少的冲突;他们可能只是出现在不同的地方。

所有这一切,如果您对当前的VCS感到满意并且无法确定切换带来的明确好处,那么可能不值得更改您的VCS。切换VCS会产生可衡量的成本(重建您的回购,重新培训您的开发人员,调整工作流程,调整周围的工具,意外的过渡问题),这些成本需要通过同样可衡量的收益来抵消,以使它们变得有价值。

答案 2 :(得分:0)

  

我可能会处理3个不同的事情,开发人员会向我提出一个小问题。我做了一点研究,做了必要的1行更改,并检查了文件。据我所知,使用git我需要提交更改,隐藏所有其他更改,拉,推,应用存储,处理任何合并应用我的藏匿在最近拉出的代码可能存在。还有更好的方法吗?

是的:自Git 2.5起,你可以克隆一次你的回购,但结帐多次次。
如果创建新分支,则可以在单独的工作树文件夹中创建它,使当前环境不受干扰。

请参阅“Multiple working directories with Git?”。