SVN:客户端与服务器端安装、配置与使用

本文档详述了SVN(Subversion)的服务器端和客户端的安装、配置及使用方法,包括存储库和工作副本的基本概念,以及导入数据、检出、更新、提交、分支与标记等操作。此外,还介绍了TortoiseSVN客户端的使用和服务器端创建Repository、启动svnserve服务的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


SVNSUBVERSION

前言:

SVNSubversion的简称,是一个开放源代码的版本控制系统,说得简单一点SVN就是用于多个人共同开发同一个项目,共用资源的目的类似的工具号有gitgithub是其应用)。

 

环境:ubuntu 16.4 客户端:windows

一、服务器端下载地址

 

http://subversion.apache.org/packages.html#ubuntu

二、服务器端安装

 

sudo apt-get install subversion

sudo apt-get install libapache2-svn

 

三、SVN的一些基本概念

参考材料:http://subversion.apache.org/quick-start#branching-and-tagging

术语

什么是存储库(Repository)?

版本库repositiry是一个版本控制数据库,通常驻留在服务器上,通常由Apache HTTP Server(通过mod_dav_svn模块)或svnserve服务器公开。存储库作为一个单一的源,作为一个中央存储,它包含版本数据修改的完整历史记录。

存储库URL示例:

· Apache HTTP服务器:https //svn.example.com/repos/MyRepo/MyProject/trunk

· svnserve的: SVN://svn.example.com/repos/MyRepo/MyProject/branches/MyBranch

· 直接访问(Unix风格): file://var/svn/repos/MyRepo/MyProject/tags/1.1.0

· 直接访问(Windows风格): file:/// C:/ Repositories / MyRepo / trunk / MyProject

什么是工作副本(Working Copy)?

工作副本是您用来与中央SubversionSVN存储库交互的本地和私有工作区。您可以使用工作副本来修改您的项目的内容并获取其他人提交的更改。

工作副本包含项目的数据,外观和行为就像本地文件系统上的常规目录,但有一个主要区别 - 工作副本将跟踪其中的文件和目录的状态和更改。您可以将工作副本视为具有版本控制功能的常规目录。工作副本的根目录中有一个名为.svn的管理目录。管理目录包含Subversion管理版本控制功能所需的元数据。

根据您的需要,可以从同一个存储库或项目中获得尽可能多的工作副本,并可以使用任何本地修改组合。

什么是工作副本(Working Copy)?

Trunk(主干):是用来做主方向开发的,一个新模块的开发,这个时候就放在trunk, 当模块开发完成后,需要修改,就用branch。 
Branch(分支):是用来做并行开发的,这里的并行是指和trunk进行比较。
tag(标记):是用来做一个milestone的,不管是不是发布版本,但都是一个可用的版本。 这里,应该是只读的。更多的是一个显示用的,给人一个可读的标记。

比如,3.0开发完成,这个时候要做一个tag,tag_release_3_0,然后基于这个tag做发布,比如安装程序等。trunk进入 3.1的开发,但是3.0发现了bug,那么就需要基tag_release_3_0做一个分支(branch),branch_bugfix_3_0,基于这 个branch进bug修改,等到bugfix结束,做一个tag,tag_release_3_0_1,然后,根据需要决 branch_bugfix_3_0是否并入主干(trunk)。

基本任务

将数据导入存储库

如果你想将现有的非版本化(就是不会被svn跟踪版本变更,相当于无视)数据导入SVN仓库,你应该运行 svn import命令。这里是一个例子:

$ svn import https://svn.example.com/repos/MyRepo/MyProject/trunk -m“Initial project import”

Checking out(创建)一个工作副本

要开始修改项目的数据,您必须创建版本化项目的本地副本。您可以使用命令行svn客户端或任何您喜欢的基于GUI的客户端。您的本地项目副本称为工作副本,您可以通过发出svn checkout命令来创建它 。这里是一个例子:

$ svn checkout https://svn.example.com/repos/MyRepo/MyProject/trunk MyWorkingCopy

因此,您将获得驻留在MyRepo存储库中的名为MyProject的项目主干trunk的工作副本。工作副本将位于计算机上的MyWorkingCopy目录中。请注意,不是check out主干,而是check out一些分支或标记(假设它们已经存在于存储库中)。

您也可以获取整个存储库MyRepo的工作副本。但是你应该避免这样做。一般来说,你不需要为你的工作有一个工作副本,因为你的工作副本可以立即切换到另一个开发分支。而且,Subversion版本库可以包含许多不相关的项目,最好为每个项目提供一个专门的工作副本,而不是所有项目的一个工作副本。

更新工作副本

你不是唯一在这个项目上工作的人,对吧?这意味着你的同事也正在修改项目的数据。要保持最新状态并获取其他人提交的修改,您应该在工作副本中运行 svn update命令。因此,您的工作副本将与存储库同步并下载您的同事所做的更改。

在将本地修改提交到存储库之前,更新您的工作副本是一个好习惯。

