作者:东风化宇 

# SVN工作原理


SVN(SubVersion)的基本工作思路是这样的: 在一台服务器上建立一个源代码库,库里可以存放许多不同项目的源程序,由源代码库管理员统一管理这些源程序。 每个用户在使用源代码库之前,首先要把源代码库里的项目文件下载到本地(Checkout),然后用户可以在本地任意修改,最后用svn命令进行提交(Commit),由svn源代码库统一管理修改。 如下图:

centos7安装svn 修改端口_eclipse svn插件


SVN服务器:

运行SubVersion服务的计算机,SubVersion支持Linux和Windows,更多的是安装在Linux下。 SVN提供服务有两种方式(运行方式): 独立服务器和借助Apache服务器,分别使用SVN协议和Http协议。 SVN客户端:

用户通过SVN客户端同SVN服务器打交道,SVN客户端分为命令行工具和图形化工具。 最流行的客户端是TortoiseSVN。 也可以在Eclipse中使用SVN插件。

centos7安装svn 修改端口_centos7安装svn 修改端口_02


# SubVersion的使用

可以在http://subversion.apache.org/packages.html下载SVN并安装(本文使用windows版本,过程不多说)。 在SVN中集成了服务器端和客户端组件: 服务器组件(管理员用): svnadmin、svnserve 客户端组件(程序员用): svn 这些组件命令都位于SubVersion安装目录下的bin目录下。 友情提示: 安装完SVN后,通过”svnadmin –version”验证是否安装成功。 如果出现错误“svnadmin不是内部或外部命令”,则需要手动将SVN的bin目录加入到path环境变量下。 1、创建SVN仓库 1.1先创建一个目录: E:\svnrepo\repoDemo1。 后面就使用该目录作为SVN仓库。 1.2创建仓库: svnadmin create E:\svnrepo\repoDemo1。 创建仓库后的目录结构如下:.

centos7安装svn 修改端口_eclipse svn插件_03


1.3启动SVN服务: svnserve -d -r E:\svnrepo\repoDemo1,如下图:

centos7安装svn 修改端口_centos7安装svn 修改端口_04


这样就启动了repoDemo1这个仓库的服务(单仓库),如果在svnrepo目录下还有其他仓库,且要同时启动多个仓库,执行svnserve -d -r E:\svnrepo即可(多仓库)。 一般情况下,访问SVN仓库的URL格式形如: svn://192.168.1.6/repoDemo1,但如果启动的是单仓库,则URL直接用: svn://192.168.1.6表示。 svn协议的默认端口号为3690。 小技巧: 如果需要频繁使用该仓库,则可将该SVN服务注册成windows服务,这样在计算机开机时就可以启动该服务。 如下图:

centos7安装svn 修改端口_eclipse svn插件_05


删除该windows服务: sc delete svnService。 2、SVN客户端操作(命令行) 重点:checkout(检出)、commit(提交)、update(更新)

1.1在E盘下建立user1、user2两个目录,模拟两个协同工作的用户的workspace。 1.2检出: 第一次和SVN服务器交互时,需要使用checkout将仓库检出到本地。

centos7安装svn 修改端口_centos7安装svn 修改端口_06


说明: 检出一次,就建立了与SVN仓库的连接。 1.3 提交: commit 在user1目录下新建Demo1.java文件,将该文件提交到SVN仓库。 下图演示了三种典型的错误提交。

centos7安装svn 修改端口_eclipse svn插件_07


1.4更新: update 切换到user2的工作空间(user2目录下),user2第一次使用SVN仓库,需要检出。 user2修改Demo1.java后提交。 切换到user1目录,更新(update)。

centos7安装svn 修改端口_eclipse svn插件_08


1.5删除与恢复: delete、revert

centos7安装svn 修改端口_centos7上的图形化界面svn客户端_09


说明: 如果delete后,提交到服务器(commit),则服务器上的数据也被删除了(慎用)。

# SVN的目录约定


/trunck: 开发主线 /branches: 支线副本 /tags: 标签副本(一旦创建,不允许修改) 1.1 使用trunk作为主要的开发目录 一般的,我们的所有的开发都是基于trunk进行开发,当一个版本(release)开发告一段落(开发、测试、文档、制作安装程序、打包等结束后),代码处于冻结状态(人为规定,可以通过hook来进行管理)。 此时应该基于当前冻结的代码库,打tag。 当下一个版本/阶段的开发任务开始时,继续在trunk进行开发。 此时,如果发现了上一个已发行版本(Released Version)有一些bug,或者一些很急迫的功能要求,而正在开发的版本(Developing Version)无法满足时间要求,这时候就需要在上一个版本上进行修改了。 解决方法是基于发行版对应的tag,做相应的分支(branch)进行开发。 1.2下图为struts2的SVN仓库目录:

