svn的搭建和使用

啥是svn?

svn是一个跨平台的开源的版本控制系统,svn版本管理工具管理着随时间改变的各种数据,这些数据放置在一个中央资料档案库中,这个档案库很像一个普通的文件服务器或者FTP服务器,但是,与其他服务器不同的是,svn会备份并记录每个文件每一次的修改更新变动。这样我们就可以把任意一个时间点的档案恢复到想要的某一个旧的版本,当然也可以直接浏览指定文件的更新历史记录。


svn的缺点:

  1. 上文提到每一次提交都会保留一个副本,所以svn的数据库容量会暴增

  2. 如果svn的服务器宕机,基本上不可以工作

  3. 不适合开源的系统开发


svn的优点:

  1. 管理方便,逻辑比较清晰,符合一般人的思维习惯

  2. 容易管理,集中式的svn服务器更可以保证数据的安全性

  3. 版本一致性会更有保证

  4. 适合开发人数不多的项目开发

  5. 普及度比较高


svn工作流程大概可以分成如下四步骤:

  1. 在中央库上创建或从主干复制一个分支;

  2. 从中央库check out下这个分支的代码;

  3. 增加自己的代码文件,修改现存的代码或删除代码文件;

  4. commit代码,假设有人在刚刚的分支上提交了代码,你就会被提示代码过期,你要先up你的代码后再提交,up代码的时候如果出现了冲突,需要解决好冲突后再进行提交。



实验


环境搭建

[root@svnserver ~]# yum -y install subversion     #首先当然是下载软件
[root@svnserver ~]# mkdir -p /svn/data    #创建版本库存放目录
[root@svnserver ~]# mkdir -p /svn/auth    #创建认证相关文件的存放目录


[root@svnserver ~]# svnserve -d -r /svn/data/     #启动svn,-d指定后台运行,-r选项指定版本库存放目录


svnserve可用选项:
  -d [--daemon]            : 后台模式
  -i [--inetd]             : inetd 模式
  -t [--tunnel]            : 隧道模式
  -X [--listen-once]       : 监听一次方式(调试用)
  -r [--root] ARG          : 服务的根目录
  -R [--read-only]         : 强制只读;覆盖版本库配置文件
  --config-file ARG        : 从文件 ARG 读取配置
  --listen-port ARG        : 监听端口
                             [方式: daemon, listen-once]
  --listen-host ARG        : 监听主机名称或IP地址
                             [方式: daemon, listen-once]
  -T [--threads]           : 使用线程代替进程 [方式: daemon]
  --foreground             : 在前台运行(调试用)
                             [方式: daemon]
  --log-file ARG           : svnserve 日志文件
  --pid-file ARG           : 写进程 PID 到文件 ARG
                             [方式: daemon, listen-once]
  --tunnel-user ARG        : 隧道用户名(默认是当前UID对应的用户名)
                             [方式: tunnel]
  -h [--help]              : 显示本帮助
  --version                : 显示程序版本信息


[root@svnserver ~]# ps -ef |grep svn |grep -v grep   #查看svn进程
root       2720      1  0 04:41 ?        00:00:00 svnserve -d -r /svn/data/


[root@svnserver ~]# lsof -i:3690    #查看svn的监听端口
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
svnserve 2720 root    3u  IPv4  21398      0t0  TCP *:svn (LISTEN)


[root@svnserver ~]# svnadmin create /svn/data/dir    #创建版本库


[root@svnserver ~]# tree /svn/data/dir/   #初始化版本库之后会生成在版本库目录下生成许多文件和目录,比较重要的是conf目录和hooks目录,前者用来存放和配置相关的文件,后者存放的是钩子脚本
/svn/data/dir/
├── conf
│   ├── authz
│   ├── passwd
│   └── svnserve.conf
├── hooks
│   ├── post-commit.tmpl
│   ├── post-lock.tmpl
│   ├── post-revprop-change.tmpl
│   ├── post-unlock.tmpl
│   ├── pre-commit.tmpl
│   ├── pre-lock.tmpl
│   ├── pre-revprop-change.tmpl
│   ├── pre-unlock.tmpl
│   └── start-commit.tmpl


[root@svnserver conf]# cp svnserve.conf svnserve.conf.bak  #要养成修改配置文件之前先保存一份备份的习惯

[root@svnserver conf]# cat svnserve.conf | egrep -v "(#|^$)"  #修改成如下
[general]
anon-access = read   #匿名连接的权限
auth-access = write    #认证连接的权限
password-db = /svn/auth/passwd    #用户认证文件
authz-db = /svn/auth/authz      #用户权限文件
 

[root@svnserver conf]# cp authz passwd /svn/auth/   #拷贝认证、权限文件到自定义的目录下
[root@svnserver conf]# cd /svn/auth/
[root@svnserver auth]# chmod 700 *    #修改权限为700


[root@svnserver auth]# cat passwd | egrep -v "(#|^$)"   #修改如下
[users]
lhx = 1


[root@svnserver auth]# cat authz | egrep -v "(#|^$)"  #修改如下
[dir:/]
lhx = rw


重启svn

[root@svnserver auth]# pkill svnserve
[root@svnserver auth]# svnserve -d -r /svn/data/


svn在windows下的使用


在windows客户端创建一个目录,然后右键点击这个目录,选择“SVN Checkout”,输入svn的仓库的路径

wKiom1khgtKTgtJMAACRGEfzxCQ038.png

输入用户名和密码,点击OK

wKiom1khgtPzB48CAABX8-yBWBU108.png

成功之后会出现一个绿色的勾

wKioL1khgtOjynfiAAAMdo69fcs310.png

在svndata目录下创建一个文件,然后右击这个目录,选择“SVN commit”,选择要上传的文件

wKiom1khgtTz9tBFAAB37qXwO9s211.png

上传成功

wKiom1khgtiDmGVvAAF2SK99HxE966.png


在svn服务器查看上传的文件

[root@svnserver ~]# svn list svn://192.168.83.134/dir --verbose --username=lhx --password=1
      1 lhx                   May 22 04:59 ./
      1 lhx                 0 May 22 04:59 test.txt


svn在linux下的使用


常用的命令:svn<subcommand> [options] [args]

 checkout (co)      #从源码库取出一个工作版本的拷贝

 commit (ci)         #提交当前工作拷贝的更改,这个地方有可能出现代码冲突
 copy(cp)             #做一个工作拷贝的拷贝
 delete (del,remove,rm)     #删除本地或者svn server response上的文件或者目录
 diff(di)                #比较某个文件与库中的对应文件的不同
 export               # 导出一个无版本控制的目录树拷贝,一般用于导出发行,或者投入运行的版本
 import                #将本地当前目录下的文件导入到svn response中
 info                    #当前目录工作拷贝中某文件信息
 status(stat,st)     #svn工作拷贝当前状态,与svn server上的源码比较的结果

 update (up)       # 将svn server端文件同步到本地   


[root@client ~]# yum -y install subversion    

[root@client ~]# svn co svn://192.168.83.134/dir /svndata --username=lhx --password=1   #从库里面checkout文件下来

-----------------------------------------------------------------------
A    /svndata/test.txt
Checked out revision 1.

[root@client ~]# tree /svndata/
/svndata/
└── test.txt

如果checkout的时候报错:

svn:Can’t convert string from ‘UTF-8’ to native encoding:

可以用如下方法解决:

[root@client ~]# export LC_CTYPE="en_US.UTF-8"
[root@client ~]# export LC_ALL=


当然工作中,会用到的命令和选项还有很多,这里就不一一深究了。上面的命令都有解释,大家可以自己做一下试试。



如有纰漏,欢迎指正。。。