最近看了很多 Git 与 SVN 的比较,很多都说 SVN 做分支很慢,不知道是从何说起。有可能大家都不清楚,SVN 做分支的正确步骤,特此介绍一下。
SVN 服务器后台使用 Berkeley DB 数据库进行数据保存。当前版本、发行版本、分支版本,在 SVN 客户端处中一般只是当成普通目录。SVN 客户端有很多种,客户端处数据如何保存,没有明确的说法。大多使用 SQLite 作为客户端数据库。
SVN 版本库从客户端上看其根目录为:
http://zhegui-svn/svn
几个主要子目录为:
1) | 当前开发主线目录 | http://zhegui-svn/svn/trunk/ |
2) | 之前正式发行版目录 | http://zhegui-svn/svn/releases/ |
3) | 之前或现在各分支版目录 | http://zhegui-svn/svn/branches/ |
4) | 每日构建目录 | http://zhegui-svn/svn/builds/ |
创建分支,或创建发行版,只是一个目录复制操作。由于SVN服务器端的数据是保存在 Berkeley DB 数据库里,因此,目录复制,在数据库层面,只是保存一条“在某个目录下创建一个子目录,新的子目录的内容,等同于另一个目录的那个版本”信息。
那些认为 SVN 复制分支,需要复制整个目录里所有文件的人,或者说出“拉分支的时间较慢,因为拉分支相当于copy”之类话的,都可以从头学习数据库了。反正稍微熟悉一点数据库的一些基本概念的技术人员,都不会设计出“分支要在服务器上复制整个目录里所有文件”这么个逻辑来。
以下是操作步骤举例(使用的 SVN 客户端工具软件是 TortoiseSVN ):
之后选择目录复制的源头、源头目录版本(可以不用最新版,最新版可能有人新加了一个功能,还没做完)、目的地目录:
上述截图中,将项目的主开发目录 http://zhegui-svn/svn/trunk/zhegui_print_upload 对应版本 29423 ,复制到 http://zhegui-svn/svn/releases/zhegui_print_upload-v3.0,即完成了发行版本的服务器上复制功能。一般再大的项目,都是秒级完成。
实际的软件项目开发中,只有以下目录用得比较多:
1) | 当前开发主线目录 | http://zhegui-svn/svn/trunk/ |
以下目录用得比较少:
2) | 之前正式发行版目录 | http://zhegui-svn/svn/releases/ |
3) | 之前或现在各分支版目录 | http://zhegui-svn/svn/branches/ |
4) | 每日构建目录 | http://zhegui-svn/svn/builds/ |
这是因为,创建新发行版本,只是在 SVN 服务器上进行目录复制,相当于只是在Berkeley DB 数据库保存一条“在某个目录下创建一个子目录,新的子目录的内容,等同于另一个目录的那个版本”信息。
那把这句话保存在一个文本文件中,也不费什么事。
同理,每日构建目录的存在意义,也不大。
另一方面,如果是软件产品类开发,有多个不同客户,可能分别进行 bug 修复,则仍有必要使用发行目录:
2) | 之前正式发行版目录 | http://zhegui-svn/svn/releases/ |
希望以上介绍,能帮助到大家。