版本控制工具入门——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 完成后被触发,钩子一般使用 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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354

推荐阅读更多精彩内容