代码管理 – SVN

代码管理工具也用了不少年了,整理下。

管理工具比较

用过VSS,CVS,TFS,SVN还有一个微软内部使用的不记得什么名字了。这里进行一些简单比较,重点介绍SVN的用法。

CVS历史悠久,1986年就发布了第一个版本,采用CS结构,服务器保持全部历史信息,主要用来管理文本,对其它类型的文件支持的不好。服务器上保存文件和修改的增量,可以直接打开编辑。按照文件来控制版本,当文件改名或挪地方之后,原来的历史信息就全丢了。不支持提交版本的原子性。操作简单直观,如果是简单的代码管理,这是比较合适的选择。

SVN由原CVS开发团队开发,目的是改进CVS存在的一些问题,进而替换CVS。SVN可以支持各种类型的文件,采用数据库保存文件,按照目录来标记版本信息,可以追踪改名和挪地方之前的历史信息,支持提交版本的原子性。功能更为强大,速度也更快,目前应用在许多企业项目中。

特性比较列表。详细的列表可以参考:http://en.wikipedia.org/wiki/Comparison_of_revision_control_software#cite_note-47

名称

版本库模型

并发模式

历史模式

变更范围

网络协议

原子提交性

部分克隆

CVS

Client-server

Merge

Changeset

File

Pserver,ssh

No

Yes

SVN

Client-server

3-way merge, recursive merge, octopus merge

Changeset and Snapshot

Tree

custom (svn), custom (svn) over ssh, HTTP and SSL (usingWebDAV)

Yes

Yes

Git

Distributed

Merge or lock

Snapshot

Tree

custom, custom over ssh, rsync, HTTP/HTTPS, email, bundles

Yes

No

* 版本库模型(Repository model):描述了多个源码版本库副本间的关系,有客户端/服务器和分布式两种模式。在客户端/服务器模式下,每一用户通过客户端访问位于服务器的主版本库,每一客户机只需保存它所关注的文件副本,对当前工作副本(working copy)的更改只有在提交到服务器之后,其它用户才能看到对应文件的修改。而在分布式模式下,这些源码版本库副本间是对等的实体,用户的机器出了保存他们的工作副本外,还拥有本地版本库的历史信息。

* 并发模式(Concurrency model):描述了当同时对同一工作副本/文件进行更改或编辑时,如何管理这种冲突以避免产生无意义的数据,有排它锁和合并模式。在排它锁模式下,只有发出请求并获得当前文件排它锁的用户才能对对该文件进行更改。而在合并模式下,用户可以随意编辑或更改文件,但可能随时会被通知存在冲突(两个或多个用户同时编辑同一文件),于是版本控制工具或用户需要合并更改以解决这种冲突。因此,几乎所有的分布式版本控制软件采用合并方式解决并发冲突。

* 历史模式(History model):描述了如何在版本库中存贮文件的更改信息,有快照和改变集两种模式。在快照模式下,版本库会分别存储更改发生前后的工作副本;而在改变集模式下,版本库除了保存更改发生前的工作副本外,只保存更改发生后的改变信息。

* 变更范围(Scope of change):描述了版本编号是针对单个文件还是整个目录树。

* 网络协议(Network protocols):描述了多个版本库间进行同步时采用的网络协议。

* 原子提交性(Atomic commit):描述了在提交更改时,能否保证所有更改要么全部提交或合并,要么不会发生任何改变。

* 部分克隆(Partial checkout/clone):是否支持只拷贝版本库中特定的子目录。

SVN用法介绍

先上资源:

  1. 主页: http://subversion.apache.org/
  2. 书籍:Version control with subversion = 使用Subversion进行版本控制 TP311.52 P637V2 RP. 2009
  3. 一个不错的使用教程,有详细的操作步骤和截图: http://www.cnblogs.com/armyfai/p/3985660.html

SVN是一个开源项目,只提供代码,并不提供可执行程序。程序由第三方提供,像Windows平台上有TortoiseSVN,VisualSVN,一般会提供GUI管理界面,都会提供命令行程序(注意安装时可能需要勾选)。参考wiki上各种终端的比较: https://en.wikipedia.org/wiki/Comparison_of_Subversion_clients

