SVN简明教程——下载安装使用
SVN教程目录
- 一、开发中的实际问题
- 二、简介
- 2.1 版本控制
- 2.2 Subversion
- 2.3 Subversion的优良特性
- 2.4 工作原理
- 2.5 SVN基本操作
- 三、Subversion的安装与配置
- 1. 服务器端程序版本
- 2. 下载源码包
- 3. 下载二进制安装包
- 4. 安装
- 5. 配置版本库
- ① 为什么要配置版本库?
- ② 创建目录
- ③ 创建对应的子目录
- ④创建版本库
- ⑤ 版本库目录结构
- 6. 启动服务端程序
- ① 命令行
- ② 注册windows服务
- 7. 客户端的使用
- ① 检出checkout
- ② 提交
- ③ 更新
- ④ 工作副本的几种状态
- ⑤ 将工作副本整体回复到某一个历史版本
- ⑥ 回复某个文件的历史状态,同时不涉及其他文件
一、开发中的实际问题
1.1 备份
1.2 代码还原
1.3 协同修改
1.4 多版本项目文件管理
1.5 追溯问题代码的编写人员及编写时间
1.6 权限控制
二、简介
2.1 版本控制
版本控制 [Revision control],最初来源于工程设计领域,是维护工程蓝图的标准做法,能追踪工程蓝图从诞生一直到定案的过程。是一种记录若干文件内容变化,以便将来查阅特定版本修订情况的系统。
2.2 Subversion
Subversion就是一款实现版本控制的工具软件,通常也称作是版本控制器,简称SVN。
Subversion是Apache软件基金会组织下的一个项目。
2.3 Subversion的优良特性
-
目录版本控制
CVS 只能追踪单个文件的历史,但是 Subversion 实现了一个“虚拟”文件系统,可以追踪整个目录树的修改,文件和目录都是版本控制的,结果就是可以在 客户端对文件和目录执行移动和复制命令。
-
原子提交
提交要么完全进入版本库,要么一点都没有,这允许开发者以一个逻辑块提 交修改。
-
版本控制的元数据
每个文件和目录都有一组附加的“属性”,你可以发明和保存任意的键/值对, 属性也会像文件内容一样被纳入版本控制。
-
可选的网络层
Subversion 在版本库访问方面有一个抽象概念,利于人们去实现新的网络机 制,Subversion 的“高级”服务器是 Apache网络服务器的一个模块,使用 HTTP 的变种协议 WebDAV/DeltaV 通讯,这给了 Subversion 在稳定性和交互性方面很大的好处,可以直接使用服务器的特性,例如认证、授权、传输压缩和版本库浏 览等等。也有一个轻型的,单独运行的 Subversion服务器,这个服务器使用自 己的协议,可以轻松的用 SSH 封装。
-
一致的数据处理
Subversion 使用二进制文件差异算法展现文件的区别,对于文本(人类可读)和二进制(人类不可读)文件具备一致的操作方式,两种类型的文件都压缩存放在 版本库中,差异在网络上双向传递。
-
高效的分支和标签
分支与标签的代价不与工程的大小成比例,Subversion 建立分支与标签时只是复制项目,使用了一种类似于硬链接的机制,因而这类操作通常只会花费很少 并且相对固定的时间,以及很小的版本库空间。
2.4 工作原理
采取客户端/服务器模式——在服务器的版本库中保存项目文 件的各个版本,所有参与协同开发的程序员在自己本地电脑上保存一个工作副本。
SVN支持程序员将本地副本更新到服务器端的最新版本,也支持将本地副本的最新改变更新到服务器端,而且后面的更新不会覆盖前面的更新,而是作为一个新的版本被保存下来——SVN甚至支持将本地工作副本恢复为服务器端保存的某一个历史版本。

