@TOC
SVN简介
SVN的作用:
- 备份
- 代码还原
- 协同修改
- 多版本项目文件管理
- 追溯问题代码的编写人和编写时间
- 权限控制
版本控制SVN简介:
- 版本控制[Revision control],最初来源于工程设计领域,是维护工程蓝图的标准做法,能追踪工程蓝图从诞生一直到定案的过程。是一种记录若干文件内容变化, 以便将来查阅特定版本修订情况的系统。
- Subversion 就是一款实现版本控制的工具软件,通常也称为版本控制器,简称 SVN。 Subversion 是 Apache软件基金会组织下的一个项目。
- Subversion 的优良特性 ①目录版本控制:CVS 只能追踪单个文件的历史,但是 Subversion 实现了一个“虚拟”文件系统,可以追踪整个目录树的修改,文件和目录都是版本控制的,结果就是可以在客户端对文件和目录执行移动和复制命令。 ②原子提交:提交要么完全进入版本库,要么一点都没有,这允许开发者以一个逻辑块提交修改。 ③版本控制的元数据:每个文件和目录都有一组附加的“属性”,你可以发明和保存任意的键/值对,属性也会像文件内容一样被纳入版本控制。 ④可选的网络层:Subversion 在版本库访问方面有一个抽象概念,利于人们去实现新的网络机制,Subversion 的“高级”服务器是 Apache 网络服务器的一个模块,使用 HTTP 的变种协议 WebDAV/DeltaV 通讯,这给了 Subversion 在稳定性和交互性方面很大的好处,可以直接使用服务器的特性,例如认证、授权、传输压缩和版本库浏览等等。也有一个轻型的,单独运行的 Subversion 服务器,这个服务器使用自己的协议,可以轻松的用 SSH 封装。 ⑤一致的数据处理:Subversion 使用二进制文件差异算法展现文件的区别,对于文本(人类可读)和二进制(人类不可读)文件具备一致的操作方式,两种类型的文件都压缩存放在版本库中,差异在网络上双向传递。 ⑥高效的分支和标签:分支与标签的代价不与工程的大小成比例,Subversion 建立分支与标签时只是复制项目,使用了一种类似于硬链接的机制,因而这类操作通常只会花费很少并且相对固定的时间,以及很小的版本库空间。
SVN 的工作原理:
-
采取客户端/服务器模式——在服务器的版本库中保存项目文件的各个版本,所有参与协同开发的程序员在自己本地电脑上保存一个工作副本。
-
SVN支持程序员将本地副本更新到服务器端的最新版本,也支持将本地副本的最新改变更新到服务器端,而且后面的更新不会覆盖前面的更新,而是作为一个新的版本被保存下来——SVN甚至支持将本地工作副本恢复为服务器端保存的某一个历史版本。
SVN 基本操作:
- ①检出(checkout):将一个服务器端创建好的项目整个下载到本地,这是到项目 组后参与开发的第一步,只需执行一次。
- ②更新(update):将本地文件更新为服务器端的最新版本,通常为每天上班时或修改公共文件之前执行一次。
- ③提交(commit):将本地修改提交到服务器端。通常每天下班前或每实现一个 功能、完成一个模块时执行一次。
Subversion 安装与配置:
- 安装服务器端程序:
①安装程序会自动配置 Path 环境变量
D:\DevInstall\Subversion\bin所以 bin 目录下的可执行文件可以在任意目录下运行。 ②验证是否安装成功 在命令行输入:svn --version看到如下信息就表示服务器端程序安装成功
配置版本库:
- 为什么要配置版本库?
①Subversion 是将文件数据信息保存到版本库中进行管理的,为了满足用户的不同需求,Subversion 允许用户对版本库目录进行定制。
②在一个非中文无空格目录下创建一个文件夹,作为版本库的根目录。
例如:D:\DevRepository\Subversion③在版本库根目录下创建与具体项目对应的子目录——这样做的目的是使一个SVN 服务器能够同时管理多个项目,而不是为每一个项目搭建一个 SVN 服务器— —这显然太浪费资源了。例如:D:\DevRepository\Subversion\CRMD:\DevRepository\Subversion\ERPD:\DevRepository\Subversion\OA④创建版本库 命令格式⑤版本库目录结构 版本库创建成功后会在指定目录下产生如下的目录结构
SVN服务
启动服务器端程序:
- SVN 服务器必须处于运行状态才能响应客户端请求,帮助我们管理项目文件。 所以我们必须将 SVN 服务器启动起来。启动 SVN服务器有两种方法。
①
一个是命令行方式。②一个是注册 Windows 服务。 - 命令行方式:
①命令格式
②验证服务是否启动:SVN 服务监听 3690 端口,打开一个新的 cmd 窗口,使用 netstat -an 命令查看
3690端口是否被监听。③命令行方式的缺陷是:只要运行服务器端程序的命令行窗口一关闭,服务就停止了,很不方便,而且每次开机都需要手动启动。
- 注册 Windows 服务
①将SVN 服务端程序注册为 Windows 服务,就可以让SVN 服务随系统一起启动,克服了命令行方式的不足。
②注册 Windows 服务需要利用 XP、2000 以上系统自带工具 Service Control,执行文件是 sc.exe,注意这个命令不是 SVN 的命令。
③命令格式:
④binpath 组成结构说明:
⑤关于“版本库目录”:
⑥最终命令举例:
⑦注意:此时查看当前系统中的服务,可以看到我们刚刚创建的服务,但此时它还没有 启动,如果创建失败,需检查 sc 命令是否正确。 ⑧启动此服务,启动服务的命令格式如下:
⑨打开命令行窗口运行 netstat –an 查看 3690 端口是否被监听 1、如果启动失败,那很有可能是 binpath 中的内容有错误,此时只能将已经创建 的服务删除,重新创建。 2、删除服务之前,最好先停止服务。停止服务的命令格式如下:
3、删除服务的命令格式如下::
⑩
创建,删除、启动、停止服务需要管理员权限。
操作 SVN 服务器主要有以下几种方式:
-
Subversion 服务器安装后自带命令行客户端,如下图所示,为安装目录的 bin 目录中的 svn.exe 程序,本文就是讲这种方式。 -
如 Eclipse、MyEclipse、IDEA 等 Java 编辑器本身可以集成 SVN 插件进行操作 SVN 服务器。 -
使用图形化的 SVN 客户端,如同使用 Mysql 数据库一样,也很少会在命令行中使用 SQl,也是使用的图像化客户端,SVN的图像化客户端通常使用的是 TortoiseSVN。
SVN命令行基本操作
使用命令行模式访问 SVN 服务器:
-
检出 ①首先进入自己的工作目录,例如:D:\DevWorkSpace\SVNSpace ②运行 svn checkout 命令,命令格式如下
③
工作副本运行 checkout 命令后进入 MyERP 目录,看到里面什么都没有。真的什么都没有 吗?不是的。检出命令会在这一目录下创建一个隐藏目录.svn,用来保存与服务 器交互的重要信息,其中包括从服务器端取回的最新版本信息、文件状态、更新 时间等。SVN 正是以此为依据判断当前目录中文件的状态。所以这个隐藏目录千 万不要删除或修改其中的内容——完全无视它的存在吧。如果服务器端保存的文 件可以视为一个“正本”,那么每个开发人员检出到本地目录的文件可以视为“副 本”,通常称为工作副本。 -
提交 ①进入 D:\DevWorkSpace\SVNSpace\MyERP 目录 ②创建一个文件 test.txt ③执行 svn commit 命令,运行结果是
说明一个文件必须纳入版本控制才可以提交到服务器端。④执行 svn add 命令,将 test.txt 纳入版本控制⑤再次执行 svn commit 命令
此时要求附加日志信息⑥使用-m 参数附加日志信息原因是没有权限⑦暂时先开启匿名访问权限 [1]进入对应的版本库目录下的 conf 目录:D:\DevRepository\Subversion\ERP\conf [2]打开 svnserve.conf [3]将第 19 行的# anon-access = read改为anon-access = write,也就是去掉“# ”, 将 read 改为 write。注意前面不要留空格,一定要顶格写。 [4]不需要重启 SVN 服务,甚至命令行窗口都不需要重新打开。 ⑧重新执行提交命令说明提交成功了。⑨其实 svn commit 命令最后可以不指定具体文件,此时表示提交当前工作副本中的所有修改。 -
更新 ①将服务器端文件检出到一个新的目录,模拟另外一个终端
②回到 MyERP 目录,对 test.txt 文件修改后提交。 ③进入 TomERP 目录 ④执行 svn update 命令
这样我们就可以在 TomERP 目录下看到 MyERP 目录下提交的修改。 ⑤思考:更新和检出的相同点和不同点分别是什么?
工作副本中文件的几种状态:
- 没有修改,现行版本 本档案在工作目录中没有被修改,而且自当前版本之后,其他终端也没有任何该文件的修改被提交到服务器,即当前工作副本的版本和服务器端最新版本是一致的。对它执行 svn commit 和 svn update 都不会发生任何事。
- 本地修改, 现行版本 这个文件被修改过,但这个修改还没有提交到服务器,而且自当前版本之后,其他终端也没有任何该文件的修改被提交到服务器,所以当前工作副本的版本和服务器端最新版本仍然是一致的。由于有尚未送交回去的本地修改,所以对它的svn commit 会成功提交你的修改,而 svn update 则不会作任何事。
- 没有修改,过时版本 这个文件没有修改,但是版本库中有其他终端提交的修改。此时当前工作副本的版本比服务器端的版本落后了,我们称之为“过时”。对当前文件的 svn commit 不会发生任何事,而 svn update 会让工作目录中的文件更新至最新版本。
- 本地修改,过时版本 ①服务器端存在没有更新到本地的修改,导致当前版本过时。如果这个文件在本地有未提交的修改,则无法提交,对它执行 svn commit 会产生“out-of-date”错误。 ②此时应该先尝试更新本地文件。更新时 SVN 会尝试将服务器端的更新与本地文件进行合并,合并的结果有两种可能:一个是服务器端和本地修改位于文件的不同位置,合并成功;另一个是服务器端的修改正好和本地修改位于同一个位置,发生冲突。
将工作副本整体回复到某一个历史版本:
- 假设当前版本为 12,想要取回版本 9
- 执行 svn update 命令
- 这里需要注意的是,SVN 版本号并不是对某一个文件进行编号,而是对应整个版本库总体状态的一个“快照”,取回某个版本不是取回版本号对应的某个文件, 而是整个项目的一个快照。
将某个文件恢复到某个版本中的状态,同时不涉及其他文件:
- 假设想要取回 pp.txt 在版本 10 时的状态
- 执行 svn update 命令
- ③综合这两个例子,我们可以认为版本号和文件名构成了一个横纵坐标系,通过文件路径和版本号定位其在某一个时刻的状态。
SVN命令行权限控制
单一版本库权限配置:
- 匿名访问:前已述及。
- 授权访问
①要设置授权访问就需要创建用户,并为用户设定权限
②打开授权访问的配置
[1]打开 D:\DevRepository\Subversion\ERP\conf\svnserve.conf
[2]将第 19 行 anon-access = write 注释掉:# anon-access = write
表明该版本库不接受匿名访问[3]将第 20 行# auth-access = write 注释打开:auth-access = write表明该版本库使用授权访问[4]将第 27 行注释打开:password-db = passwd表明使用同目录下的 passwd 文件保存用户信息[5]将第 36 行注释打开:authz-db = authz表明使用同目录下的 authz 文件保存权限信息[6]打开 passwd 文件创建用户[7]打开 authz 文件:#后面注释的是例子 <1>创建用户组
<2>指定路径,给用户和用户组授权
<3>权限的继承性:父目录设置的权限,对子目录同样有效——除非子目录进行了更为具体的设定
这个例子表示当前版本库下的 subDir 目录只有 userOther 有读写权限,其它用户无任何权限
多版本库共享配置:
- 在版本库根目录 D:\DevRepository\Subversion 下创建 commConf 目录
- 将未修改的 authz 和 passwd 文件拷贝到 commConf 目录下
- 修改需要设置权限的版本库的 svnserve.conf 文件 ①password-db = ../../commConf/passwd ②authz-db = ../../commConf/authz
- 在 password 中创建用户
- 在 authz 中针对不同版本库为不同用户授予权限
SVN命令行其他操作
查看工作副本信息:
- 使用 svn info 命令
- 执行效果如下
- 对某一个文件使用 svn info 命令
查看目录或文件日志信息:
- 使用 svn log 命令
[
注意:使用这个命令的前提是设置匿名访问为 none,即:anon-access = none,否则会出现“svn: E220001: 条目不可读”错误] - 执行效果如下
SVN命令之清理命令(clean up)的功能及使用技巧:
-
当SVN改变你的工作拷贝(或是.svn中的任何信息),它会尽可能的小心。在进行任何修改操作时,SVN都会把日志记录到日志文件中,然后执行log文件中的命令,
-
并且执行过程中在工作拷贝的相关部分保存一个锁,防止SVN客户端在变更过程中访问工作拷贝。如果SVN的操作中断了(举个例子:进程被杀死了,机器死掉了),日志文件会保存在硬盘上。通过执行日志文件,SVN可以完成上一次没有完成的操作,你的工作拷贝可以回到一致的状态。
-
这就是svn cleanup命令的功能:它查找工作拷贝中的所有遗留的日志文件,删除进程中工作拷贝的锁。如果SVN告诉你工作拷贝中的一部分已经“锁定”了,你就需要运行这个命令了。
-
本地文件锁定,使用“清除”命令: ①SVN本地更新时,由于一些操作中断,如磁盘空间不够,用户取消等,可能会造成本地文件被锁定的情况。这时候无论你在执行SVN的更新、提交等子命令都会提示“**locked”的错误。一般出现这种情况的解决方法: 1.可以使用SVN clean up来清除锁定。 2.如果不是本目录锁定,系统提示上一层目录锁定,需要到上一层或者根目录中清除。 3.如果在根目录下都无法clean的话,一般采取的方法是另外找一个目录重新CHECKOUT。但有时SVN目录下可能有一些自己本地修改的文件,还未提交到SVN服务器,这时重新CHECKOUT需要注意本地文件的备份,并且不要强制覆盖服务器上其它人修改的内容。 4.其实SVN加锁会在.SVN(隐藏文件)中生成一个名字叫lock的文件(无后缀),查找所有的,手工删除。然后再尝试更新,系统可能会提示某个.base文件无法访问。 找到它,把相关的文件或其所在的目录删除,重新UPDATE。 5.在相应的目录中,比如我在更新metasploit的“/opt/metasploit3/msf3/lib/active_support/core_ext”这个目录时就遇到了类似的情况,把.SVN子目录(注意,“.”目录是个隐藏目录,需要选择“文件夹选项”→“查看”→“显示隐藏文件”菜单项)里面log文件删除,就可以了。然后继续做svn cleanup命令。
编译器中SVN的应用
注意:
在IDEA或Ecplise中使用SVN(下面以Ecplise举例):
- 检出
①检出分两种情况
<1>从服务器端获取到的是一些零散的文件,不能作为项目检出,此时会弹出一个新建项目向导,之所以会这样是因为我们需要创建一个项目来保存从服务器端取回的文件。
<2>从服务器端获取到的是一个完整的项目,此时必须作为项目检出。
项目从服务器检出后,会成为一个工作副本,根目录下会自动创建.svn 隐藏目录。 - 提交 ①新创建文件后,文件图标上会以“?”标识,表示该文件尚未纳入版本控制。 ②在新创建的文件上点右键→Team→添加至版本控制,这样文件图标上会显示“+”,表示当前文件已纳入版本控制,但还未提交至服务器。 ③在要提交的文件上点右键→Team→提交...会提交文件,在弹出的对话框中可以不填写日志。文件提交后,图标会变为“金色的圆柱体”表示当前文件的版本和服务器端一致。 ④文件修改后图标会变为“*”,表示当前文件或目录包含未提交的修改。
- 更新 ①更新整个项目时可以在项目上点右键→Team→更新 ②更新某个具体的文件时,可以在文件上点右键→Team→更新
- 共享项目 ①在 Eclipse 中创建的新项目想要发布到 SVN 服务器端,可以通过“共享”项目实现 ②在项目上点右键→Team→Share Project...→选择一种版本控制工具
- 回复历史版本
①在需要回复的文件上点右键→Team→显示资源历史记录→得到如下界面
②选择某一个历史记录点右键→获取内容。文件就会恢复到指定版本的状态,同
时图标变为“*”。
③获取历史记录时,如果出现如下错误提示
可以通过将对应版本库中的 svnserve.conf 文件中的 anon-access 设置为 none 解决。
- 解决冲突
①什么情况下会发生冲突
②更新操作的两种可能: (1)A所做的修改与 B不是同一个位置,更新操作尝试合并文件成功。 (2)A所做的修改与 B恰好是同一个位置,更新操作尝试合并文件失败。 ③根据需要和实际情况将本地内容更正——这个过程很可能需要牵涉冲突的两位开发人员进行必要的沟通——机器与程序目前还不能完全取代人工智能。
Idea集成SVN:
- 安装TortoiseSVN时勾选command line client tools。
- IDEA 配置:
①安装成功后,需要在IDEA中配置下,file - setting 按钮打开设置界面 或者(Ctrl + Alt + S)快捷键,选择TortoiseSVN安装路径下的bin/svn.exe,如果没有安装command line client tools,是找不到该文件路径的。
TortoiseSVN
简介:
- TortoiseSVN 是一个 Windows 下的版本控制系统 Apache™ Subversion®的客户端工具。
TortoiseSVN 的优良特性:
- 外壳集成 :TortoiseSVN 无缝地整合进 Windows 的外壳(例如资源管理器)。
- 重载图标:每个版本控制的文件和目录的状态使用小的重载图标表示,可以让你立刻看 出工作副本的状态。
- 图形用户界面:当你列出文件或文件夹的更改时,你可以点击任意版本查看提交注释。也可以看到更改过的文件列表 - 只要双击文件就可以查看更改内容。提交对话框列出了本次提交将要包括的条目,每一个条目有一个复选框,所以你可以选择包括哪些条目。未版本控制的文件也会被列出,以防你忘记添加新文件。
- Subversion 命令的简便访问:所有的 Subversion 命令存在于资源管理器的右键菜单,TortoiseSVN 在那里添加子菜单。
TortoiseSVN 的历史:
-
2002 年,Tim Kemp 发现 Subversion 是一个非常好的版本管理系统,但是缺 乏一个好的图形界面客户端程序。做一个与Windows 外壳整合的 Subversion 客 户端程序的想法是受一个叫 TortoiseCVS 的 CVS客户端程序所启发的。Tim 研究 了 TortoiseCVS 的源码并以此为 TortoiseSVN 的基础。他开始运作这个项目,注册了域名 tortoisesvn.org 并且将源码放在了网上。就在同时, Stefan Küng 正在寻找一个好用的并且免费的版本控制系统。他找到了 Subversion 和 TortoiseSVN 的源码。因为 TortoiseSVN 还不能使用,他加入了项目并开始编码。很快,他就重写了现有的大部分代码并开始添加命令和功 能,到了某个时段,最初的代码已经都被改写了。
-
由于 Subversion 变得越来越稳定,它吸引了越来越多用户,他们同时也开 始使用 TortoiseSVN 作为 Subversion的客户端程序。用户数量快速增长(并且每 天还在增长)。这时候,Lübbe Onken 提出帮助项目提供精美的图标和 TortoiseSVN的标志。现在他负责照看网站和管理多语言翻译。
TortoiseSVN 安装:
TortoiseSVN 具体操作:
-
检出 ①创建一个目录用来存放检出得到的文件,例如 MyCRM ②进入目录 MyCRM,点右键SVN Checkout 注意:此时文件图标上没有任何标识。可能你会想到通过重启电脑的方式解决这一问题 ——其实不用这么麻烦。
文件图标是受外壳程序控制的,我们只需要重启外壳程序——explorer.exe 就可以了。打开任务管理器,选中 explorer.exe 进程,结束进程,然后新建进程 explorer.exe 就可以了。③如果一切顺利的话,你会看到文件图标变成了这样:
④TortoiseSVN 图标含义:
-
纳入版本控制 ①新建文件 abc.txt ②在文件上点右键
③添加后文件图标发生变化
-
提交 ①使用 TortoiseSVN 可以提交具体某一个文件,或某一个目录下的所有改变。方法就是在想要提交的项目下点右键,然后 SVN Commit...,就可以看到如下界面
-
更新 ①在要更新的文件或目录上点右键→SVN Update
-
回复历史版本 ①查看历史版本内容 [1]首先需要把对应版本库的匿名访问权限设置为 none:anon-access = none [2]在要查看历史版本的文件上点右键→TortoiseSVN→Show log [3]在感兴趣的历史版本上点右键,可以与当前工作副本进行比较,或直接打开。 ②在要回复历史版本的文件上点右键→Update to revision
填上想要回到的版本即可
-
解决冲突 ①文件发生冲突时的状态和在 Eclipse 中一样,这里就不赘述了。 ②在冲突的文件上点右键→Edit Conflicts
SVN客户端--TortoiseSVN使用说明:
SVN分支和主干
简介:
Trunk: 主干代码 (用于新功能的开发) ①SVN中的Trunk是放置稳定代码的主要环境,就好像一个汽车工厂,负责将成品的汽车零件组装在一起。Branch: 分支代码(用于解决项目路径中产生的bug) ①SVN中的branch就是从一个SVN主干(or branch)中分离出来一颗子树(内容与主干中的一样),然后对子树进行开发,等到开发完,且该子树版本相对稳定后,合并到主干中。也就是说:如果原来是从trunk中拷贝的,就应该回到trunk去,或者合并回它原来拷贝的父级branch。Tags: 版本标记(测试通过后上线的版本记录) ①SVN中的Tags。从表面上看,branches和tags其实没有什么差别,但是从概念上来说,它们有许多差别。其实一个tags就是:一个trunk或者一个branch修订版的命名“快照”。- 详细链接:SVN分支与合并