关于svn:Git / Mercurial / Bazaar的受欢迎程度与推荐

Popularity of Git/Mercurial/Bazaar vs. which to recommend

按照这三个分布式版本控制系统在这个站点上的问题的数量来看,Git似乎也是

  • 更受欢迎,或者
  • 更困难(因此需要更多的问题),或
  • 具有更多功能(因此需要更多问题)。
  • 或者可能是三者的结合。(假设此网站的人气相当于总体人气。)以下是数字:

    enter image description here。氧化镁

    有三种相互竞争但基本上相当的开源产品可供选择,这并不完全令人满意。就我个人而言,我使用Git,我和另外两个没问题。但是,当涉及到推荐一个系统而不是其他系统时,我想问:我们能安全地开始推荐一个吗?

    2009年年中的评论:最近颠覆运动的历史流行程度明显反映在问题的数量上,这表明在变化莫测的市场或集市上,至少有一小部分规模向Git倾斜。

    2010年年中的评论:看看那些相对增加的巨幅反复无常的数字。显然,只有两个数据点不足以显示一种趋势,但看起来Git和Subversion基本上是根深蒂固的,Mercurial已经看到了大量增长,Bazaar仍然相对平静。

    简要评论,2011年年中:我们可以叫吉特为赢家吗?:)不,我接受这样一种观点,即问题的数量不等于受欢迎程度。不过,数字确实很强劲。

    复制上述绘图的代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    import datetime as dt
    import matplotlib.pyplot as plt


    dates = [
       "01/06/2009",
       "01/07/2010",
       "01/07/2011",
       "01/07/2012",
       "01/07/2013",
       "01/07/2014",
       "01/07/2015",
       "01/07/2016",
       "01/06/2017",
       "28/08/2018",
       "27/05/2019"
    ]
    x = [dt.datetime.strptime(d,"%d/%m/%Y").date() for d in dates]

    git = [726, 3725, 9225, 17523, 27862, 41478, 55315, 71056, 86958, 102362, 110970]
    svn = [2353, 5323, 9028, 12687, 15587, 18846, 21209, 23037, 24692, 25525, 25868]
    mercurial = [169, 1120, 2765, 4221, 5230, 6030, 6651, 7134, 7524, 7765, 7894]
    bazaar = [50, 159, 252, 351, 425, 483, 506, 525, 534, 539, 544]

    ax = plt.gca()

    ax.grid()
    plt.plot(x, git, label="[git]")
    plt.plot(x, svn, label="[svn]")
    plt.plot(x, mercurial, label="[mercurial]")
    plt.plot(x, bazaar, label="[bazaar]")
    plt.gcf().autofmt_xdate()
    plt.ylabel("number of tags on stackoverflow")
    plt.ylim(0)

    plt.legend()

    # plt.show()
    plt.savefig("comparison.png", transparent=True, bbox_inches="tight")
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    import datetime as dt
    import matplotlib.pyplot as plt


    dates = [
       "01/06/2009",
       "01/07/2010",
       "01/07/2011",
       "01/07/2012",
       "01/07/2013",
       "01/07/2014",
       "01/07/2015",
       "01/07/2016",
       "01/06/2017",
       "28/08/2018",
       "27/05/2019"
    ]
    x = [dt.datetime.strptime(d,"%d/%m/%Y").date() for d in dates]

    git = [726, 3725, 9225, 17523, 27862, 41478, 55315, 71056, 86958, 102362, 110970]
    svn = [2353, 5323, 9028, 12687, 15587, 18846, 21209, 23037, 24692, 25525, 25868]
    mrc = [169, 1120, 2765, 4221, 5230, 6030, 6651, 7134, 7524, 7765, 7894]
    bzr = [50, 159, 252, 351, 425, 483, 506, 525, 534, 539, 544]

    n = len(dates)
    intervals = [x[i+1] - x[i] for i in range(n-1)]
    git_per_day = [(git[i+1] - git[i]) / intervals[i].days for i in range(n-1)]
    svn_per_day = [(svn[i+1] - svn[i]) / intervals[i].days for i in range(n-1)]
    mrc_per_day = [(mrc[i+1] - mrc[i]) / intervals[i].days for i in range(n-1)]
    bzr_per_day = [(bzr[i+1] - bzr[i]) / intervals[i].days for i in range(n-1)]

    ii = [0] + [val for val in range(1, n-1) for _ in (0, 1)] + [n-1]
    jj = [val for val in range(n-1) for _ in (0, 1)]

    ax = plt.gca()
    ax.grid()

    plt.plot([x[i] for i in ii], [git_per_day[j] for j in jj], label="[git]")
    plt.plot([x[i] for i in ii], [svn_per_day[j] for j in jj], label="[svn]")
    plt.plot([x[i] for i in ii], [mrc_per_day[j] for j in jj], label="[mercurial]")
    plt.plot([x[i] for i in ii], [bzr_per_day[j] for j in jj], label="[bazaar]")

    plt.gcf().autofmt_xdate()
    plt.ylabel("average daily tags on stackoverflow")
    plt.legend()
    plt.ylim(0)

    # plt.show()
    plt.savefig("comparison-daily.png", transparent=True, bbox_inches="tight")


    2011年11月更新:

    Git现在比2009年成熟得多:

    • 现在支持智能HTTP,这意味着您可以向客户机提供用于拉/克隆和推送的HTTPS协议,并且具有与LDAP接口的身份验证(对于企业中的用户很重要)
    • Gitolite现在有了一个成熟的授权层,这意味着您可以为"机密"存储库提供隔离(同样,对于大公司很重要)。
    • Windows的支持在2009年就已经存在了,现在仍然很强大,TortoiseGit也相当稳定。
    • 与类似于IDE的Eclipse的集成正在进行中(大多数Eclipse项目现在都在Github上)

    但是,在集中环境中安装Git并不容易:参见"分布式版本控制系统和企业-一个好的组合?"

    有一点经常被忽略:

    它们的性质不同。

    • SVN是一个修订系统(它只通过便宜的拷贝存储分支和标签!合并支持不是很有效),它是集中的。
    • Mercurial或Bazaar是文件VCS(它们存储文件版本),并且是分布式的。ArneBabenhauserheide通过指出Mercurial的历史模型跟踪内容更改来修正Mercurial的这一点,并在存储层中重新使用文件路径来优化文件系统访问。
    • Git是一个内容VCS(它存储内容增量,而不是文件本身:两个内容相同的文件只存储一次)。

    这意味着:

    • 如果您有一个简单的合并工作流,在单个开发位置,请使用SVN。
    • 如果您有几个开发位置,分布式VCS更适合。
    • 如果您有一个复杂的合并工作流程,那么任何现代的VCS都比那些多年来一直努力将合并信息保持在正确位置的SVN要好。然后取决于工具(例如,Mercurial支持更高级的Windows)
    • 如果您主要使用文本文件,而不是太大的二进制文件,那么Git非常优秀,前提是您了解它的限制。


    Going by the number of questions on this site for these three distributed version control systems, it seems like Git either

  • is more popular, or
  • is more difficult (hence requiring more questions), or
  • has more features (hence requiring more questions).
  • 关于SCM的流行性——请参见下面的stackoverflow问题:对于免费的rcs/scm/vcs系统,有没有可用的流行性/使用统计数据?在这里,我们有一些问题,比如要为特定类型的项目使用哪一组忽略文件,这些文件是不可知的,但是要求使用git(并使用"git"标记),因为提出问题的人使用它。

  • 关于Git的难度更大(因此对So有更多的疑问)——当然Git的学习曲线更陡。它还使用了一些(相当)独特的概念,比如临时区域(索引),或者所有的分支都是相等的,它们负责它的功能,但一开始可能很难正确地进行(特别是如果一个分支来自其他的SCM)。此外,GitUI并不完全一致(尽管它会变得更好),因为它是成长的,而不是开发出来的;这是它的强大功能,但可能导致用户界面不理想。

  • 关于Git有更多的特性——您必须检查有多少这样的问题是关于Git的高级/不常见特性的。但是,您应该知道,开放源码项目相互借用思想,或者独立开发类似的功能:一个例子是通过将提交的历史分为(搜索)两部分来发现bug,这引入了bug,这个bug(据我所知)是在Git中首先开发的,然后在Bazaar中作为插件实现的,并且是第一个扩展。目前是Mercurial的核心功能。另一种方法是交互选择要提交的变更片段,受DARC行为的启发。另一个可能是Git的捆绑概念,借鉴了Mercurial的类似概念。

  • 另一个可能的来源更多的所以问题可能是缺乏良好的文件…尽管现在Git用户手册(与Git一起分发)和Git社区手册(在Git主页上找到)的使用情况有所改善。不过,还有一个持久的模因,Git的文档比,比方说,使用Subversion(也称为Svnbook)和Mercurial:The Determinal Guide(也称为Hg Book)进行版本控制的Subversion更糟糕。有时,人们在询问StackOverflow问题之前不会阅读文档。

  • It's not entirely satisfactory having three competing yet largely equivalent open source products to choose from. Personally I use Git and I'm fine with the other two. But when it comes to recommending one system over the others, I'd like to ask: can we start recommending one safely yet?

    好吧,Git和Mercurial几乎是在同一时间独立开发的,作为对Linux内核开发人员使用的BitKeeper的免费许可证终止的响应,作为它的替代。颠覆作为集中式的单片机是不可能的,核心对合并跟踪缺乏支持,这使得它完全不适合Linux内核的大分布式开发模式。集市可能太慢了(至少在那时),有点集中(我猜)。

    Git是更强大的(在我看来),水星是更简单的(在人们的意见)和一个更便携(Python);Git是可脚本化的并且基于允许独立的重新实现的数据模型(参见例如JGIT,Java编写的Git),而MyurialPython绑定用于编写扩展,并且主要基于API允许底层的改变。Ying存储库格式(revlog-revlog ng)…但这只是我的猜测。它们填补了稍有不同的壁龛。

    另外,没有选择是件好事吗?我们有kde和gnome和xfce(以及其他窗口管理器和桌面环境);我们有emacs和vim(以及其他程序员的编辑器);我们有基于RPM的(例如Fedora Core、Mandriva、Suse)和基于DEB的(Debian、Ubuntu)和基于TGZ的(Slackware)和基于源代码的(Gentoo)发行版;我们有kword、abiword和openoffice.org…我们有Git,Mercurial和Bazaar。


    我使用并推荐Mercurial

    • 而不是颠覆,因为它支持分布式开发。我可以在几台机器上工作并在本地提交。对于Subversion,你不能这样做,至少不能像其他存储库那样没有翻筋斗。
    • 而不是Bazaar,因为Bazaar的Windows支持是…好。
    • 而不是Git,因为它a)学习和使用更简单b)Windows支持更好


    根据我的经验,从问题的数量来看,这明显扭曲了与Git和Mercurial的对比。原因有两方面:

  • 看看hg update --helpgit checkout -hgit --help checkout的对比。我用反复无常的眼光,发现了一些问题,没有用几眼的眼光回答。

  • 查看mercurial wiki-如果您需要帮助,您可能会在那里找到它,包括许多提示和技巧:http://mercurial-scm.org/wiki/tipsandtricks


  • [注:随着Subversion 1.7的发布,下面我的答案中的第一段已经过时,因为Subversion现在只在基本文件夹中创建一个".svn"文件夹,与其他文件夹类似。]

    与Subversion相比,这三个文件夹的一个优点是,它不会在项目的每个文件夹中创建一个与".svn"文件夹等效的文件夹。通常在基本文件夹中只有一个(".hg"、".bzr"或".git")。即使您使用的是集中式存储库模型,单凭这一点就可以很好地在SVN上使用它们中的一个。(除此之外:事实上,我经常使用SVK作为我的SVN客户机,而仅仅是为了这个特性而使用SVN存储库(不过,仅在Linux上,SVK在Windows上并不好)。

    当然,Subversion的一个优点是,如果只需要一个子文件夹,就不必签出整个项目。


    Canonical(Ubuntu)跟踪软件包为自己使用的发行版,所以没有需要两个堆栈rely在线交易两项popularity计数问题。然而,有了为他人芒,这是唯一的Ubuntu用户跟踪和Canonical(Ubuntu)和recommends辨别bzr(样品偏压)。nonetheless…

    1
    2
    3
    4
    5
    6
                2011    2011    2011          
    Package     Aug 3   Sep 29  Dec 9   Change
    ------      ------  ------  ------  ------
    git-core    3647    3402    3236    -11%  
    bzr         4975    5286    6070    +22%  
    mercurial   3411    3387    3461     +1%

    的下降在投票的Git芯包让我认为我做什么什么样的错误的错误greped package name从Ubuntu popularity表。或者甚至是"投票""count冰相关的安装和没有实际使用的软件。

    这里的一些历史数据的东西。在过去的而不是在这个国家从Ubuntu的节目表,但它生长在一个冲刺的集市和mercurial在2011年开始。nonetheless bzrgit背后,是在2011年,但近年来国家对2011年的展,它通过在全gitinstances(在安装Ubuntu)。

    1
    2
    3
    4
    5
    6
            June    Aug     Dec     Growth  Oct   Growth
            2010    2011    2011            2013
    ----    -----   ----    ----    ------  ----  ------
    git      94k    159k    171k      80%   165k   -3.5%
    bzr      52k    121k    135k     160%   170k   26.0%
    hg       36k     68k     75k     110%    95k   26.7%

    discalaimer:bzr在线使用Ubuntu,直到2012年的时候,在团队工作gitexclusively使用。好的bzr剧目,与所有其他vcses,allowing你使用bzr洽,直观的命令行语法。我的两个git开关是社会而不是技术原因。


    自从GitHub上Git的社交编码起源以来,Git似乎吸引了很多追随者。


    Git有这么多用户的原因是Linux内核使用它,所以如果您想进行Linux开发,就使用Git。

    因为有这么多人参与了Git,我建议使用Git,这仅仅是因为它拥有更大的用户群。事实上,上面显示的数字是这一点的明显标志。

    至于难度,所有版本控制都很困难,特别是分布式版本控制。SVN和CVS乍看起来并不容易(至少对我来说)。这只是习惯于版本控制系统的必要学习曲线的一部分。

    编辑:既然你添加了一个Subversion引用,我想我会解决它。我认为大多数人会使用SVN,因为它有各种各样漂亮的GUI接口。一般来说,人们不喜欢使用命令行,包括一些开发人员。Git在Windows上通常也不能很好地工作(或者至少不能无缝地工作)。由于许多人都在Windows上,这会扼杀潜在用户的数量。

    此外,我认为SVN的概念更容易理解,因为SVN使用中央存储库而不是分布式系统。更容易理解的是,"这里是代码的大山,请在这里添加您的代码,"而"这里是一些代码,我的可能不同于他的,他的和她的,但如果您愿意,您可以添加一些东西。"

    在我看来,SVN有一个更好的文档系统。Git的文档针对的是更高层次的知识(程序的知识,而不是程序员的智能),因此在您使用系统之后是有意义的,但是当第一次启动时,它看起来就像一堆Gobbeldy Gook。

    总的来说,我认为SVN现在和将来都会更加流行,因为它的一般操作概念更容易理解,工具也更容易使用,而且它在Windows上有极好的支持。

    不过,让我以最后两分钱结束,并说我更喜欢Git,因为我认为它比我使用的任何其他系统都强大得多。一旦你开始更好地理解程序,爬上学习曲线肯定会有回报。


    检查下面的链接)在两个主题:

    http:/ / / / 160 www.debian-administration.org民调


    我不normally邮件但…………………

    在这里我想出去,和其他一些bzr忘记bzr招领有极极弱一点。"坚持男女大档案信息在整个文件加载到存储器中。这个大的二进制文件创建的问题。

    Git是一批更好,在那方面。AS的难度。在Windows中使用Git Bash从Git。大鸭厂为止,在不到一周(,包括实际的工作和与其他experimenting VCS)


    埃里克·辛克的一篇关于他们的有趣的博客文章。