Apache Subversion 通常被缩写成 SVN,是一个开放源代码的版本控制系统。
在 Linux 系统上安装 svn 很简单,执行 yum install subversion
即可。
而在 mac 电脑上自带 svn,可使用命令 svn --version
查看版本,笔者的是 svn, version 1.9.4 (r1740329)
compiled Apr 10 2017, 20:36:46 on x86_64-apple-darwin15.0.0
无论什么系统,使用 svn 都是差不多的。
一、创建代码仓库
先在 /Users/jason/ 目录下新建一个 svn 目录,以后可以在这个目录下创建多个仓库目录;
打开终端,创建一个mycode仓库,输入指令:svnadmin create /Users/jason/svn/mycode
创建成功后会在 mycode 文件夹下面出现多个文件和目录,这是用来控制版本的,说明仓库已经建好。
二、配置svn的用户和权限
主要是修改/svn/mycode/conf目录下的三个文件
svnserve.conf –> svn服务的配置
passwd –> 设置用户名和密码
authz –> 用户组权限管理
1、 打开svnserve.conf,将下列配置项前面的#和空格都去掉(注意空格一定要去掉)
这几行配置所在行第一个字母前不能有任何空格,配置项等号左右两边各一个空格。配置项后面也不要紧跟着#之类的注释字符,否则会报错。
anon-access = read
auth-access = write
password-db = passwd
authz-db = authz
anon-access = read
代表匿名访问的时候是只读的,若改为anon-access = none
代表禁止匿名访问,需要帐号密码才能访问。
2、 打开 passwd,在[users]下面添加帐号和密码
[users]
jason = 123456
guest = 123456
一个账号是 jason,密码是123456
一个账号是 guest,密码是123456
3、打开authz,配置用户组和权限
我们可以将在 passwd 里添加的用户分配到不同的用户组里,以后的话,就可以对不同用户组设置不同的权限,没有必要对每个用户进行单独设置权限。
- 配置用户组
在[groups]下面添加组名和用户名,多个用户之间用逗号(,)隔开 [groups]
mygroup = jason,guest
说明 jason 和 guest 同在 mygroup 这个组,下面再进行权限配置。
- 配置权限
使用[/]代表svn服务器中的所有资源库 [/]
@mygroup = rw
上面的配置说明 mygroup 这个组中的所有用户对所有资源库都有读写(rw)权限,组名前面要用@;如果是用户名,不用加@,比如 jason 这个用户有读写权限 [/]
jason = rw
4、 启动svn服务器
在终端输入下列指令:svnserve -d -r /Users/jason/svn
或者输入:svnserve -d -r /Users/jason/svn/mycode
没有任何提示就说明启动成功了
可以通过 ps -A | grep svnserve
查看有没有启动,如果有启动,就会有一个线程。
5、 关闭svn服务器
关闭svn服务器,可以通过活动监视器,找到 svnserve 进程,结束它;
或是通过 ps -A | grep svnserve
,查出线程号,直接 kill 掉;
或是简单直接的 killall svnserve
。
注:首次配置完先关闭svn服务器再进行数据的上传和下载操作。
三、使用svn客户端功能
1. 从本地导入代码到服务器(第一次初始化导入)
在终端中输入 svn import /Users/jason/Desktop/test svn://localhost/mycode/test --username=jason --password=123456 -m "第一次导入"
将/Users/jason/Desktop/test中的所有内容,上传到服务器 mycode 仓库的 test 目录下,后面双引号中的”第一次导入”是注释
导入到服务器上的文件在 svn/mycode/test 里面的文件夹里是找不到的,那么,文件到底提交到哪去了呢?SVN在服务器端的存储方式和客户端是不一样的,在服务器端是看不到源文件的。SVN服务器端默认采用的FSFS格式存储文件,这些数据存放在版本库的 db 目录中,里面的 revs 和 revprops 分别存放着每次提交的差异数据和日志等信息,而且它是将每次 commit 的内容以增量方式存放的,每个增量包存成1个文件,这个增量包中包括了这次commit的全部数据。
2. 从服务器端下载代码到客户端本地
在终端中输入 svn checkout svn://localhost/mycode --username=jason --password=123456 /Users/jason/Desktop/test
将服务器中 mycode 仓库的内容下载到 /Users/jason/Desktop/test 目录中
checkout 到本地文件夹的文件会有一个 .svn 的隐藏文件夹,表示这个文件夹是受 svn 控制的,.svn 里面是版本控制的元数据信息。
要导入文件有两种做法:
(1) 用import指令,将客户端文件夹导入到服务器端
(2) 先checkout空库到客户端,然后将要导入的文件夹放入客户端checkout产生的空文件夹,然后执行add将这些文件夹纳入SVN控制,最后执行commit上传到服务器。
第一步是从本地文件到服务器文件的关联,第二步是从服务器到本地文件的关联,这两步都是使服务器和本地产生关联;
使用 svn 一定要明确两个概念:仓库和工作区
仓库指的是服务器上的代码仓库,比如这里的 mycode 目录;
工作区是指每一台电脑上具体的工作目录,比如这里的 test 目录。
3. 提交代码到服务器
在步骤2中已经将服务器端的代码都下载到了 /Users/jason/Desktop/test 目录中,现在增加一个 readme.txt,然后提交到服务器
(1) 打开终端,先定位到 /Users/jason/Desktop/test 目录,创建一个 readme.txt 文件;
(2) 输入提交指令:svn add readme.txt
; 把新创建的文件添加到缓存区;
(3) 输入提交指令:svn commit -m "第二次提交,增加了readme.txt"
可以看到终端的打印信息:
Adding (bin) readme.txt
Transmitting file data .done
Committing transaction…
Committed revision 2.
4. 更新服务器端的代码到客户端
这个应该是最简单的指令了,就是把服务器上最新的版本更新下来,在终端中定位到客户端代码目录后,比如上面的 /Users/jason/Desktop/test 目录,然后再输入指令:svn update
一般提交之前需先更新,否则别人上传的新版本你没有更新下来就会被覆盖,别人上传的就丢失了。
5. 了解 svn 的更多用法,在终端输入:svn help
注:
1、系统自带的svn无法支持本地删除文件的更新,即当本地删除文件后去更新服务器的文件时,删除的文件又从服务器上的文件夹中下载到你的本地文件夹中。但是它是支持文件修改后的更新操作的。
2、记得写注释,否则系统不会识别命令。