2.5 SVN基本操作
- 检出(
checkout):将一个服务器创建好的项目下载到本地。 - 更新(
update):将本地文件更新为服务器端的最新版本 - 提交(
commit):将本地修改提交到服务器端。
三、Subversion的安装与配置
1. 服务器端程序版本
目前Subversion的最新版本是1.14(笔者现在的时间为2020年9月17日13:54:46)。
我这里使用的是1.8.9版本,大同小异。

2. 下载源码包
Apache 组织自己维护更新的只是 Subversion的源码,各个版本的源码包的下载地址是:http://subversion.apache.org/download/
Subversion源码是用C语言开发的。
3. 下载二进制安装包
Subversion在不同平台下的二进制包是由不同组织构建实现的,Windows平台下的二进制包实现情况在这个网页: http://subversion.apache.org/packages.html
4. 安装
找到安装文件:

我们双击这个文件:







它会在环境变量里面自动创建path:

命令控制台输入svn --version查看到信息表示服务端安装成功了。

5. 配置版本库
① 为什么要配置版本库?
Subversion 是将文件数据信息保存到版本库中进行管理的,为了满足用户的不同需求,Subversion 允许用户对版本库目录进行定制。
② 创建目录
在一个非中文无空格目录下创建一个文件夹,作为版本库的根目录: 例如:E:\Subversion\VersionRepository
③ 创建对应的子目录
在版本库根目录下创建与具体项目对应的子目录——这样做的目的是使一个 SVN 服务器能够同时管理多个项目,而不是为每一个项目搭建一个 SVN服务器——这显然太浪费资源了。
例如:
E:\Subversion\VersionRepository\AAA
E:\Subversion\VersionRepository\BBB
E:\Subversion\VersionRepository\CCC
④创建版本库
命令格式:
主命令 子命令 参数1
svnadmin create 仓库路径
例如:svnadmin create E:\Subversion\VersionRepository\LearningSystem

⑤ 版本库目录结构
版本库创建成功后会在指定目录下产生如下的目录结构:

其中的conf是存放 版本库所使用的的配置文件的目录。
db是存放存储版本数据的数据库文件的目录。
hooks是存放版本库钩子程序的目录。
locks是存储库锁目录,用来跟踪库的访问者。
format是存储了一个整数的文件,这个整数代表库层次结构版本。
README.txt是版本库自述文件。
6. 启动服务端程序
SVN 服务器必须处于运行状态才能响应客户端请求,帮助我们管理项目文件。 所以我们必须将 SVN 服务器启动起来。启动 SVN 服务器有两种方法,一个是命令 行方式,一个是注册 Windows 服务。
① 命令行
命令格式:
svnserver -d -r E:\Subversion\VersionRepository
其中-d表示后台执行,-r表示版本库根目录,最后一个表示仓库的目录。

验证服务是否启动成功:
我们看一下现在的端口:

3690被监听的时候,就表示服务启动了。
命令行的缺陷是:只要运行服务器端程序的命令行窗口一关,服务就停止了,很不方便,而且每次开机都要手动启动。
② 注册windows服务
将SVN服务端程序注册为Windows服务,就可以让SVN服务随系统一起启动,克服了命令行方式的不足。
注册服务用的是windows的sc命令,这个是windows的命令,不是SVN的命令。
命令格式:
sc create 服务名 binpath= "***" start= auto depend= Tcpip
注意:等号的左边都没有空格,右边都有一个空格。
binpath是运行服务所需要的二进制文件路径以及运行该二进制文件的命令行参数。
start= auto表示自动启动。
depend= Tcpip表示依赖TCP/IP协议。
binpath:
其中的binpath的组成结构为:
svnserve.exe路径 参数1 参数2 参数3
svnserve.exe路径:
SVN安装目录\bin\svnserve.exe
参数1--service:表示以服务方式启动Subversion
参数2-r:表示版本库根目录
参数3版本库目录
关于版本库的目录:
单仓库:指定与具体项目对应的仓库目录,例如E:\Subversion\VersionRepository,这样只能为一个项目服务;
多仓库:指定版本库的根目录,例如E:\Subversion\VersionRepository\LearningSystem,这样可以为了多个项目服务。
最终命令举例:
sc create MySVNService binpath= "E:\Subversion\bin\svnserve.exe --service -r E:\Subversion\VersionRepository" start= auto depend= Tcpip
注意:如果提示拒绝访问,请以管理员身份运行命令控制台:

