哪些优点和缺点使用集中式与分布式版本控制系统(DVCS)?您是否遇到过DVCS的任何问题?您是如何防范这些问题的?保持讨论工具不可知和火焰最小化.
对于那些想知道什么是DVCS工具的人,这里列出了最着名的免费/开源DVCS:
用于Linux内核和Ruby on Rails的Git(用C语言编写).
Merzial,(用Python编写),由Mozilla和OpenJDK使用.
Ubuntu开发人员使用的Bazaar(用Python编写).
Darcs,(用Haskell编写).
Craig Trader.. 56
从我对另一个问题的回答:
分布式版本控制系统(DVCS)解决了与集中式VCS不同的问题.比较它们就像比较锤子和螺丝刀.
集中式VCS系统的设计意图是有一个真正的来源是有福的,因此是好的.所有开发人员从该源开始工作(checkout),然后添加(提交)他们的更改,然后变为类似的Blessed.CVS,Subversion,ClearCase,Perforce,VisualSourceSafe和所有其他CVCS之间唯一真正的区别在于每个产品提供的工作流程,性能和集成.
分布式VCS系统的设计旨在使一个存储库与其他存储库一样好,并且从一个存储库到另一个存储库的合并只是另一种形式的通信.关于应该信任哪个存储库的任何语义值都是由进程从外部强加的,而不是由软件本身强加的.
使用一种类型或另一种类型之间的真正选择是组织 - 如果您的项目或组织想要集中控制,那么DVCS是非启动者.如果您的开发人员希望在全国/世界各地工作,没有安全的宽带连接到中央存储库,那么DVCS可能是您的救星.如果你需要两者,你就是fsck'd.
您可以在本地使用DVCS来管理您的个人分支和内容,然后将它们转换(导出)到标准的集中式回购.许多人发现这是一种非常舒适的工作模式,在这种模式中你被迫集中使用. (13认同)
分销版本控制系统是集中式系统的干净超集.如果您希望使用集中式版本控制系统进行集中控制,则可以使用分布式版本控制系统.事实上,我认为它更容易锻炼,因为大多数分布式版本控制系统允许您使用变更集作为一个可以随意添加或删除的谨慎实体. (4认同)
我与Omnifarious,你的答案可能会误导.特别是"如果您的项目或组织想要集中控制,那么DVCS是非首发"的说法只有在您的澄清评论旁边阅读时才有意义. (4认同)
不同意.例如,使用git和一个裸/ OneTrue repo只是一项艰苦的工作,完全违背了git理念.其他程序做得更好.如果您的组织想要保留单个集中式主存储库,git会*不提供可用的超集,例如,svn.并且,如果你想要一个中央回购,并且你给你的开发者git,你可以绝对肯定他们会为你搞砸了.到过那里. (3认同)
@EML我曾经在一个使用git的环境中工作,他们喜欢假装它是集中的,并且它通过合并创建了huuuge头痛.我也看到git做对了.我现在处于一个使用中央版本控制的环境中,我认为切换到git对于很多人来说可能是一个巨大的学习曲线. (2认同)
manicmethod.. 46
对于那些认为分布式系统不允许权威拷贝的人请注意,分布式系统有很多地方都有权威拷贝,完美的例子可能就是Linus的内核树.当然很多人都拥有自己的树木,但几乎所有树木都流向了莱纳斯的树上.
这就是说我认为分布式SCM只对很多开发人员做了不同的事情有用,但最近已经决定集中式存储库可以做任何分布式的SCM都可以做得更好.
例如,假设您是一名从事个人项目的独立开发人员.集中式存储库可能是一个明显的选择,但请考虑这种情况.您远离网络访问(在飞机上,在公园等)并且想要处理您的项目.你有你的本地副本,所以你可以做得很好,但你真的想提交,因为你已经完成了一个功能,并希望转移到另一个,或者你发现了一个错误修复或其他什么.关键是,使用集中式仓库,您最终会将所有更改混合在一起并将它们提交到非逻辑变更集中,或者您稍后手动将它们拆分出来.
使用分布式仓库,您可以照常营业,提交,继续前进,当您再次拥有净访问权限时,您可以推送到"一个真正的仓库"并且没有任何变化.
更不用说分布式回购的另一个好处:总是有完整的历史记录.远离网络时需要查看修订日志?您需要注释源代码以查看错误是如何引入的?所有可能的分布式回购.
请不要相信分布式与集中式是关于所有权或权威副本或类似的东西.现实是分布式的,是SCM发展的下一步.
sastanin.. 25
不是真正的比较,但这是大项目使用的:
颠覆
Apache,GCC,Ruby,MPlayer,Zope,Plone,Xiph,FreeBSD,WebKit,......
CVS
CVS
混帐
Linux内核,KDE,Perl,Ruby on Rails,Android,Wine,Fedora,X.org,Mediawiki,Django,VLC,Mono,Gnome,Samba,CUPS,GnuPG,Emacs ELPA ......
mercurial(hg)
Mozilla和Mozdev,OpenJDK(Java),OpenSolaris,ALSA,NTFS-3G,Dovecot,MoinMoin,mutt,PETSc,Octave,FEniCS,Aptitude,Python,XEmacs,Xen,Vim,Xine ......
BZR
Emacs,Apt,Mailman,MySQL,Squid,...也在Ubuntu内推广.
的darcs
ghc,ion,xmonad,...在Haskell社区中很受欢迎.
化石
SQLite的
任务是"保持讨论工具不可知",所以这个答案并没有真正帮助. (5认同)
这个答案需要得到赞成. (2认同)
Spoike.. 20
W. Craig Trader谈到了DVCS和CVCS:
如果你需要两者,你就是fsck'd.
在使用两者时,我不会说你是fsck'd.实际上,使用DVCS工具的开发人员通常会尝试将其更改(或发送拉取请求)合并到中央位置(通常是发布存储库中的发布分支).使用DVCS但最终坚持使用集中式工作流程的开发人员有一些讽刺意味,你可以开始怀疑分布式方法是否真的比集中式方法更好.
与CVCS相比,DVCS有一些优势:
唯一可识别的提交的概念使得在对等点之间发送补丁是无痛的.即,您将补丁作为提交,并与需要它的其他开发人员共享.稍后当每个人都想要合并在一起时,该特定提交被识别并且可以在分支之间进行比较,具有较少的合并冲突机会.无论您使用何种版本工具,开发人员都倾向于通过USB记忆棒或电子邮件相互发送补丁.不幸的是,在CVCS的情况下,版本控制会将提交注册为单独的,未能识别出更改是相同的,从而导致更高的合并冲突机会.
您可以将本地实验分支(克隆的存储库也可以视为分支),您不需要向其他人显示.这意味着,如果您没有向上游推送任何内容,那么破坏更改不需要影响开发人员.在CVCS中,当您仍然有一个重大变化时,您可能必须脱机工作,直到您修复它并提交更改为止.这种方法有效地破坏了使用版本控制作为安全网的目的,但它在CVCS中是必要的恶魔.
在当今世界,公司通常与离岸开发商合作(或者如果他们想在家工作更好).拥有DVCS有助于推出这类项目,因为它消除了对可靠网络连接的需求,因为每个人都有自己的回购.
...以及通常有解决方法的一些缺点:
谁有最新版本?在CVCS中,主干通常具有最新版本,但在DVCS中它可能不是很明显.解决方法是使用行为规则,项目中的开发人员必须达成协议,将repo合并到其中.
悲观锁定,即文件在签出时被锁定,通常是不可能的,因为DVCS中的存储库之间可能发生并发.版本控制中存在文件锁定的原因是因为开发人员希望避免合并冲突.但是,锁定具有减慢开发速度的缺点,因为两个开发人员不能像长事务模型那样同时处理同一段代码,并且它不能完全抵御合并冲突.无论版本控制如何,唯一合理的方法是解决大的合并冲突,就是要有良好的代码架构(比如低耦合高内聚)并分割你的工作任务,这样它们对代码的影响很小(这说起来容易做起来难) .
在专有项目中,如果整个存储库变得公开可用,那将是灾难性的.如果心怀不满或恶意的程序员获得克隆的存储库,情况更是如此.源代码泄漏对于专有企业来说是一个严重的痛苦.DVCS使得这很简单,因为您只需要克隆存储库,而某些CM系统(例如ClearCase)会尝试限制该访问.但是在我看来,如果你的公司文化中有足够的功能失调,那么世界上没有任何版本控制可以帮助你防止源代码泄漏.
Nobby.. 10
在我搜索合适的SCM期间,我发现以下链接非常有用:
更好的SCM计划:比较.大约26个版本控制系统的比较.
修订控制软件的比较.维基百科文章比较了38个版本控制系统,涵盖了技术差异,功能,用户界面等主题.
分布式版本控制系统.另一个比较,但主要集中在分布式系统上.
小智.. 8
在某种程度上,这两种方案是等效的:
如果您在每次本地提交后始终将更改推送到某个指定的上游存储库,则分布式VCS可以轻松模拟集中式VCS.
集中式VCS通常不能自然地模拟分布式VCS,但如果你在它上面使用像被子这样的东西,你可以得到非常相似的东西.如果你不熟悉被子,它是一个在一些上游项目之上管理大量补丁的工具.这里的想法是通过创建新补丁来实现DVCS commit命令,并且通过将每个未完成的补丁提交到集中式VCS然后丢弃补丁文件来实现push命令.这听起来有点尴尬,但在实践中它实际上工作得相当好.
话虽如此,DVCS传统上做得很好,并且大多数集中式VCS都有一些哈希值.其中最重要的可能是分支:DVCS将使分支存储库或合并不再需要的分支变得非常容易,并且会在您执行此操作时跟踪历史记录.没有特别的理由为什么集中式计划会遇到这个问题,但从历史上看,似乎没有人能够做到这一点.这对你来说实际上是一个问题取决于你将如何组织开发,但对于很多人来说这是一个重要的考虑因素.
DVCSes的另一个优势是他们脱机工作.我从来没有真正用过那么多; 我主要是在办公室(所以在本地网络上的存储库)或在家里(所以有ADSL)进行开发.如果您在旅行时对笔记本电脑进行了大量的开发,那么这可能更适合您.
实际上并没有很多特定于DVCS的陷阱.人们有一种稍微倾向于保持安静的倾向,因为你可以在不推动的情况下进行投入,并且很容易在私下抛光,但除此之外我们没有遇到很多问题.这可能是因为我们有大量的开源开发人员,他们通常熟悉开发的补丁交易模型,但是传入的封闭源开发人员似乎也能够合理地快速提升.
从我对另一个问题的回答:
分布式版本控制系统(DVCS)解决了与集中式VCS不同的问题.比较它们就像比较锤子和螺丝刀.
集中式VCS系统的设计意图是有一个真正的来源是有福的,因此是好的.所有开发人员从该源开始工作(checkout),然后添加(提交)他们的更改,然后变为类似的Blessed.CVS,Subversion,ClearCase,Perforce,VisualSourceSafe和所有其他CVCS之间唯一真正的区别在于每个产品提供的工作流程,性能和集成.
分布式VCS系统的设计旨在使一个存储库与其他存储库一样好,并且从一个存储库到另一个存储库的合并只是另一种形式的通信.关于应该信任哪个存储库的任何语义值都是由进程从外部强加的,而不是由软件本身强加的.
使用一种类型或另一种类型之间的真正选择是组织 - 如果您的项目或组织想要集中控制,那么DVCS是非启动者.如果您的开发人员希望在全国/世界各地工作,没有安全的宽带连接到中央存储库,那么DVCS可能是您的救星.如果你需要两者,你就是fsck'd.
对于那些认为分布式系统不允许权威拷贝的人请注意,分布式系统有很多地方都有权威拷贝,完美的例子可能就是Linus的内核树.当然很多人都拥有自己的树木,但几乎所有树木都流向了莱纳斯的树上.
这就是说我认为分布式SCM只对很多开发人员做了不同的事情有用,但最近已经决定集中式存储库可以做任何分布式的SCM都可以做得更好.
例如,假设您是一名从事个人项目的独立开发人员.集中式存储库可能是一个明显的选择,但请考虑这种情况.您远离网络访问(在飞机上,在公园等)并且想要处理您的项目.你有你的本地副本,所以你可以做得很好,但你真的想提交,因为你已经完成了一个功能,并希望转移到另一个,或者你发现了一个错误修复或其他什么.关键是,使用集中式仓库,您最终会将所有更改混合在一起并将它们提交到非逻辑变更集中,或者您稍后手动将它们拆分出来.
使用分布式仓库,您可以照常营业,提交,继续前进,当您再次拥有净访问权限时,您可以推送到"一个真正的仓库"并且没有任何变化.
更不用说分布式回购的另一个好处:总是有完整的历史记录.远离网络时需要查看修订日志?您需要注释源代码以查看错误是如何引入的?所有可能的分布式回购.
请不要相信分布式与集中式是关于所有权或权威副本或类似的东西.现实是分布式的,是SCM发展的下一步.
不是真正的比较,但这是大项目使用的:
颠覆
Apache,GCC,Ruby,MPlayer,Zope,Plone,Xiph,FreeBSD,WebKit,......
CVS
CVS
混帐
Linux内核,KDE,Perl,Ruby on Rails,Android,Wine,Fedora,X.org,Mediawiki,Django,VLC,Mono,Gnome,Samba,CUPS,GnuPG,Emacs ELPA ......
mercurial(hg)
Mozilla和Mozdev,OpenJDK(Java),OpenSolaris,ALSA,NTFS-3G,Dovecot,MoinMoin,mutt,PETSc,Octave,FEniCS,Aptitude,Python,XEmacs,Xen,Vim,Xine ......
BZR
Emacs,Apt,Mailman,MySQL,Squid,...也在Ubuntu内推广.
的darcs
ghc,ion,xmonad,...在Haskell社区中很受欢迎.
化石
SQLite的
W. Craig Trader谈到了DVCS和CVCS:
如果你需要两者,你就是fsck'd.
在使用两者时,我不会说你是fsck'd.实际上,使用DVCS工具的开发人员通常会尝试将其更改(或发送拉取请求)合并到中央位置(通常是发布存储库中的发布分支).使用DVCS但最终坚持使用集中式工作流程的开发人员有一些讽刺意味,你可以开始怀疑分布式方法是否真的比集中式方法更好.
与CVCS相比,DVCS有一些优势:
唯一可识别的提交的概念使得在对等点之间发送补丁是无痛的.即,您将补丁作为提交,并与需要它的其他开发人员共享.稍后当每个人都想要合并在一起时,该特定提交被识别并且可以在分支之间进行比较,具有较少的合并冲突机会.无论您使用何种版本工具,开发人员都倾向于通过USB记忆棒或电子邮件相互发送补丁.不幸的是,在CVCS的情况下,版本控制会将提交注册为单独的,未能识别出更改是相同的,从而导致更高的合并冲突机会.
您可以将本地实验分支(克隆的存储库也可以视为分支),您不需要向其他人显示.这意味着,如果您没有向上游推送任何内容,那么破坏更改不需要影响开发人员.在CVCS中,当您仍然有一个重大变化时,您可能必须脱机工作,直到您修复它并提交更改为止.这种方法有效地破坏了使用版本控制作为安全网的目的,但它在CVCS中是必要的恶魔.
在当今世界,公司通常与离岸开发商合作(或者如果他们想在家工作更好).拥有DVCS有助于推出这类项目,因为它消除了对可靠网络连接的需求,因为每个人都有自己的回购.
...以及通常有解决方法的一些缺点:
谁有最新版本?在CVCS中,主干通常具有最新版本,但在DVCS中它可能不是很明显.解决方法是使用行为规则,项目中的开发人员必须达成协议,将repo合并到其中.
悲观锁定,即文件在签出时被锁定,通常是不可能的,因为DVCS中的存储库之间可能发生并发.版本控制中存在文件锁定的原因是因为开发人员希望避免合并冲突.但是,锁定具有减慢开发速度的缺点,因为两个开发人员不能像长事务模型那样同时处理同一段代码,并且它不能完全抵御合并冲突.无论版本控制如何,唯一合理的方法是解决大的合并冲突,就是要有良好的代码架构(比如低耦合高内聚)并分割你的工作任务,这样它们对代码的影响很小(这说起来容易做起来难) .
在专有项目中,如果整个存储库变得公开可用,那将是灾难性的.如果心怀不满或恶意的程序员获得克隆的存储库,情况更是如此.源代码泄漏对于专有企业来说是一个严重的痛苦.DVCS使得这很简单,因为您只需要克隆存储库,而某些CM系统(例如ClearCase)会尝试限制该访问.但是在我看来,如果你的公司文化中有足够的功能失调,那么世界上没有任何版本控制可以帮助你防止源代码泄漏.
在我搜索合适的SCM期间,我发现以下链接非常有用:
更好的SCM计划:比较.大约26个版本控制系统的比较.
修订控制软件的比较.维基百科文章比较了38个版本控制系统,涵盖了技术差异,功能,用户界面等主题.
分布式版本控制系统.另一个比较,但主要集中在分布式系统上.
在某种程度上,这两种方案是等效的:
如果您在每次本地提交后始终将更改推送到某个指定的上游存储库,则分布式VCS可以轻松模拟集中式VCS.
集中式VCS通常不能自然地模拟分布式VCS,但如果你在它上面使用像被子这样的东西,你可以得到非常相似的东西.如果你不熟悉被子,它是一个在一些上游项目之上管理大量补丁的工具.这里的想法是通过创建新补丁来实现DVCS commit命令,并且通过将每个未完成的补丁提交到集中式VCS然后丢弃补丁文件来实现push命令.这听起来有点尴尬,但在实践中它实际上工作得相当好.
话虽如此,DVCS传统上做得很好,并且大多数集中式VCS都有一些哈希值.其中最重要的可能是分支:DVCS将使分支存储库或合并不再需要的分支变得非常容易,并且会在您执行此操作时跟踪历史记录.没有特别的理由为什么集中式计划会遇到这个问题,但从历史上看,似乎没有人能够做到这一点.这对你来说实际上是一个问题取决于你将如何组织开发,但对于很多人来说这是一个重要的考虑因素.
DVCSes的另一个优势是他们脱机工作.我从来没有真正用过那么多; 我主要是在办公室(所以在本地网络上的存储库)或在家里(所以有ADSL)进行开发.如果您在旅行时对笔记本电脑进行了大量的开发,那么这可能更适合您.
实际上并没有很多特定于DVCS的陷阱.人们有一种稍微倾向于保持安静的倾向,因为你可以在不推动的情况下进行投入,并且很容易在私下抛光,但除此之外我们没有遇到很多问题.这可能是因为我们有大量的开源开发人员,他们通常熟悉开发的补丁交易模型,但是传入的封闭源开发人员似乎也能够合理地快速提升.