SVN可以做什么,Git不能?

时间:2011-02-24 08:28:09

标签: svn git

在掌握Git之前,我目前已深入SVN。这是我第一次认真的源控制管理系统学习体验。

我想知道不学习(或者甚至去学习我学到的东西)的机会成本SVN。有什么我需要注意的吗?

GitSVN相比,是否存在不可行或难以处理的事情?

13 个答案:

答案 0 :(得分:14)

Git无法检查子树并将其用作完整的存储库。

例如,使用Subversion,您可以检查目录“trunk”并将其用作存储库。您还可以查看“branches / feature1”并使用它。使用Git,只能检查根目录(尽管最新版本可以执行稀疏检出,但不会下载所有文件,但您仍然需要检查根目录)。在Git中,您将使用分支而不是检查子树。

答案 1 :(得分:14)

Git无法svn lock个文档,因此有人可以阻止其他人编辑非自动合并的实体(例如Word或Excel文件)。

答案 2 :(得分:13)

我认为您可能更喜欢使用Subversion而不是git的少数用例之一是,如果您正在尝试管理一个非常大的二进制媒体存储库,其中人们通常只需要最新版本。例如说你正在开发一个游戏,艺术家需要跟踪所有艺术作品的修订,但是存储库的整个历史将是巨大的(100千兆字节)

为了公平对待git,这是一个与其设计目的相差甚远的用例(管理源代码存储库),如果你真的想要使用git,那么有各种解决方法或扩展可能会有所帮助,例如:

  • 浅克隆
  • Scott Chacon的git-media分机
  • Joey Hess的类似项目git annex
  • 使用Avery Pennarun的bup直接创建包文件

...但它仍然是一个人们可能更喜欢SVN的领域。几年前GitTogether中有一个brief presentation on this subject

答案 3 :(得分:7)

Git无法存储空目录。可以说,这是一个优势,但是git不能做但是svn可以做的一件事。

答案 4 :(得分:5)

这个Wiki有一个很好的比较:https://git.wiki.kernel.org/index.php/GitSvnComparison

<强>汇总

  • Git比Subversion快得多
  • Subversion允许您只检查存储库的子树; Git要求您克隆整个存储库(包括历史记录)并创建一个工作副本,该副本至少镜像版本控制下的项目的子集。
  • Git的存储库比Subversions小得多(对于Mozilla项目,小30倍)
  • Git旨在从一开始就完全分发,允许每个开发人员拥有完全的本地控制
  • Git分支比Subversion的
  • 更简单,资源更少
  • Git分支带着他们的整个历史
  • 在Git中合并不需要你记住你合并的修订版本(这个好处是在Subversion 1.5发布时得到的)
  • Git提供更好的分支和合并事件审核
  • Git的repo文件格式很简单,因此很容易修复并且很少发生损坏。
  • 集中备份Subversion存储库可能更简单 - 因为您可以选择在git中的repo中分发文件夹
  • Git存储库克隆充当完整存储库备份
  • Subversion的UI比Git的
  • 更成熟
  • 在Subversion中浏览版本更简单,因为它使用顺序修订号(1,2,3,..); Git使用不可预测的SHA-1哈希值。使用“^”语法在Git中向后移动很容易,但是没有简单的方法可以向前走。

答案 5 :(得分:3)

  • Git没有严格(平台无关)支持文件名和提交消息中的非US-ASCII字符,git只存储从OS获取的字符的字节表示,而不是翻译它。
  • Git无法记录哪些特定提交被挑选出来。

答案 6 :(得分:2)

我会说你几乎可以做任何与git有关的事情,甚至比颠覆更能让你做到。那应该不是你的担心。然而,两者都很受欢迎,值得您的关注,特别是如果您在开源编程中。

然而,我会认为git更难学,但是一旦掌握了它,人们通常会上瘾,并发现其他SCM较差。对git的分布式支持是非常好的(还有其他一些,但git可能是最普遍的),这对于除了单独管理源代码之外的许多其他任务来说恰好是有用的。 git可以被认为是类固醇的ZIP实用程序,可以快速部署以跟踪常规文件系统更改并以有效的方式在主机之间复制更改。

在Windows上,git存在一些问题:

  • 许多实现中的Unicode文件名支持都是错误的。这一直在变得更好,但仍然是一个问题。
  • 资源管理器插件在Windows上并不是那么好用。我发现使用命令行版本更容易。