运行结果:

我们可以在windows的服务里面看到这项了:

7. 客户端的使用
① 检出checkout
-
首先进入自己的工作目录,例如,
E:\Workspaces -
运行
svn checkout命令,命令格式如下:svn checkout svn://SVN服务器地址/具体仓库目录 保存检出内容的目录例如:
svn checkout svn://localhost/LearningSystem Learn
结果:
-
工作副本
运行 checkout 命令后进入 MyERP 目录,看到里面什么都没有。真的什么都没有吗?不是的。检出命令会在这一目录下创建一个隐藏目录.svn,用来保存与服务器交互的重要信息,其中包括从服务器端取回的最新版本信息、文件状态、更新时间等。SVN正是以此为依据判断当前目录中文件的状态。

所以这个隐藏目录千 万不要删除或修改其中的内容——完全无视它的存在吧。如果服务器端保存的文件可以视为一个“正本”,那么每个开发人员检出到本地目录的文件可以视为“副 本”,通常称为工作副本。
② 提交
-
进入我们的工作空间,并进入我们拷贝下来的目录:

-
我们新建一个文件,比如:test.txt

-
我们执行提交命令(在本目录下)试一下:

说明,一个文件,必须纳入版本控制才能可以提交到服务器端! -
执行
svn add命令,将test.txt纳入版本控制。

-
再次执行svn commit 命令:

这是因为我们没有这次提交附加任何日志信息,这在团队开发中是极为不好的习惯! -
使用-m 参数附加日志信息:

这是因为我们没有开启权限。 -
暂时开启匿名权限
1.进入对应的版本库目录下的conf目录下
2.打开svnserve.conf文件
3.将其中的# anon-access = read改为anno-access = write,也就是去掉#,并且将read改为write。注意一定要顶格写,不要留空格。

不需要重启 SVN服务,甚至不需要重新打开命令行窗口。 -
重新执行提交命令

这样我们就提交成功了。其实我们在提交的时候不需要指定具体的文件,这样就表示提交当前工作副本中。
③ 更新
-
将服务器端的文件检出到一个新的目录Learn2,模拟另一个终端:

-
我们回到Learn,我们对test.txt做一些修改后提交。


-
我们进入Learn目录,执行update命令:

这样我们就可以在“新的目录”下看到“旧的目录”下做的更改了。 -
思考:更新和检出的相同点和不同点分别是什么?
相同点: 从服务器端下载最新的内容
不同点:
检出:下载整个项目;
更新:下载与本地工作副本不同的内容
检出:创建.svn目录,使检出目录成为工作副本
更新:依赖.svn目录
检出:只能操作1次
更新:可以操作多次
④ 工作副本的几种状态
-
没有修改,现行版本
本档案在工作目录中没有被修改,而且自当前版本之后,其他终端也没有任何该文件的修改被提交到服务器,即当前工作副本的版本和服务器端最新版本是一致 的。对它执行
svn commit和svn update都不会发生任何事。 -
本地修改,现行版本
这个文件被修改过,但这个修改还没有提交到服务器,而且自当前版本之后,其 他终端也没有任何该文件的修改被提交到服务器,所以当前工作副本的版本和服 务器端最新版本仍然是一致的。由于有尚未送交回去的本地修改,所以对它的
svn commit会成功提交你的修改,而svn update则不会作任何事。 -
没有修改,仓库版本
这个文件没有修改,但是版本库中有其他终端提交的修改。此时当前工作副本的 版本比服务器端的版本落后了,我们称之为“过时”。对当前文件的
svn commit不 会发生任何事,而svn update会让工作目录中的文件更新至最新版本。 -
本地修改,过时版本
服务器端存在没有更新到本地的修改,导致当前版本过时。如果这个文件在 本地有未提交的修改,则无法提交,对它执行
svn commit会产生“out-of-date” 错误。 此时应该先尝试更新本地文件。更新时 SVN 会尝试将服务器端的更新与本地 文件进行合并,合并的结果有两种可能:一个是服务器端和本地修改位于文件的 不同位置,合并成功;另一个是服务器端的修改正好和本地修改位于同一个位置, 发生冲突。
⑤ 将工作副本整体回复到某一个历史版本
- 假设当前版本为12,想要取回版本9
- 执行
svn update命令
格式:svn update --revision 想要取出的版本号
例如:svn update --revision 1
运行:

