我应该使用SVN还是Git?

时间:2008-10-02 09:47:05

标签: git svn version-control

我正在开始一个新的分布式项目。我应该使用SVN还是Git,为什么?

21 个答案:

答案 0 :(得分:253)

SVN是一个回购和很多客户。 Git是一个拥有大量客户回购的回购,每个回购都有一个用户。它被分散到人们可以在本地跟踪自己的编辑而无需将内容推送到外部服务器的程度。

SVN被设计为更加重要的地方,Git基于每个用户拥有自己的Git仓库,并且那些repos推送更改备份到中央。出于这个原因,Git为个人提供了更好的本地版本控制。

与此同时,您可以选择TortoiseGitGitExtensions(如果您在github上托管“中央”git-repository,则可以选择client – GitHub for Windows)。

如果你想要退出SVN,你可能想要评估一下Bazaar。它是具有此分布式元素的下一代版本控制系统之一。它不依赖于POSIX,因此有本机Windows版本,它有一些强大的开源品牌支持它。

但你可能还不需要这些功能。看看the features, advantages and disadvantages of the distributed VCSes。如果您需要的不仅仅是SVN优惠,请考虑一个。如果不这样做,您可能希望坚持使用SVN(当前)卓越的桌面集成。

答案 1 :(得分:110)

我从来不理解“git在Windows上不好”的概念;我只在Windows下开发,我从来没有遇到任何git问题。

我肯定会推荐git over subversion;它的功能多得多,并且允许“颠覆式开发”以颠覆从未真正实现过的方式。它几乎可以在任何可以想象的平台上使用,并且具有比您可能使用的功能更多的功能。

答案 2 :(得分:77)

以下是我对some duplicate question since then deleted关于Git与SVN(2009年9月)的回答。

更好?除了通常的链接WhyGitIsBetterThanX之外,它们是不同的:

一个是基于分支和标签的廉价副本的中央VCS 另一个(Git)是基于修订图的分布式VCS。 另请参阅Core concepts of VCS


第一部分产生了一些错误的评论,假装这两个程序(SVN和Git)的基本目的是相同的,但它们的执行方式完全不同。
为了澄清fundamental difference between SVN and Git,让我重新说一下:

  • SVN是revision controlRCS, then CVS and finally SVN管理版本化数据目录的第三个实现。 SVN提供了VCS功能(标签和合并),但它的标签只是一个目录副本(就像一个分支,除了你“不应该”触摸标签目录中的任何东西),它的合并仍然很复杂,目前基于meta -data添加以记住已经合并的内容。

  • Git是文件内容管理(用于合并文件的工具),演变为真正的版本控制系统,基于DAG({{ 3}})提交,其中分支是数据历史的一部分(而不是数据本身),标签是真正的元数据。

要说它们不是“根本上”不同,因为你可以达到同样的目的,解决同样的问题,在很多层面都是......显而易见的错误。

  • 如果您有许多复杂的合并,使用SVN执行它们会更长,更容易出错。 如果你必须创建许多分支,你将需要管理它们并合并它们,使用Git比使用SVN更容易,特别是如果涉及大量文件(速度变得很重要)
  • 如果您正在进行正在进行的工作的部分合并,您将利用Git临时区域(索引)仅提交您需要的内容,隐藏其余部分,然后继续进行另一个分支。
  • 如果您需要离线开发......与Git一起使用,您总是“在线”,拥有自己的本地存储库,无论您希望与其他存储库一起使用的工作流程。

仍旧对旧(已删除)答案的评论仍然存在:

  

VonC:你在实施方面的根本差异(差异是非常基本的,我们都明确同意这一点)与目的上的差异混淆了。
  它们都是用于同一目的的工具:这就是为什么许多以前使用过SVN的团队已经成功地将它转储为Git。
  如果他们没有解决同样的问题,那么可替代性将不存在。

,我回复说:

“替代性”......有趣的术语(Directed Acyclic Graph) 当然,Git几乎不是SVN的子类型。