在本地工作副本(local working copy)中进行更改

大多数情况下,您将通过修改工作副本的内容来修改项目的数据。只要您对修改感到满意,并且已经彻底查看了这些修改,就可以将其提交到中央存储库。

修改现有的文件

像平时一样使用您最喜爱的文本处理器,图形编辑器,音频编辑软件,IDE等来修改文件。只要将更改保存到磁盘,Subversion就会自动识别它们。

将您的更改提交到存储库

为了发布您在工作副本中所做的更改,您应该运行 svn commit命令。

在提交之前检查您的更改!使用 svn status 和 svn diff命令来查看更改。

这是一个提交命令的例子:

$ svn commit -m“My Descriptive Log Message”

请注意-m(--message)选项。你应该总是包含一个描述性的提交日志消息。它应该帮助包括你自己在内的其他人理解你为什么要这样做。在日志消息中包含变更的摘要信息也是一个好主意。

执行文件和目录操作

您可以在工作副本中对项目数据执行任何操作,但涉及复制,移动,重命名和删除的操作必须使用相应的svn 命令执行。

Subversion不会在工作副本中使用启发式搜索(heurisic-tracking来更改路径树。Subversion需要明确路径树的变化。如果你执行一个树路径变更如移动或复制常规文件系统命令,Subversion不会知道这个操作。跟踪树的变化应该让Subversion知道它们。

添加新的文件和目录

把新的文件或目录放在工作副本上,Subversion会将它们视为“未版本化”。除非运行svn add命令,否则不会自动开始跟踪新文件 :

$ svn add foo.cs

移动和重命名文件和目录

使用svn movesvn rename命令移动和重命名文件和目录 :

$ svn move foo.cs bar.cs

命令svn renamesvn移动的别名。

复制文件和目录

使用svn copy命令复制文件和目录 :

$ svn copy foo.cs bar.cs

删除文件和目录

使用svn delete svn delete命令删除文件和目录 :

$ svn delete foo.cs

恢复或丢弃本地更改

使用svn revert命令放弃本地未提交的更改 :

$ svn revert foo.cs

丢弃的未提交的更改将永远丢失。您将无法恢复已还原的更改。谨慎使用svn revert

分支和标记

你应该使用svn copy命令来创建分支branches和标签tags。当您希望它们与历史相关时这是用于复制工作副本中的项目和存储库中的项目相同命令。

命令svn copy用于分支,因为分支在技术上是复制的源的副本。但是,这与您在本地文件系统上的文件复制并不相同Subversion版本库中的分支就是所谓的 “Cheap Copies”,类似于符号链接symlinks。因此,创建一个新的分支需要最少的时间来完成,并且在Subversion版本库中几乎没有空间。您可以创建分支并将其用于任何需要的更改,而不管更改的大小和范围如何。

使用direct URL to URL copy创建分支

Subversion中分支很简单。最简单的形式是,创建一个新的分支需要您针对远程存储库的URL运行该命令。例如,让我们从主干线中创建一个新的分支:

$ svn copy https://example.com/MyRepo/trunk https://example.com/MyRepo/branches/MyNewBranch -m "Creating a new branch"

 

四、svn客户端工具

TortoiseSVN

安装:

https://tortoisesvn.net/downloads.html,windows版图形化界面。

下载安装即可。(有其他工具可以自行选择)。

 

提示:官网上有中文语言包,安装完TortoiseSVN安装包后再次安装中文语言包即可(安装之后在设置-常规-语言选择中文)。

安装后打开TortoiseSVN Repository Browser

 

 

填入URL,即可链接成功。

 

成功后:

 

详细使用说明:参见TortoiseSVN手册

https://tortoisesvn.net/support.html

五、服务器端创建Repository、启动serve

参考文档:http://svnbook.red-bean.com/nightly/zh/index.html

(此步骤仅作为搭建svn服务器的操作,如果服务器已经搭建好,就可以忽略这部分,直接使用客户端连接即可)

创建存储库

创建Subversion版本库是一项非常简单的任务。Subversion附带的svnadmin实用程序提供了一个子命令(svnadmin create)

eg:

$ # Create a repository

$ svnadmin create /var/svn/repos

假设父目录 /var/svn存在,并且您有足够的权限修改该目录(如果没有权限就把db文件夹的权限修改),则以前的命令会在目录/var/svn/repos中以及默认的文件系统数据存储(FSFS)中创建一个新的存储库 。你可以明确地选择使用的文件系统类型--fs-type的参数,它接受作为参数要么fsfs或 bdb。

eg:

$ # Create an FSFS-backed repository

$ svnadmin create --fs-type fsfs /var/svn/repos

$

# Create a legacy Berkeley-DB-backed repository

$ svnadmin create --fs-type bdb /var/svn/repos

$

运行这个简单的命令后,你有一个Subversion版本库。根据用户如何访问这个新的存储库,您可能需要设置它的文件系统权限。

 

所以执行命令:

$ svnadmin create NLP_Repository

得到NLP_Repository文件夹,包括内容:

conf  db  format  hooks  locks  README.txt

每个部分的含义:

conf / :该目录是配置文件的容器。

db/ :该目录包含所有版本化数据的数据存储。

format/ :这个文件描述了存储库的内部组织方案。(事实证明,db/子目录有时也包含一个format文件,只描述该子目录的内容,而不会与该文件混淆。)

hook/ :该目录包含钩子脚本模板和钩子脚本(如果已经安装的话)。

lock/ :Subversion使用这个目录来安置库锁定文件,用于管理对版本库的并发访问。

.README.txt :这是一个简短的文本文件,其中只包含一个通知给读者,他们正在查找的目录是一个Subversio版本库

启动服务

目前只有两个Subversion服务器被广泛使用。

Apache HTTP Server(也称为httpd)是一个非常流行的Web服务器; 使用mod_dav_svn模块,Apache可以访问存储库,并通过WebDAV / DeltaV协议(它是HTTP的扩展)将其提供给客户端。因为Apache是最可扩展的服务器,它提供了许多功能“ 免费, ”比如加密的SSL通讯,记录,与多家第三方认证系统的整合,以及有限的内置存储库的网页浏览。

在另一个角落是svnserve:一个轻量级的小型服务器程序,与客户端通信。因为它的协议是明确为Subversion设计的,并且是有状态的(与HTTP不同),所以它提供了显着更快的网络操作,但也是以某些功能为代价的。虽然它可以使用SASL来提供各种身份验证和加密选项,但它没有日志记录功能或内置的网页浏览功能。然而,建立起来非常容易,对于刚刚开始使用Subversion的小团队来说,这往往是最好的选择。

有几种不同的方式来运行 svnserve程序:

1运行svnserve作为一个独立的守护进程,监听请求。

2每当请求进入某个端口时,Unix inetd守护进程暂时产生svnserve。

3让SSH 通过加密隧道调用临时svnserve。

4运行svnserve作为Microsoft Windows服务。

5运行svnserve作为启动的工作。

这里使用最简单的第一种方式。

svnserve作为守护进程

最简单的选择是将svnserve 作为独立的“ 守护进程 ”进程运行。使用这个 -d选项:

$ svnserve -d

$#svnserve现在正在运行,监听端口3690

在守护进程模式下运行svnserve时,可以使用--listen-port和 --listen-host选项来自定义确切的端口和主机名来“ 绑定 ”到。

一旦我们 如前所述成功启动svnserve,它就会使系统中的每个存储库都可用于网络。客户端需要在存储库URL中指定绝对路径。例如,如果存储库位于/var/svn/project1,客户端将通过svn://host.example.com/var/svn/project1。为了提高安全性,可以将-r 选项传递给svnserve,从而限制它仅导出该路径下的存储库。例如:

$ svnserve -d -r / var / svn

使用该-r选项可以有效地修改程序作为远程文件系统空间根目录的位置。然后,客户使用从其中移除了该路径部分的URL,从而留下更短(且更少泄露)的URL:

$ svn checkout svn://host.example.com/project1

这里我们是这样操作的:

修改访问权限:修改未验证用户与验证用户的权限(我图省事就都设成了可读写,最小面有修改方法)

 

$ sudo vim conf/svnserve.conf

 

启动服务:

$ svnserve -d -r /home/vm-server01/SVN/  

 

关于服务器添加账号密码:

我们首先需要编辑下svnserve.conf,将下面四项的前面注释去掉,并且去掉这一行前面的空格,将配置顶行写:(一定要顶行去掉空格,否则报错:svn: E200002: line 19: Option expected

anon-access = none

auth-access = write

password-db = passwd

authz-db = authz

这边字面上也能明白 anon是匿名访问时的权限,auth是授权访问时的权限。

然后我们配置下passwd

[users] # harry = harryssecret # sally = sallyssecret

MyAccount=MyPS

这里添加的是用户名=密码,我这里依照上面的例子添加就可以了。

然后我们去authz中配置组和组权限:

[groups] # harry_and_sally = harry,sally # harry_sally_and_joe = harry,sally,&joe

Myteam=MyAccount

# [/foo/bar] # harry = rw # &joe = r # * =

# [repository:/baz/fuz] # @harry_and_sally = rw # * = r

[/] 

@Myteam=rw

这里其实也很简单,先在groups中添加一个组,并且后面添加组员。

然后下面是设置每个组在相应目录下的权限,这里设置的是[/]的意思,就是在根目录下,然后西面组名前 面加@,意思是andy组在根目录下的权限为rw,即读和写都有。

svnauthz文件(权限文件)、passwd文件(存放密码文件)、.conf文件(配置文件)里的注释写的很清楚,可以详细读一下。

 

完成!


备注:如果有不清楚的地方,每一部分都有参考资料,可以自行查阅一下。

 

 

 



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值