草庐IT

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

coder 2023-06-23 原文

关闭。这个问题是opinion-based .它目前不接受答案。












想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题.

3年前关闭。




Improve this question




我可以理解为什么分布式源代码控制系统(DVCS - 像 Mercurial)对开源项目有意义。

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

DVCS 的哪些功能使其更适合或更适合拥有众多开发人员的企业? (通过集中式系统)

最佳答案

我刚刚在一家大型银行公司中引入了 DVCS(本例中为 Git),其中 Perforce、SVN 或 ClearCase 是集中式 VCS 的选择:
我已经知道这些挑战(见我之前的回答“Can we finally move to DVCS in Corporate Software? Is SVN still a 'must have' for development?”)
我在三个方面受到挑战:

  • 中心化 :虽然去中心化模型有其优点(并且允许私有(private)提交或在可以访问完整历史记录的情况下在没有网络的情况下工作),但仍然需要一组清晰的中心化存储库,作为主要引用所有开发人员。
  • 身份验证 :DVCS 允许您“签署”(提交)您的代码......几乎任何人(作者“foo ”,电子邮件“foo@bar.com ”)。
    您可以执行 git config user.name foogit config user.name whateverNameIFeelToHave ,并在其中包含所有带有虚假名称的提交。
    这与大企业使用的独特的集中式“Active Directory”用户引用不太相配。
  • 授权 :默认情况下,您可以克隆、 push 或 pull 入任何存储库,并修改任何分支或任何目录。
    对于敏感项目,这可能是一个阻塞问题(银行界通常非常保护某些定价或量化算法,这些算法需要对极少数人进行严格的读/写访问)

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

  • .
  • authentication :只有两种协议(protocol)允许用户访问主存储库:
  • 基于 ssh,带有公钥/私钥:
  • 对组织外部的用户有用(如离岸开发),
  • 并且对于 Active Directory 管理员不想创建的通用帐户很有用(因为它将是一个“匿名”帐户):一个真实的人必须负责该通用帐户,并且拥有私钥的人

  • 基于 https,Apache 通过 LDAP 设置对用户进行身份验证:这样,必须为这些存储库上的任何 git 操作提供实际登录。
    Git 为其提供了 smart http protocol ,不仅允许 pull(读取)通过 http,还允许 push(写入)通过 http。


  • 身份验证部分也在 Git 级别通过 post-receive 钩子(Hook)得到加强,这确保 至少一个 您推送到存储库的提交具有相同的名称“通过 http 检测到的用户名”commh协议(protocol)。
    换句话说,您需要正确设置您的 git config user.name,否则您想要对中央存储库进行的任何推送都将被拒绝。
    .
  • 授权 :之前的两个设置(ssh 或 https)都连接到调用同一组 perl 脚本,命名为 gitolite ,参数为:
  • 这两个协议(protocol)检测到的实际用户名
  • 用户想要执行的 git 命令(克隆、推或 pull )


  • gitolite perl script will parse a simple text file 已设置授权(所有存储库的读/写访问权限,或给定存储库中的分支,甚至存储库中的目录)。
    如果 git 命令所需的访问级别与该文件中定义的 ACL 不匹配,则该命令将被拒绝。

    以上描述了我需要为 Git 设置实现的内容,但更重要的是,它列出了 DVCS 设置需要解决的主要问题,以便在拥有独特用户群的大公司中发挥作用。
    然后,并且只有这样,DVCS(Git、Mercurial 等)才能添加值,因为:
  • 多个站点之间的数据交换 :虽然这些用户都通过同一个 Active Directory 进行了身份验证,但他们可以位于世界各地(我工作过的公司通常在两个或三个国家/地区的团队之间进行开发)。 DVCS 自然是为在这些分布式团队之间有效交换数据而设计的。
  • 跨环境复制 :负责身份验证/授权的设置允许在其他专用服务器上克隆这些存储库(用于集成测试、UAT 测试、预生产和预部署目的)
  • 流程自动化 :您可以轻松克隆存储库,也可以在一个用户的工作站上本地使用,使用“保护提交”技术和其他巧妙用途进行单元测试:参见“What is the cleverest use of source repository that you have ever seen?”。
    简而言之,您可以推送到负责以下内容的第二个本地存储库:
  • 各种任务(代码的单元测试或静态分析)
  • 如果这些任务成功,则推回主存储库
  • 当您仍在第一个 repo 中工作而不必等待这些任务的结果时。


  • .
  • killer features :任何 DVCS 都带有这些,主要是 merge (曾经尝试过与 SV000000000000000000000000000000000000000000000000000000000000000000000CS 流 merge 文件 merge 工作流)工作流CSCS
    仅此一项( merge )就意味着您可以真正利用 branching ,同时始终能够将您的代码 merge 回另一个“主要”开发线,因为您会这样做:
  • 首先在您自己的存储库中本地进行,而不会打扰任何人
  • 然后在远程服务器上,将 merge 的结果推送到中央仓库。

  • 关于git - 分布式版本控制系统和企业 - 一个好的组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5683253/

    有关git - 分布式版本控制系统和企业 - 一个好的组合?的更多相关文章

    1. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

      使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

    2. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

      我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

    3. ruby-on-rails - 渲染另一个 Controller 的 View - 2

      我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>

    4. Ruby Readline 在向上箭头上使控制台崩溃 - 2

      当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby​​安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少

    5. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

      我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

    6. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

      如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

    7. ruby - 为什么 SecureRandom.uuid 创建一个唯一的字符串? - 2

      关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?

    8. ruby-on-rails - 带 Spring 锁的 Rails 4 控制台 - 2

      我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.

    9. ruby-on-rails - 在 ruby​​ .gemspec 文件中,如何指定依赖项的多个版本? - 2

      我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这

    10. ruby-on-rails - openshift 上的 rails 控制台 - 2

      我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新ruby​​gems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems

    随机推荐