您可以使用两者获得相同的技术功能(标记,分支,合并),但Git不会妨碍您使用让您专注于文件的内容,而无需考虑工具本身。

你肯定不能(总是)只用Git替换SVN“而不改变该程序的任何理想属性(正确性,执行任务,......)”(这是对上述used in computer programming的引用) :

  • 一个是扩展修订工具,另一个是真正的版本控制系统。
  • 一个适合中小型单片项目,具有简单的合并工作流程和(不太多)并行版本。 SVN就足够用于此目的,您可能不需要所有Git功能。
  • 另一个允许基于多个组件(substitutability definition)的中型到大型项目,在复杂的合并工作流中,多个文件要在多个分支之间进行合并,分支中的并行版本,改进合并等等。你可以用SVN做到这一点,但你最好用Git SVN无法使用任何合并工作流管理任何大小的任何项目。 Git可以。

同样,他们的性质根本不同(然后导致不同的实施,但这不是重点)。
一个看到版本控制作为目录和文件,另一个只看到文件的内容(以至于空目录甚至不会在Git中注册!)。

一般的最终目标可能是相同的,但你不能以相同的方式使用它们,也不能解决同一类问题(范围或复杂性)。

答案 3 :(得分:37)

SVN的两个主要优点很少被引用:

  1. 大文件支持。除了代码,我使用SVN来管理我的主目录。 SVN是唯一没有阻塞我的TrueCrypt文件的VCS(分布式或非分布式)(如果有另一个VCS可以有效处理500MB +文件,请纠正我)。这是因为差异比较是流式传输的(这是非常重要的一点)。 Rsync是不可接受的,因为它不是双向的。

  2. 部分存储库(subdir)结帐/签入。 Mercurial和bzr不支持这一点,而且git的支持是有限的。这在团队环境中很糟糕,但如果我想从我家里的另一台计算机上查看一些东西,这是非常宝贵的。

  3. 只是我的经历。

答案 4 :(得分:24)

在做了更多研究并审核此链接后:https://git.wiki.kernel.org/articles/g/i/t/GitSvnComparison_cb82.html

(下面的一些摘录):

  • 速度非常快。 没有其他我使用的SCM能够跟上它,我已经使用了很多,包括Subversion,Perforce,darcs,BitKeeper,ClearCase和CVS。
  • 它完全分发。 存储库所有者无法决定我的工作方式。我可以在笔记本电脑上断开连接时创建分支并提交更改,然后将其与任意数量的其他存储库同步。
  • 可以在许多媒体上进行同步。 SSH通道,通过WebDAV通过HTTP,通过FTP或发送包含要由消息接收者应用的补丁的电子邮件。中央存储库不是必需的,但可以使用。
  • 分支甚至比Subversion便宜。 创建分支就像将41字节文件写入磁盘一样简单。删除分支就像删除该文件一样简单。
  • 与Subversion不同,分支带有完整的历史记录。 无需执行奇怪的副本并浏览副本。使用Subversion时,我总是发现在创建分支之前查看分支上的文件的历史记录很困​​难。来自#git:spearce:我对页面中的SVN一无所知。我在SVN上创建了一个分支,浏览历史记录显示整个历史记录在分支中的文件
  • Git中的分支合并更简单,更自动。 在Subversion中,您需要记住您合并的最后一个修订版本,以便生成正确的合并命令。 Git会自动执行此操作,并始终正确执行此操作。这意味着在将两个分支合并在一起时犯错的可能性较小。
  • 分支合并被记录为正确的历史记录的一部分 库。如果我将两个分支合并在一起,或者如果我将一个分支合并回到它所来自的主干中,则该合并操作被记录为由我执行的重新存储历史的一部分,以及何时。如果在日志中出现合并,那么很难对谁进行合并。
  • 创建存储库是一项简单的操作: mkdir foo; cd foo; git init 而已。这意味着我现在为所有东西创建一个Git存储库。我倾向于每个类使用一个存储库。这些存储库中的大多数都在磁盘下不到1 MB,因为它们只存储讲义,家庭作业和我的LaTeX答案。
  • 存储库的内部文件格式非常简单。 这意味着修复很容易,但更好,因为它非常简单,很难被破坏。我认为没有人曾经有过Git存储库被破坏。我已经看到Subversion与fsfs腐败本身。我已经看到Berkley DB损坏了太多次,无法将我的代码信任到Subversion的bdb后端。
  • 尽管如此,Git的文件格式非常适合压缩数据 这是一种非常简单的格式。 Mozilla项目的CVS存储库大约为3 GB;它在Subversion的fsfs格式中约为12 GB。在Git中它大约300 MB。