但是我会考虑git有的东西而SVN没有。没有对SVN中的分支的明确支持是一个主要问题 - git实现非常好并且允许您在不考虑分支的情况下进行分支。能够离线工作也是一个主要的享受。

答案 7 :(得分:2)

对于我们来说,SVN最重要的功能是能够重新存储整个锁文件。由于我们使用二进制和不可合并的CAD文件,因此任何DVCS的基于合并的工作流程都不起作用。

答案 8 :(得分:2)

无法限制对repo的一部分的读取权限(即仅允许读取某些文件,或仅允许读取部分历史记录)。这是因为您只能克隆一个完整的存储库这一事实的直接后果(如Theo和Mark Longair所述)。如果您希望对不同文件使用不同级别的读取访问权限,则必须将它们放入不同的存储库(可以作为子模块包含在主存储库中)。

请注意,可以根据许多条件(路径,文件名,历史记录修改)限制对repo的写访问权限。您需要使用除git之外的特殊软件来执行此操作(例如gitosis),但这与Subversion类似。

在实践中,上面通常不是问题,因为在Git中,想法是存储库包含通常一起使用的文件(例如一个程序或项目的源代码) - 因此通常限制对部件的读取访问没有意义,因为您需要所有文件来构建/使用项目。但是,如果你把许多松散相关的东西放到一个git仓库中,这可能会让你感到厌烦。

答案 9 :(得分:2)

Subversion是一个中央存储库

虽然许多人希望拥有分布式存储库以获得速度和多个副本的明显优势,但有些情况下更需要中央存储库。例如,如果你有一些你不想让任何人访问的关键代码,你可能不想把它放在Git下面。许多公司希望保持代码集中,并且(我猜)所有(严重的)政府项目都在中央存储库中。

颠覆是传统智慧

这就是说许多人(尤其是经理和老板)都有通常的方式对版本进行编号,并将开发视为一条“单线”,随着时间的推移硬编码到他们的大脑中。没有冒犯,但Git的慷慨解囊并不容易。任何Git书的第一章都告诉你要从脑海中消除所有传统理想并重新开始。

Subversion以一种方式做到了,没有别的

SVN是一个版本控制系统。它有一种方法可以完成它的工作,每个人都以同样的方式做到这一点。期。这使得从/向其他集中式VCS过渡到/从SVN变得容易。 Git甚至不是一个纯粹的VCS - 它是一个文件系统,有很多关于如何在不同情况下设置存储库的拓扑结构 - 而且没有任何标准。这使得选择一个更难。

其他优点是:

SVN supports empty directories
SVN has better Windows support
SVN can check out/clone a sub-tree
SVN supports exclusive access control svn lock which is useful for hard-to-merge files
SVN supports binary files and large files more easily (and doesn't require copying old versions everywhere).
Adding a commit involves considerably fewer steps since there isn't any pull/push and your local changes are always implicitly rebased on svn update.

找到并同意。当你触摸git时,newbees再次非常agro。我不能相信git或github,直到更多的安全性更改,例如超越可破解的ssh密钥。

答案 10 :(得分:1)

使用Git的分布式特性,没有一个地方(服务器)你/ sysadmin可以备份整个代码库。每个节点必须自己进行备份或每天合并到一个需要每日备份的节点。

答案 11 :(得分:1)

  1. SVN可用于通过Internet处理多TB的存储库。
  • 从技术上讲,Git也可以处理它,但是可以通过Internet克隆整个multi-T存储库...很好-我宁愿在收到存储库URL的同一天(而不是在10天后)开始工作。
  • li>
  1. SVN可以锁定文件,对于不可合并的二进制文件(合并JPEG,有人吗?),这通常是一件好事。
  2. SVN可以使用小于整个存储库的粒度来限制读取访问。
  3. 有点烦人:SVN可以处理合并的还原,而无需跳过违反直觉的箍圈,以便稍后重新引入一些还原的更改(有关详细信息,请参见Rollback a Git merge)。

注意:“将整个内容拆分为多个存储库”的策略也不总是可行。如果我们作为Gamedev团队拥有一个多T游戏回购协议(包括源代码和资产,并且#1和#2都是资产所必需的)-我们当然需要从一个单一的回购协议构建我们的游戏(否则,没有多个回购引用,整个事情就变得不可复制-这是一件不好的事情。

答案 12 :(得分:0)

svn可以做的另外两件事我想念git:

  1. externals(类似于存储库名称空间中的符号链接)
  2. 关键字扩展(结帐/更新期间自动更改文件内容)