centos7安装svn 修改端口_eclipse svn菜单_10


现在Struts2的代码使用git管理,所以现在查看Struts2的SVN仓库是空的。

# TortoiseSVN的使用


TortoiseSVN是现在最流行的SVN客户端工具,使用图形化界面和SVN仓库交互(作为命令行方式的替代)。 关于TortoiseSVN的安装省略。 安装完成后,在任意位置右击都能看到TortoiseSVN选项。 1、基本操作 1.1创建仓库 创建目录: E:\svnrepo\repoDemo2,进入该目录下,右击 — TortoiseSVN — Create repository here,并创建默认的SVN目录结构,如下图所示:

centos7安装svn 修改端口_eclipse svn插件_11


1.2 检出: checkout 在E盘下建立user3、user4两个目录,模拟两个协同工作的用户的workspace。 进入user3目录下,右击 — SVN Checkout,在URL of repository中输入: file:///E:/svnrepo/repoDemo2。 【此时仓库还没有启动SVN服务,所以使用file://】

centos7安装svn 修改端口_centos7安装svn 修改端口_12


1.3提交: commit 在user3/trunk目录下新建Demo1.java,在该文件上右击 — TortoiseSVN — add,则将Demo1.java纳入版本控制。 然后右击 — SVN Commit,提交至代码仓库。 1.4 更新: update 对user4进行上面的检出操作。 并修改user4目录下的Demo1.java(如增加一个字段),并commit。 回到user3/trunk,右击 — SVN Update。 1.5 启动SVN服务。 这步需要在命令行中输入: svnserve -d -r E:\svnrepo 1.6 访问SVN仓库。 在任意空白位置右击 — TortoiseSVN — Repo browser,URL输入: svn://192.168.1.6/repoDemo2即可浏览SVN仓库中的内容,如下。

centos7安装svn 修改端口_eclipse svn菜单_13


2、其他操作 下面的操作都位于右键菜单的TortoiseSVN中。 2.1 删除: delete 删除文件或目录,不能直接用Windows的删除命令来操作,那样只是没有显示出来,实际并没有删除,在更新后,删除的文件又会被更新出来的。 要想从库中删除,必须选中你要删除的内容,TortoiseSVN — delete,这样才会将这个文件标记成要删除的。 确认需要删除后,使用前面所讲的提交命令,就会真正的在库中删除了。 2.2 重命名: rename 重命名也不能直接用Windows的重命名命令来操作,必须选中你要重命名的文件,TortoiseSVN — rename。 修改后提交就可以更新到仓库。 改名的处理方式相当于新增了一个以新名称命名的文件,原名称命名的文件进行了删除。 2.3 还原: revert 在未提交之前,你对前面做的操作反悔了,可以使用revert来恢复。 2.4 检查更新: Check for modifications ① 此功能可以显示你所做的修改有哪些还没有提交的。 ② 还可以看到版本库里的改动,即别人提交了哪些文件的改动,你还没更新到本地。 2.5 导出: export 使用SVN的工作空间每个目录下面都有一个.svn隐藏目录,利用SVN的export命令可轻松地导出不含.svn目录的工作空间。 3、冲突问题的解决(☆) 何时发生: 接着4.1节中的操作,假设user3和user4目录下的Demo1.java都更新到了最新版本。 user3修改Demo1.java,提交至仓库。 若user4也修改Demo1.java并提交,此时user4的TortoiseSVN会报提交版本过时的错误,并提醒user4需要更新,更新时就会发生冲突。 如下图:

centos7安装svn 修改端口_eclipse svn插件_14


对于每个更新冲突的文件,Subversion会在冲突文件所在目录下放置了三个文件: Demo1.java.mine: 发生冲突时的本地版本。 Demo1.java.r3: 最后更新之后的本地版本。 Demo1.java.r4: 仓库中的最新版本。 解决方法 1:

① 在Demo1.java上右击 — TortoiseSVN — Edit conflicts,这时你需要确定哪些代码是需要的,做一些必要的修改然后保存。 小技巧: 编辑冲突时,可使用直接复制需要的代码到Merged窗口即可。 ② 编辑完成后保存,直接选择Mark as resolved,即标记为冲突已解决。 退出编辑冲突窗口,发现冲突发生时生成的三个文件被自动删除了,且Demo1.java变成了未提交状态。

centos7安装svn 修改端口_centos7安装svn 修改端口_15


③ commit,OK。 解决方法 2:

直接修改Demo1.java,把其中的一些标记删除即可(前提是服务器上的和本地的内容都需要保存)。 4、TortoiseSVN图标

centos7安装svn 修改端口_eclipse 安装svn_16