阅读完所有这些后,我确信Git是可行的方法(虽然存在一点点学习曲线)。我也在Windows平台上使用过Git和SVN。

在阅读上述内容之后,我想听听别人的意见吗?

答案 5 :(得分:11)

我会建立一个Subversion存储库。通过这种方式,各个开发人员可以选择是使用Subversion客户端还是Git客户端(使用git-svn)。使用git-svn并不能为您提供所有完整Git解决方案的好处,但它确实为各个开发人员提供了对其工作流程的大量控制。

我相信Git在Windows上的运行时间与在Unix和Mac OS X上的运行时间相对较短(自从你问过)。

Subversion拥有出色的Windows工具,例如用于Explorer集成的TortoiseSVN和用于Visual Studio集成的AnkhSVN。

答案 6 :(得分:11)

有趣的是: 我在Subversion Repos中托管项目,但是通过Git Clone命令访问它们。

请阅读Develop with Git on a Google Code Project

  

虽然谷歌代码原生发言   Subversion,你可以轻松使用Git   在开发期间。正在寻找“git   svn“表明这种做法是   普遍,我们也鼓励你   试验它。

在Svn存储库上使用Git可以带来好处:

  1. 我可以在几个上工作分发 机器,承诺和拉动 和他们
  2. 我有一个中央 backup/public svn存储库供其他人查看
  3. 他们可以自由地使用Git

答案 7 :(得分:9)

