MENU

版本控制工具入门——SVN

2019 年 07 月 19 日 • 阅读: 75 • 版本控制

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 完成后被触发,钩子一般使用 batshell 开发。

新建 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
最后编辑于: 2019 年 08 月 02 日