分布式版本控制系统和企业 - 一个很好的组合?

Raj*_*Rao 49 git version-control tfs mercurial dvcs

我可以看到为什么分布式源代码控制系统(像Mercurial这样的DVCS)对开源项目有意义.

但它们对企业有意义吗?(通过集中的源控制系统,如TFS)

DVCS的哪些特性使其更适合或更适合具有许多开发人员的企业?(通过集中式系统)

Von*_*onC 93

我刚刚在一家大型银行公司推出了DVCS(本案例中为Git),其中Perforce,SVN或ClearCase是选择的集中式VCS:
我已经知道了这些挑战(参见我之前的回答" 我们能否最终转向DVCS企业软件?SVN仍然是开发的"必备"吗? ")

我在三个方面受到挑战:

  • 集中化:虽然分散模型有其优点(并允许私有提交或在没有网络的情况下工作,同时可以访问完整的历史记录),但仍需要一套清晰的集中式存储库,作为所有开发人员的主要参考.

  • 身份验证:DVCS允许您"签名"(提交)您的代码...几乎任何人(作者",foo"电子邮件" foo@bar.com").
    你可以做一个git config user.name foo,或者git config user.name whateverNameIFeelToHave,并在其中提交所有伪造名称的提交.
    这与大企业使用的独特的集中式"Active Directory"用户参考不兼容.

  • 授权:默认情况下,您可以克隆,推送或拉到任何存储库,并修改任何分支或任何目录.
    对于敏感项目,这可能是一个阻塞问题(银行业通常非常保护某些定价或定量算法,这些算法需要对非常有限的人进行严格的读/写访问)

答案(对于Git设置)是:

  • 集中化:已为所有用户可以访问的任何存储库设置了唯一的服务器.
    备份一直在处理(每天增量,每周完整).
    已实施DRP(灾难恢复计划),在另一个站点上安装第二台服务器,并通过SRDF进行实时数据复制.
    此设置本身独立于您需要的参考或工具类型(DVCS,或Nexus repo,或主Hudson调度程序,或......):任何对于发布到生产中至关重要的工具都需要安装在服务器上备份和DR.

.

  • 身份验证:只有两个协议允许用户访问主仓库:
    • 基于ssh,使用公钥/私钥:
      • 对组织外部的用户有用(如离岸开发),
      • 并且对于Active Directory管理员不想创建的通用帐户很有用(因为它将是一个"匿名"帐户):一个真实的人必须负责该通用帐户,那将是拥有私钥的人
    • 基于https,Apache通过LDAP设置对用户进行身份验证:这样,必须为这些repos上的任何git操作提供实际登录.
      Git通过其智能http协议提供它,不仅允许pull(读取)通过http,还允许push(写入)通过http.

认证部分也在Git级别通过post-receive钩子加强,这确保您推送到仓库的至少一个提交具有"提交者名称"等于通过shh或h​​ttp协议检测到的用户名.
换句话说,您需要git config user.name正确设置,或者您要对中央仓库进行的任何推送都将被拒绝.

.

  • 授权:以前的设置(ssh或https)连线调用同一组perl脚本,名为gitolite,带有as参数:
    • 这两个协议检测到的实际用户名
    • 用户想要执行的git命令(克隆,推送或拉取)

gitolite perl脚本将解析一个简单的文本文件,其中授权(读为所有存储库中的给定的存储库中,即使是存储库中的目录/写访问,或分支机构,或)已设置.
如果git命令所需的访问级别与该文件中定义的ACL不匹配,则拒绝该命令.


上面描述了我需要为Git设置实现的内容,但更重要的是,它列出了在具有独特用户群的大公司中使DVCS设置需要解决的主要问题.

然后,只有这样,DVCS(Git,Mercurial,...)才能添加值,因为:

  • 多个站点之间的数据交换:虽然这些用户都通过同一个Active Directory进行了身份验证,但它们可以位于世界各地(我所工作的公司通常在两个或三个国家/地区的团队之间进行开发).DVCS自然地用于在这些分布式团队之间有效地交换数据.

  • 跨环境复制:负责身份验证/授权的设置允许在其他专用服务器上克隆这些存储库(用于集成测试,UAT测试,预生产和预部署)

  • 流程自动化:您可以轻松地克隆仓库,也可以在一个用户的工作站上本地使用,使用"保护提交"技术和其他聪明的用途进行单元测试:请参阅" 源仓库最聪明的用途是什么 " 你见过吗? "
    简而言之,您可以推送到第二个本地仓库,负责:

    • 各种任务(单元测试或代码的静态分析)
    • 如果这些任务成功,则推回主要回购
    • 你仍然在第一个回购工作,而不必等待这些任务的结果.

.

  • 杀手级功能:任何DVCS都带有那些,主要的是合并(曾经尝试过与SVN进行复杂的合并工作流程?或者懒散地将6000个文件与ClearCase合并?).
    仅此一点(合并)意味着您可以真正利用分支,同时能够始终将代码合并到另一个"主要"开发线上,因为您会这样做:
    • 首先在你自己的回购当地,不打扰任何人
    • 然后在远程服务器上,在中央仓库上推送该合并的结果.