版本控制工具入门——SVN
本文首发于 LOGI'S BLOG,由作者转载。
SVN
全称 Subversion
,是 CVS
的替代品,在当前时间节点,与 Git
共同为软件公司采用,进行项目管理。
软件安装
主流的 SVN 服务端为 VisualSVN Server,客户端为 TortoiseSVN,以下操作都以上述软件为例。
工作流程
项目经理首先将项目初始化到 SVN 服务器
上,开发人员首次获取远程仓库使用 Checkout
命令,之后如服务器发生变更,使用 Update
命令更新代码,本地开发完成后,使用 Commit
命令提交。
—————Commit—————>| SVN Server
Project Manager <————Checkout————| svn://192.168.1.1
<————Update——————| Project Shop
| |--core.php
<————Checkout————| |--common.php
Developer <————Update——————|
—————Commit—————>|
服务端配置
初始化版本仓库
- 安装好
SVN 服务端
后,创建D://SVN/WebApp
文件夹存放所有项目 - 进入
WebApp
目录,新建Shop
目录作为当前项目仓库 -
CMD 窗口
切换到WebApp
,通过svnadmin create Shop
命令初始化版本仓库
监管仓库目录
启动监管服务后,客户端才能通过 svn://ip
访问到项目仓库。
REM 启动后台监管
REM -d(daemon) -r(repository)
svnserve -d -r D://SVN/WebApp/Shop
如有多个仓库,可监管所有项目的上级目录,此时客户端可通过 svn://ip/repo/name
访问某个仓库。
REM 启动监管
REM -d(daemon) -r(repository)
svnserve -d -r D://SVN/WebApp
使用命令监管需要保持窗口状态,不能关闭,也无法开机自启,为解决以上问题,可将其添加到 Windows Services
。具体操作为,在 CMD 中以管理员身份执行以下命令。
REM 创建服务
sc create SVNService binpath="C:\Program Files\Subvision\bin\svnserve.exe --service -r D:\SVN" start=auto
REM 开启服务
net start SVNService
REM 停止服务
net stop SVNService
REM 删除服务
sc delete SVNService
权限控制
默认情况下,SVN 服务端不允许匿名用户上传文件,为了方便调试,可对项目目录下的 conf/svnserve.conf
文件进行更改。
REM 所有用户均可读可写
anon-access = write
但在实际开发中,处于安全考虑,应该建立多个 SVN 账号,并对它们分配不同权限。具体操作为,更改项目目录下的 conf/svnserve.conf
文件,打开认证选项。
REM 禁用匿名用户访问
# anon-access = write
REM 打开认证功能
password-db = passwd
authz-db = authz
随后,更改项目目录下的 conf/passwd
文件,配置用户名和密码。
[users]
admin = admin
logi1 = 123456
logi2 = 123456
logi3 = 123456
logi4 = 123456
最后,更改项目目录下的 conf/authz
文件,配置用户分组,和各组权限。
[groups]
admin = admin
developer = logi1,logi2,logi3,logi4
# 对每个仓库单独配置
[Shop:/]
@admin = rw
@developer = r
# * 代表剩下的组,或匿名组
* = r
同步 SVN 和 WEB 服务器
为了实时预览 SVN 服务器上的文件,可将其同步到 WEB 服务器中,方便浏览器访问查看。该需求可通过 SVN 服务器提供的 钩子程序
实现。此处,我们利用项目目录下的 hooks/post-commit.tmpl
钩子,它在 commit
完成后被触发,钩子一般使用 bat
或 shell
开发。
新建 hooks/post-commit.cmd
文件,并编写以下内容。
REM Apache HTML 文件目录
SET WEB_SERVER_DIR="D:\server\apache\htdocs\shop"
REM SVN 可执行程序
SET SVN="D:\svn\bin\svn.exe"
REM 更新数据到 Apache 目录
%SVN% update %WEB_SERVER_DIR%
切换到 Apache HTML
目录,进行一次 Checkout
操作,此后,服务端一旦收到 commit
,便会触发批处理,随后便可通过浏览器预览提交。
客户端使用
客户端安装完毕后需要重启电脑加载注册表,否则 SVN 状态图标
不会显示。如需汉化,先安装汉化包,随后右键桌面空白处,依次点击 TortoiseSVN -> Settings -> General
,选择 Language
下拉框中的 中文(简体)
确定即可。
拉取服务端代码
新建项目目录并进入,空白处右键鼠标,依次进入 TortoiseSVN -> 版本库浏览器
,输入 SVN 服务器 svn://192.168.1.1
后点击确定。右键版本库中列出的仓库,选择 检出
,点击 确定
。此时,打开文件管理器的 显示隐藏文件选项
,便可看到初始化的 .svn
文件夹。
Checkout
做了两件事,首先与服务端建立连接,其次拉取最新代码。以后如需更新代码,要使用 Update
指令。
更新服务端代码和本地代码提交
更新代码使用 Update
。提交代码用 Commit
,需要说明的是 message
要根据公司规定填写,例如 模块——功能——作者
。
图标含义和忽略文件列表
右键项目目录空白处,依次进入 TortoiseSVN -> 设置 -> 图标覆盖 -> 图标集
可查看所有图标含义。
对于无需上传服务器的文件,可将其添加到忽略列表。具体操作为右键项目需要忽略的文件,依次点击 TortoiseSVN -> 增加到忽略列表
,可选择通配符形式,如 *.ppt
,如果是目录,选择 以递归方式忽略
。
版本回退
一般误删文件或新版本有重大问题时,要进行版本回退。右键项目目录空白处,依次进入 TortoiseSVN -> 更新至版本
。在 回退对话框
中点击 显示日志
,在弹出的 日志对话框
中,选择 对应提交
后确定,之后点击 回退对话框
的确定即可。
解决版本冲突
假设开发人员 A 和 B 同时拉取服务器上的同一文件进行开发,A 先于 B 提交,B 在提交时就会发送版本冲突。
此时,B 应该先 Update
,随后手动编辑文件解决冲突,可与 A 商量如何解决,最后 Commit
。
假设 index.php
发生冲突,在 Update
后会生成 4 个相关文件,分别是:
- 整合后的文件,index.php
- B 自己开发的文件,index.php.mine
- 两人都未开发前的文件:index.php.r6
- A 先开发完毕提交的文件,index.php.r7
B 只需将 index.php
中的冲突解决,随后删除其他三个文件,提交即可。冲突区域如下所示:
<<<<<<< .mine
echo 'by B'
=======
echo 'by A'
>>>>>>> .r7