部分图标的说明: normal: 状态正常 modified: 对本地的副本做了修改,需要提交到服务器 conflicted: 有冲突 readonly: 文件是只读的,要修改必须先获取锁 locked: 获得锁 deleted: 计划从版本库中删除 added: 已被计划纳入版本控制 non-versioned: 未纳入版本控制 5、认证与授权 所谓认证(Authentication),就是给使用该仓库的用户分配一个用户名和密码,用户在连接仓库的时候需要输入用户名/密码。 授权(Authorization)就是为指定用户分配特定的权限,如只读、读写等。 认证与授权的设置需要修改仓库conf目录下的文件,如下: authz: 认证文件,分配用户名、密码。 passwd: 授权文件,为现有用户分配组,并为组分配权限。 svnserve.conf: 指定认证、授权文件的位置。 5.1 修改conf/svnserve.conf

centos7安装svn 修改端口_centos7上的图形化界面svn客户端_17


5.2 修改conf/passwd

centos7安装svn 修改端口_eclipse 安装svn_18


5.3 修改conf/authz

centos7安装svn 修改端口_eclipse svn菜单_19


这样,当用户再次执行checkout、commit、update时,就会要求认证。

# subclipse插件的使用


Eclipse提供了集成SVN的插件 — subclipse,本文重点关注subclipse的使用。 Eclipse中插件的安装不是这儿的重点。 安装成功后,可以看到下面的视图(Windows — Show View)和透视图(Windows — Open Perspective):

centos7安装svn 修改端口_eclipse svn菜单_20


下面的操作使用了4.1节中的资源库(repoDemo2)。 1.关联资源库 进入SVN资源库研究透视图,在SVN资源库面板上右键 — 新建 — 资源库位置,URL中输入: svn://192.168.1.6/repoDemo2。 2.共享项目: share Project 新建一个Java Project,名称为svnProject,在项目中新建一个Demo1.java。 共享项目: 在项目上右键 — Team — Share Project…,将项目导入到repoDemo2。 在输入文件夹名时,一般选择使用项目名称作为文件夹名。 3.提交: Commit 共享之后,项目并没有提交到仓库中,此时在项目上右键 — Team — Commit,就可以将现在的项目提交到仓库中。 4.检出: Checkout 新建一个workspace,模拟另外一个用户(user2)。 首先还是关联资源库,在svnProject上右键 — 检出为。

centos7安装svn 修改端口_eclipse svn插件_21


在Demo1.java中新增一个字段并提交(在user2的workspace中做的)。 5.更新: 切换到user1的工作空间,更新项目。 不多说,Team — update 6.冲突处理 冲突的产生见4.3节。 原则: 提交之前先更新。 4.3节中的两种解决方法也适用于subclipse,解决方法1对应着subclipse中的Synchronize视图(View),解决方法2类同。

# SVN与Apache整合(用到再看)


业务场景: 在上面的Demo中,SVN仓库对外提供服务都是通过SVN协议,最直观的体现就是URL都是以svn://开头的。 在开源项目中使用的SVN仓库对外提供服务时都是使用http协议,此时需要结合Apache服务器。 1.安装Apache服务器(假定安装在C:\Apache2.2) 2.修改C:\Apache2.2\conf\httpd.conf释放掉注释和增加红色边框的两行(有顺序要求)

centos7安装svn 修改端口_eclipse 安装svn_22


3.从SVN安装目录的bin目录下,拷贝mod_authz_svn.so和mod_dav_svn.so到C:\Apache2.2\modules目录中 4.用Apache服务器的htpasswd创建密码文件

centos7安装svn 修改端口_centos7上的图形化界面svn客户端_23


5.拷贝project1_password到E:\repository\svn\project1\conf目录下 6.拷贝以下内容到Apache\conf\httpd.conf最后

#配置虚拟目录#/svn/flyne>#引用远程访问模块DAV svn#项目版本库路径#SVNPath E:/repository/svn/project1#授权文件#AuthzSVNAccessFile E:/repository/svn/project1/conf/authz#所有用户都需要身份验证#Satisfy AnyRequire valid-user#验证方式#AuthType Basic#项目的名称#AuthName "project1"#用户文件#AuthUserFile E:/repository/svn/project1/conf/project1_password
#配置虚拟目录#
/svn/flyne>
#引用远程访问模块
DAV svn
#项目版本库路径#
SVNPath E:/repository/svn/project1
#授权文件#
AuthzSVNAccessFile E:/repository/svn/project1/conf/authz
#所有用户都需要身份验证#
Satisfy Any
Require valid-user
#验证方式#
AuthType Basic
#项目的名称#
AuthName "project1"
#用户文件#
AuthUserFile E:/repository/svn/project1/conf/project1_password



7.访问http://localhost/svn/flyne/trunk即可访问SVN仓库。 热文推荐很多老鸟都不知道这些浮点数基础知识...IDEA中创建类时,如何自动给类加注释?Visual Studio Code,这是要上天?