绝对是svn,因为Windows最多是git世界的二等公民(有关详细信息,请参阅http://en.wikipedia.org/wiki/Git_(software)#Portability)。

更新:抱歉链接已损坏,但我已经放弃尝试使用包含括号的URI。 [现在链接修复。 -ed]

答案 8 :(得分:9)

没有真正回答你的问题,但如果你想要Distributed Revision Control的好处 - 听起来像你做的那样 - 并且你正在使用Windows我认为你最好不要使用Mercurial而不是那个Git因为Mercurial有更好的Windows支持。 Mercurial也有Mac端口。

答案 9 :(得分:9)

如果您的团队已经熟悉cvs或svn等版本和源代码控制软件,那么,对于一个简单的小项目(例如您声称的那样),我建议您坚持使用SVN。我对svn很满意,但对于我在django上做的当前电子商务项目,我决定使用git(我在svn-mode中使用git,也就是说,我使用集中式仓库来推送和拉动来自至少与其他一个开发者合作)。另一个开发人员对SVN感到满意,虽然其他人的体验可能不同,但我们俩都很难在这个小项目中使用git。 (如果重要的话,我们都是核心Linux用户。)

当然,您的里程可能会有所不同。

答案 10 :(得分:8)

重点是,Git是一个分布式VCS,而Subversion是一个集中式VCS。分布式VCS有点难以理解,但有许多优点。如果您不需要这些优势,Subversion可能是更好的选择。

另一个问题是工具支持。您计划使用的工具能更好地支持哪种VCS?

编辑:三年前,我这样回答:

  

Git目前仅通过Cygwin或MSYS在Windows上工作。   Subversion从一开始就支持Windows。作为git-solutions   对于Windows可能适合您,可能有问题,最多   Git的开发人员使用Linux并且没有可移植性   从头开始。目前我更喜欢Subversion   Windows下的开发。在几年内,这可能是无关紧要的。

现在世界发生了一些变化。 Git现在在Windows上有很好的实现。虽然我在Windows上没有经常测试(因为我不再使用这个系统),但我非常有信心,所有主要的VCS(SVN,Git,Mercurial,Bazaar)现在都有适当的Windows实现。 SVN的这个优势已经消失。其他要点(Centralized vs. Distributed和检查工具支持)保持有效。

答案 11 :(得分:6)

我会选择SVN,因为它更广泛传播并且更为人所知。

我猜,Git对Linux用户会更好。

答案 12 :(得分:4)

归结为:

您的发展是线性的吗?如果是这样,你应该坚持使用Subversion。

另一方面,如果您的开发不是线性的,这意味着您需要为不同的更改创建分支,然后将这些更改合并回主开发线(Git称为主分支)然后Git会为你做更多的事情。

答案 13 :(得分:4)

我已经使用了SVN很长一段时间,但每当我使用Git时,我觉得Git功能强大,重量轻,虽然有一点学习曲线,但比SVN更好。

我所注意到的是,每个SVN项目随着它的增长而成为一个非常大的项目,除非它被导出。其中,GIT项目(以及Git数据)的重量非常轻。

在SVN中,我处理过从新手到专家的开发人员,如果他们从另一个SVN项目中复制一个文件夹以重新使用它,新手和中间人似乎会引入文件冲突。然而,我认为在Git中,你只是复制文件夹并且它有效,因为Git并没有在其所有子文件夹中引入.git文件夹(如SVN所做的那样)。

经过很长时间的SVN处理后,我终于想把我的开发人员和我转移到Git,因为很容易合作和合并工作,以及一个很大的优势就是本地副本&# 39; s更改可以尽可能多地提交,然后最终一次性推送到服务器上的分支,这与SVN不同(我们必须在服务器上的存储库中不时提交更改)。

任何可以帮我决定是否真的应该使用Git的人?

答案 14 :(得分:4)

我可能会选择Git因为我觉得它比SVN强大得多。有一些廉价的代码托管服务可供我使用 - 您无需进行备份或任何维护工作 - GitHub是最明显的候选者。

那就是说,我对Visual Studio和不同SCM系统的集成一无所知。我认为与SVN的集成显着更好。

答案 15 :(得分:4)

目前还没有在Windows下本地支持Git。它针对Posix系统进行了优化。但是,运行Cygwin或MinGW可以让你成功运行Git。

现在我更喜欢Git而不是SVN,但是如果你来自CVS,SVN的土地需要一段时间才能超过门槛。

答案 16 :(得分:3)

YouTube上有一个有趣的视频。这是来自Linus Torvalds本人:Goolge Tech Talk: Linus Torvalds on git

答案 17 :(得分:3)

你试过Bzr吗?

非常好,非常(制作Ubuntu的人)之所以成功,是因为他们不喜欢市场上的任何其他产品......

答案 18 :(得分:3)

我可以扩展这个问题并询问Git是否在MacOS上运行良好?

回复评论:感谢您的新闻,我一直期待着尝试一下。我将把它安装在家里的Mac上。

答案 19 :(得分:2)

SVN在Windows下似乎是一个不错的选择,正如其他人所指出的那样。

如果您的某些开发人员想要尝试GIT,它可能总是使用GIT-SVN,其中SVN存储库在GIT存储库中重新创建。然后,他应该能够在本地使用GIT,然后使用SVN将其更改发布到主存储库。

答案 20 :(得分:1)

你必须使用DVCS,这就像源代码管理的一次巨大飞跃。我个人使用Monotone并加快开发时间。我们将它用于Windows,Linux和Mac,并且非常稳定。我甚至让buildbot在每个平台上进行项目的夜间构建。

DVCS在发布时通常意味着您将创建一个中央服务器,仅供人们推送更改。