可以混合使用多个终端。这里只介绍TortoiseSVN和VisualSVN。

  • TortoiseSVN。首页: https://tortoisesvn.net/ 。免费软件,集成在Explorer右键菜单,使用方便,功能强大,应用广泛。
  • VisualSVN。首页: https://www.visualsvn.com。 企业版收费,简化版免费,SVN服务器端的GUI管理界面比较友好,提供VS集成插件。

可以同时使用两个终端,比如服务器端使用VisualSVN,客户端使用TortoiseSVN,这时候要注意版本兼容性。当然使用TortoiseSVN也完全可以应付服务器端的要求。

由于各个终端只是SVN的包装,甚至只是提供一个GUI,方便使用,所以功能相似。这里介绍一些命令行的使用方法,终端有相应的GUI选项。

命令格式

svn <subcommand> [options] [args]

  1. 子命令subcommand,指的是svn提供的一些功能,比如import、checkout。
  2. 选项options,有长选项和短选项(也就是缩略形式),长选项用两个短横,短选项用一个短横。有一些选项对所有子命令有效,作为全局选项。代码管理 – SVN

常用命令

    1. 创建版本仓库:svnadmin create repos
    2. 查看命令帮助:Svn help import
    3. 往仓库中导入文件:svn import /tmp/myproject file:///var/svn/repos/myproject \ -m "initial import"
    4. 从仓库签出文件:svn checkout file:///var/svn/repos/myproject/trunk myproject
    5. 比较改动:svn diff
    6. 提交改动:svn commit
    7. 从仓库更新到本地:svn update
    8. 查看仓库内容:svn list
    9. 查看工作副本working copy的状态:svn status。使用-v选项可以看到详细信息
    10. copy或move文件: svn copy;svn move
    11. 从仓库导出文件,只是导出,不会有.svn目录,也就是不会用svn管理:svn export
    12. 状态恢复:svn cleanup。svn为了保证操作的原子性,在改动working copy的状态(.svn目录下的信息)会先写logfile,然后执行,执行完后删除logfile,这样在意外中断后可以通过执行logfile恢复。执行svn cleanup会执行中断的logfile,保证working copy的状态是一致的。当出现不一致的时候,提交、或者查看状态时会看到部分working copy的状态是“locked”。
      代码管理 – SVN

svn目录。在工作副本的每个目录下都有一个隐藏的.svn文件夹,里面有svn进行版本管理的信息,比如工作副本的版本。不要改动这个目录,如果不小心破坏了这个目录,可以删除对应的目录,在上级目录重新签出checkout。

代码管理 – SVN

  1. 改变working copy的src url。为了避免和别人的改动相互影响,我们会创建一个主干的分支,然后在分支上工作,这时候我们可能会把本地的working copy的url从主干切换为分支,这样本地修改提交到分支。svn switch

分支branch与合并merge

合并分支到主干上

比如我现在对branch分支上新增3.txt文件,然后提交上去,如下所示:

代码管理 – SVN

我现在想把分支上的代码3.txt合并到主干上trunk,现在要怎么合并呢?步骤如下:

1. 回到我们刚刚的主干(trunk)文件夹下,鼠标右键该文件夹 --> TortoiseSVN --> Merge 如下图所示:

代码管理 – SVN

在弹出的窗口,如下图所示:

代码管理 – SVN

接着点击【Next】下一步,如下图所示:

注意这里的From填的是主干的url。这里的From、To的意思是选择合并的版本范围,也就是将主干head版本后到分支head版本之间的改动合并,然后放到Working copy下。不是将From版本合并到To版本的意思。

代码管理 – SVN

再接着【Next】下一步,如下图所示:

代码管理 – SVN

代码管理 – SVN

就可以看到主干trunk上多加了一个3.txt,就是从分支上合并过来的。

上一篇:JVM工具jcmd实践


下一篇:20165318 2017-2018-2《Java程序设计》课程总结