版本控制系统-SVN

Posted ZHZ的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了版本控制系统-SVN相关的知识,希望对你有一定的参考价值。

1.   SVN介绍

1.1.  简介

SVN(subversion),版本管理工具,与CVS一样,SVN是一个可跨平台的开源版本控制系统,Subversion管理随时间变化的数据。这些数据都被放置在一个档案库(repository)中,它会记录每一次文件的变动,这样我们就可以把档案恢复到旧的版本或者浏览文件的变动记录。除了能够存放程序代码外还可以管理其他任何类型的文件,如文本,视频,图片。

Subversion官网:https://subversion.apache.org

SVN客户端:http://tortoisesvn.sourceforge.net/

SVN中文网站:http://svndoc.iusesvn.com/

中文常见问题解答:https://subversion.apache.org/faq.zh.html

官方手册:http://svnbook.red-bean.com/

1.2.  Svn服务端运行方式

常见的运行方式有以下3种:

  • a、独立服务器,例如:svn://svn.petrochina.org/sadoc
  • b、借助apache,例如:http://svn.petrochina.org/sadoc
  • c、本地直接访问,例如:file:///application/svndata/sadoc

1.3.  Svn客户端访问方式

访问方式 说明
file:/// 直接通过本地磁盘或者网络磁盘访问版本库
http:// 通过WebDAV协议访问支持Subversion的Apache服务器
https:// 与http://相似,但是用SSL加密访问
svn:// 通过TCP/IP自定义协议访问是SVN服务器
svn+ssh:// 通过认证并加密的TCP/IP自定义协议访问svn服务器

 

1.4.  SVN数据格式

svn存储版本数据有2种方式。BDB(事务安全型表类型)和FSFS(不需要数据库的存储系统)。由于BDB方式在服务器中断时有可能锁住数据,所以还是FSFS方式更安全一点。CVS是基于RCS文件的版本控制系统,每个CVS文件都不过是普通的文件加上一些额外的信息,这类文件会简单重复本地文件的树结构。因此不必担心数据损失,必要的话可以手工修改RCS文件。而SVN是基于关系数据库或一系列二进制文件的(FS_FS),这解决了许多问题(如并行读写共享文件)以及添加了许多新功能,但是数据存储也由此变的不透明。

1.5.  SVN系统逻辑架构图

 

1.6.  中央式管理的工作流程

 这种结构的核心是Server,所有开发人员在工作前要先去服务器端获取代码-->开发-->解决冲突-->提交至服务器。如果脱离了服务器就无法正常工作。

1.7.  运维人员对版本管理系统需要掌握的

  • 安装、部署、维护、排障
  • 简单使用,很多公司都是由开发来管理,包括建立仓库和添加删除账号
  • 对于版本控制系统,运维人员要相当于开发商,开发人员是业主,运维搭建的系统为开发人员服务

 

2.   安装配置

2.1.  系统环境

CentOS release 6.6 (Final)
2.6.32-504.el6.
x86_64 

2.2.  安装svn

由于是内部应用,故用yum安装即可。

yum install subversion –y

检查

rpm -qa subversion
subversion-1.6.11-15.el6_7.x86_64

2.3.  配置启动

建立svn版本库根目录svndata,密码权限目录svnpasswd。

[root@svn ~]# mkdir -p /application/{svndata,svnpasswd}
[root@svn ~]# tree /application/svn*                   
/application/svndata
/application/svnpasswd

0 directories, 0 files

启动svn服务指定服务的svn根目录

[root@svn ~]# svnserve -d -r /application/svndata/
-d dameon模式

查看svnserver命令帮助

[root@svn ~]# svnserve --help
用法: svnserve [-d | -i | -t | -X] [options]

有效选项: 
  -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                : 显示程序版本信息

查看svn进程

[root@svn ~]# ps -ef |grep svn        
root      2925     1  0 00:51 ?        00:00:00 svnserve -d -r /application/svndata/
root      2949  2754  0 00:58 pts/0    00:00:00 grep --color=auto svn
[root@svn ~]# ps -ef |grep svn|grep -v grep
root      2925     1  0 00:51 ?        00:00:00 svnserve -d -r /application/svndata/

检查svn端口

[root@svn ~]# netstat -lntup|grep svn
tcp        0      0 0.0.0.0:3690                0.0.0.0:*                   LISTEN      2925/svnserve   
[root@svn ~]# netstat -lntup|grep 3690
tcp        0      0 0.0.0.0:3690                0.0.0.0:*                   LISTEN      2925/svnserve       
[root@svn ~]# lsof -i tcp:3690
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
svnserve 2925 root    3u  IPv4  22216      0t0  TCP *:svn (LISTEN)

2.4.  建立版本库

创建一个新的subversion项目(版本库)sadoc,