- 这里需要注意的是,SVN 版本号并不是对某一个文件进行编号,而是对应整个版本库总体状态的一个“快照”,取回某个版本不是取回版本号对应的某个文件, 而是整个项目的一个快照。

⑥ 回复某个文件的历史状态,同时不涉及其他文件
- 假设想取回test.txt在版本2时的状态
- 执行svn update 命令
相关文章:
SVN简明教程——下载安装使用
SVN教程目录 一、开发中的实际问题二、简介2.1 版本控制2.2 Subversion2.3 Subversion的优良特性2.4 工作原理2.5 SVN基本操作 三、Subversion的安装与配置1. 服务器端程序版本2. 下载源码包3. 下载二进制安装包4. 安装5. 配置版本库① 为什么要配置版本库?② 创建目…...
“智改数转”新风口,物联网如何重构制造业竞争力?
一、政策背景 为深化制造业智能化改造、数字化转型、网络化联接,江苏省制定了《江苏省深化制造业智能化改造数字化转型网络化联接三年行动计划(2025-2027年)》,提出到2027年,全省制造业企业设备更新、工艺…...
从数据洪流到智能洞察:人工智能如何解锁大数据的价值?
引言:数据洪流时代,企业的机遇与挑战 在这个信息爆炸的时代,数据正以前所未有的速度增长。IDC预测,全球数据量将在未来几年内持续飙升,企业每天都会产生海量的用户行为数据、市场交易数据、设备传感数据等。理论上&…...
蓝桥杯 之 数论
文章目录 习题质数找素数 LCM报数游戏 快速幂数字诗意 组合数与错位排序小蓝与钥匙 同余取模 数论,就是一些数学问题,蓝桥杯十分喜欢考察,常见的数论的问题有:取模,同余,大整数分解,素数&#x…...
SpringBoot的启动原理?
大家好,我是锋哥。今天分享关于【SpringBoot的启动原理?】面试题。希望对大家有帮助; SpringBoot的启动原理? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Spring Boot的启动原理主要是通过 SpringApplication 类来…...
从零开始搭建向量数据库:基于 Xinference 和 Milvus 的文本搜索实践
引言 在 AI 和大数据时代,向量数据库正成为处理非结构化数据(如文本、图像)的利器。最近,我尝试用 Xinference 和 Milvus 搭建一个简单的文本搜索系统,从读取本地文本文件到实现交互式查询和高亮显示匹配结果…...
音视频系列——Websockets接口封装为Http接口
模型服务示例:实时语音转文本服务 本示例展示一个支持双协议(WebSocket流式接口HTTP同步接口)的语音转文本模型服务,并提供将WebSocket接口封装为HTTP接口的代码实现。 一、服务架构设计 #mermaid-svg-nw0dMZ4uKfS4vGZR {font-fa…...
scrapy入门(深入)
Scrapy框架简介 Scrapy是:由Python语言开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据,只需要实现少量的代码,就能够快速的抓取。 新建项目 (scrapy startproject xxx):新建一个新的…...
docker模拟Dos_SYN Flood拒绝服务攻击 (Ubuntu20.04)
目录 ✅ 一、实验环境准备(3 个终端) 👉 所以最终推荐做法: 2️⃣ 配置 seed-attacker 为攻击者,开启 telnet 服务: 3️⃣ 配置 victim-10.9.0.5 为受害者服务器,开启 telnet 客户端并监听&…...
使用 Ansys Fluent 评估金属管道腐蚀
金属管道的维护和完整性在石油和天然气、石化和供水等各个行业中都至关重要。腐蚀对这些管道构成了重大威胁,可能导致泄漏、结构故障和环境危害。Ansys Fluent 提供了一个强大的平台来建模和分析金属管道腐蚀。 腐蚀是一种自然过程,金属材料会因与环境发…...
firefly经典蓝牙和QProcess、QFileSystemWatcher记录
QProcess 默认不会启动一个 shell 来解析命令,而是直接调用操作系统的系统调用来启动外部程序。也就是通过fork一个子线程或者exec一个子进程来执行命令。 QProcess的参数模式 QProcess 需要明确指定命令的可执行文件路径或参数列表。 如果命令是一个可执行文件的路径…...
基于PySide6的CATIA自动化工具开发实战——空几何体批量清理系统
一、功能概述 本工具通过PySide6构建用户界面,结合PyCATIA库实现CATIA V5的自动化操作,提供两大核心功能: 空几何体清理:智能识别并删除零件文档中的无内容几何体(Bodies)空几何图形集清理࿱…...
Blender配置渲染设置并输出动画
在Blender中,渲染设置和渲染动画的选项位于不同的面板中。以下是具体步骤: 渲染设置 渲染设置用于配置输出格式、分辨率、帧率等参数。 打开右侧的 属性面板(按 N 键可切换显示)。 点击 “输出属性” 选项卡(图标是…...
Spring 声明式事务应该怎么学?
1、引言 Spring 的声明式事务极大地方便了日常的事务相关代码编写,它的设计如此巧妙,以至于在使用中几乎感觉不到它的存在,只需要优雅地加一个 Transactional 注解,一切就都顺理成章地完成了! 毫不夸张地讲ÿ…...
C++11 引入了的新特性与实例说明
C11 引入了许多重要的新特性,以下是一些关键特性及其对应的示例代码,用于体现这些特性的用法和优势。 1. 自动类型推导 (auto) auto 关键字允许编译器自动推导变量的类型,简化代码书写。 #include <iostream> #include <vector>…...
二手Mac验机过程
1.1 外观检查 螺丝是否拧过螺丝 1.2 关于本机中 序列号,盒子序列号,机器背部 核对参数 https://checkcoverage.apple.com/coverage 1.3 检查apple ID与查找 1 登出 iCloud、iTunes、FaceTime、iMessage 在 Mac 上打開「訊息」應用程式,從上方…...
从 0 到 1 掌握鸿蒙 AudioRenderer 音频渲染:我的自学笔记与踩坑实录(API 14)
最近我在研究 HarmonyOS 音频开发。在音视频领域,鸿蒙的 AudioKit 框架提供了 AVPlayer 和 AudioRenderer 两种方案。AVPlayer 适合快速实现播放功能,而 AudioRenderer 允许更底层的音频处理,适合定制化需求。本文将以一个开发者的自学视角&a…...
Android 13深度定制:SystemUI状态栏时间居中显示终极实战指南
一、架构设计与技术解析 1. SystemUI状态栏核心布局机制 层级结构 mermaid 复制 graph TDPhoneStatusBarView --> StatusBarContents[status_bar_contents]StatusBarContents --> LeftLayout[status_bar_left_side]StatusBarContents --> ClockLayout[Clock控件]Left…...
支持多系统多协议且可提速的下载工具
在网络下载需求日益多样的当下,一款好用的下载器能极大提升效率。今天就给大家介绍 AB Download Manager,它免费又开源,能适配 Windows 和 Linux 系统,带来超便捷的下载体验。 AB Download Manager 采用先进的多线程技术…...
【leetcode hot 100 22】括号生成
解法一:(回溯法)用两个整数记录左右括号数,以在回溯过程中保证先生成左括号,且左右括号数不能大于n。 class Solution {public List<String> generateParenthesis(int n) {List<String> result new Arra…...
如何在 HTML 中创建一个有序列表和无序列表,它们的语义有何不同?
大白话如何在 HTML 中创建一个有序列表和无序列表,它们的语义有何不同? 1. HTML 中有序列表和无序列表的基本概念 在 HTML 里,列表是一种用来组织信息的方式。有序列表就是带有编号的列表,它可以让内容按照一定的顺序呈现&#…...
【武汉·4月11日】Parasoft联合光庭信息研讨会|邀您共探AI赋能新机遇
Parasoft联合光庭信息Workshop邀您共探AI赋能新机遇 AI浪潮已至,你准备好了吗? 在智能网联汽车飞速发展的今天,AI技术正以前所未有的速度重塑行业生态。如何把握AI机遇,赋能企业创新? 4月11日,自动化软件…...
PHP PSR(PHP Standards Recommendations)介绍
PHP PSR(PHP Standards Recommendations)是 PHP 社区制定的一系列标准化规范,旨在统一 PHP 代码的编写方式、接口设计和开发实践,以提高代码的可读性、可维护性和互操作性。以下是核心 PSR 标准的解读和具体使用方法: …...
闻所闻尽:穿透声音的寂静,照见生命的本真
在《楞严经》的梵音缭绕中,"闻所闻尽"四个字如晨钟暮鼓,叩击着每个修行者的心门。这个源自观世音菩萨耳根圆通法门的核心概念,既是佛门修行的次第指引,更蕴含着东方哲学对生命本质的终极叩问。当我们穿越时空的帷幕&…...
F28335进入非法中断ILLEGAL_ISR定位
在非法中断函数中,再调用一个函数接口,比如save_illegal_error(),然后在save_illegal_error中实现如下代码: g_illegal_isr_sp 0;(这个是全局变量,需要先定义 ) asm( “ MOVW ACC, SP\n” " MOVL …...
PreparedStatement 和 Statement 从 功能、性能、安全性、适用场景 等维度详细对比分析
以下是 PreparedStatement 和 Statement 的对比分析,从 功能、性能、安全性、适用场景 等维度详细说明: 1. 核心区别 特性PreparedStatementStatement定义预编译的 SQL 语句,支持参数化查询执行静态 SQL 语句,不支持参数占位符安…...
VLAN综合实验报告
一、实验拓扑 网络拓扑结构包括三台交换机(LSW1、LSW2、LSW3)、一台路由器(AR1)以及六台PC(PC1-PC6)。交换机之间通过Trunk链路相连,交换机与PC、路由器通过Access或Hybrid链路连接。 二、实验…...
使用 Docker 部署 mysql 应用
使用 Docker 部署 环境搭建 Docker 安装文档 创建容器 在系统任意位置创建一个文件夹(可选) mkdir -p /opt/docker/mysql && cd /opt/docker/mysqlmkdir ./{conf,data,logs}搜索 & 拉取镜像 docker search mysql docker pull mysql:5.6启…...
美团Leaf分布式ID实战:深入解析雪花算法原理与应用
📖 前言 在分布式系统中,全局唯一ID生成是保证数据一致性的核心技术之一。传统方案(如数据库自增ID、UUID)存在性能瓶颈或无序性问题,而美团开源的Leaf框架提供了高可用、高性能的分布式ID解决方案。本文重点解析Leaf…...
Midjourney使用教程—2.作品修改
当您已生成第一张Midjourney图像的时候,接下来该做什么?了解我们用于修改图像的工具!使用 Midjourney 制作图像后,您的创意之旅就不会止步于此。您可以使用各种工具来修改和增强图像。 一、放大操作 Midjourney每次会根据提示词…...