[root@svn ~]# svnadmin create /application/svndata/sadoc
[root@svn ~]# ll /application/svndata/sadoc
总用量 24
drwxr-xr-x. 2 root root 4096 11月 12 01:02 conf
drwxr-sr-x. 6 root root 4096 11月 12 01:02 db
-r--r--r--. 1 root root    2 11月 12 01:02 format
drwxr-xr-x. 2 root root 4096 11月 12 01:02 hooks
drwxr-xr-x. 2 root root 4096 11月 12 01:02 locks
-rw-r--r--. 1 root root  229 11月 12 01:02 README.txt

查看帮助

[root@svn ~]# svnadmin help 
一般用法: svnadmin SUBCOMMAND REPOS_PATH  [ARGS & OPTIONS ...]
使用“svnadmin help <subcommand>” 得到子命令的帮助信息。
使用“svnadmin --version”查看程序的版本号和文件系统模块。

可用的子命令: 
   crashtest
   create
   deltify
   dump
   help (?, h)
   hotcopy
   list-dblogs
   list-unused-dblogs
   load
   lslocks
   lstxns
   pack
   recover
   rmlocks
   rmtxns
   setlog
   setrevprop
   setuuid
   upgrade
   verify

[root@svn ~]# svnadmin help create
create: 用法: svnadmin create REPOS_PATH

在 REPOS_PATH 创建一个新的空版本库。

有效选项: 
  --bdb-txn-nosync         : 在提交事务时禁用fsync [BDB]
  --bdb-log-keep           : 禁用自动删除日志文件 [BDB]
  --config-dir ARG         : 从目录 ARG 读取用户配置文件
  --fs-type ARG            : 版本库类型: “fsfs”(默认)或“bdb”
  --pre-1.4-compatible     : 使用与1.4之前版本兼容的格式
  --pre-1.5-compatible     : 使用 Subversion 1.5 之前版本的格式
  --pre-1.6-compatible     : 使用与 1.6 之前版本兼容的格式

修改配置文件,允许用户zhang读写访问

[root@svn ~]# cd /application/svndata/sadoc/conf/
[root@svn conf]# /bin/cp svnserve.conf svnserve.conf.zhang.$(date +%F)   先备份在修改svnserve.conf
# anon-access = read   12行
# auth-access = write   13行
# password-db = passwd 18行
# authz-db = authz     25行
改为
anon-access = none
auth-access = write
password-db = /application/svnpasswd/passwd
authz-db = /application/svnpasswd/authz
------------------------------------------------------------------------------------------
快速修改:
sed -i \'s/# anon-access = read/anon-access = none/\' /application/svndata/sadoc/conf/svnserve.conf
sed -i \'s/# auth-access = write/auth-access = write/\' /application/svndata/sadoc/conf/svnserve.conf
sed -i \'s/# password-db = passwd/password-db = /application/svnpasswd/passwd/\' /application/svndata/sadoc/conf/svnserve.conf
sed -i \'s/# authz-db = authz/authz-db = /application/svnpasswd/authz/\' /application/svndata/sadoc/conf/svnserve.conf

查看一下,egrep可以同时过滤两个关键字符,相当于grep –E

[root@svn conf]# egrep "\\-access|\\db =" svnserve.conf
anon-access = none
auth-access = write
password-db = /application/svnpasswd/passwd
authz-db = /application/svnpasswd/authz

实现刚才修改的内容

[root@svn conf]# cp authz passwd /application/svnpasswd/
[root@svn conf]# ll /application/svnpasswd/
总用量 8
-rw-r--r--. 1 root root 1080 11月 12 01:25 authz
-rw-r--r--. 1 root root  309 11月 12 01:25 passwd

改权限

[root@svn conf]# chmod 700 /application/svnpasswd/*
[root@svn conf]# ll /application/svnpasswd/        
总用量 8
-rwx------. 1 root root 1080 11月 12 01:25 authz
-rwx------. 1 root root  309 11月 12 01:25 passwd

编辑passwd和authz

1)    vim /application/svnpasswd/passwd
增加:
zhang = 123456
test = 123456

2)    vim /application/svnpasswd/authz
增加:
#groups
zhang_sa = zhang,test1
zhang_wangguan = test
#project
[sadoc:/]  #set project 
@zhang_sa = rw
@zhang_wangguan = r
test = r
重启svn
[root@svn svnpasswd]# pkill svnserve
[root@svn svnpasswd]# killall svnserve
svnserve: 没有进程被杀死
[root@svn svnpasswd]# killall svnserve
-bash: kill: all: arguments must be process or job IDs
-bash: kill: svnserve: arguments must be process or job IDs
[root@svn svnpasswd]# svnserve -d -r /application/svndata/
[root@svn svnpasswd]# ps -ef|grep svn
root      4225     1  0 18:46 ?        00:00:00 svnserve -d -r /application/svndata/
root      4227  1824  0 18:46 pts/1    00:00:00 grep svn


74  yum install subversion –y

   75  rpm -qa subversion

   76  mkdir -p /application/{svndata,svnpasswd}

   77  svnserve -d -r /application/svndata/

   78  ps -ef |grep svn|grep -v grep

   79  netstat -lntup|grep svn

   80  svnadmin create /application/svndata/sadoc

   81  ll /application/svndata/sadoc

   82   cd /application/svndata/sadoc/conf/

   83  /bin/cp svnserve.conf svnserve.conf.zhang.$(date +%F)

   84  ll

   85  vi svnserve.conf

   86  egrep "\\-access|\\db =" svnserve.conf

   87  ll

   88  cp authz passwd /application/svnpasswd/

   89  chmod 700 /application/svnpasswd/*

   90  vim /application/svnpasswd/passwd

   91  vim /application/svnpasswd/authz

   92  pkill svnserve

   93  kill all svnserve

   94  svnserve -d -r /application/svndata/

   95  ps -ef|grep svn

   96  svnserve -d --listen-port

   97  svnserve --listen-port

   98  history


3.   客户端安装TortoiseSVN

安装完毕后2008需重启。

(1)建立一个工作目录,如 。

(2)在工作目录中,选择TortoiseSVN右键菜单“SVN检出”,显示检出对话框,输入cnpack版本库url,检出目录设定为工作目录下的cnpack目录。

输入在svn的passwd里配置的用户名密码,复选框:Save authertication的意思是tortoiseSVN在subversion内的缺省目录(%APPDATA%\\Subversion\\auth)的三个子目录内保存认证信息。

  • svn.simple包含了基本认证方式所需要的认证信息(用户名和密码),密文保存
  • svn.ssl.server包含了SSL信息
  • svn.username里包含了用户名认证的认证信息

如果想清楚服务器的认证缓存,可以通过TortoiseSVN设置对话框的已保存数据页来实现。如果想清除某一个范围的认证信息,则需要打开那些目录,找到包含要清除的信息的文件并删除。

查看服务器上的内容:

 

上传和更新在文件的上级目录,即(1)中新建的那个工作目录。

 


 

3.   svn命令行的使用说明

3.1.  导入svn原始目录树

[root@svn ~]# mkdir /data/zhang -p
[root@svn ~]# cd /data/zhang/;mkdir trunk branch tags –p      #主干,分支,标记#
[root@svn zhang]# tree 
.
├── branch
├── tags
└── trunk

3 directories, 0 files

导入svn

网络导入
[root@svn zhang]# svn import /data/zhang svn://192.168.233.150/sadoc/ -m "imp tree" #网络导入 认证领域: <svn://192.168.233.150:3690> 6145f20f-3d6d-40b2-841c-abfdff973c0f “root”的密码: 认证领域: <svn://192.168.233.150:3690> 6145f20f-3d6d-40b2-841c-abfdff973c0f 用户名: zhang “zhang”的密码:
本地导入
svn import /data/zhang/ file:///application/svndata/sadoc/
svn import /data/zhang/ svn://192.168.233.150/sadoc/

注意!  你的密码,对于认证域:

   <svn://192.168.233.150:3690> 6145f20f-3d6d-40b2-841c-abfdff973c0f

只能明文保存在磁盘上!  如果可能的话,请考虑配置你的系统,让 Subversion
可以保存加密后的密码。请参阅文档以获得详细信息。

你可以通过在“/root/.subversion/servers”中设置选项“store-plaintext-passwords”为“yes”或“no”,
来避免再次出现此警告。
-----------------------------------------------------------------------
保存未加密的密码(yes/no)?yes
增加           /data/zhang/trunk
增加           /data/zhang/branch
增加           /data/zhang/tags

提交后的版本为 2

3.2.  从svn库提取数据(Linux为客户端)

二次更新时可不加用户名密码

#svn checkout svn://192.168.233.150/sadoc /data/test --username zhang --password 123456

4.   svn钩子

钩子脚本的具体写法就是操作系统shell脚本程序的写法,可以根据自己svn所在的操作系统和shell程序进行相应的开发,钩子脚本就是被某些版本库事件触发的程序,例如创建新版本或修改为被版本控制的属性,每个钩子都存储足够的信息来了解发生的事件,操作对象以及触发事件用户的账号,根据钩子的输出或者返回的状态,钩子程序能够以某种方式控制该动作是否继续执行,停止或挂起。默认情况下钩子的子目录中包含各种版本库钩子模板。

查看钩子库

#ls -l /application/svndata/sadoc/hooks

常用应用

  • 限制上传文件扩展名及大小
  • SVN更新自动周知,途径有MSN,邮件或者短信
  • SVN更新触发实时rsync。

 

以上是关于版本控制系统-SVN的主要内容,如果未能解决你的问题,请参考以下文章

svn在项目开发过程中到底有啥作用呢 怎么叫版本控制呢?还有自己可以用它看到别人的代码吗???

SVN版本管理与大型代码上线

TortoiseSVN与VisualSVN Server搭建SVN版本控制系统

SVN版本控制服务 搭建与使用

工作中可能用到的——集中式版本控制系统SVN

工作中可能用到的——集中式版本控制系统SVN