<服务>SVN

时间:Feb. 21, 2017 分类:

目录:

SVN

SVN介绍

SVN是近年来非常优秀的版本管理工具,和CVS管理工具一样,是一个跨平台的开源的版本控制系统,SVN版本管理工具管理随着时间改变各种数据,这些数据放置在一个中央的档案库中,这个档案库可以是一个文件服务器,也可以是一个ftp服务器,与其他服务器不同的是SVN会备份每个文件的每一次修改的更新变动,这样我们就可以把任意一个时间点的档案恢复到想要的某一个旧版本,我们也可以直接浏览指定文件的更新历史记录。

官网链接http://subversion.apache.org/

SVN和GIT的区别

SVN

SVN是一个集中式的数据管理,存在一个中央版本控制库,所有的开发人员所使用的代码都来自这个版本库,提交代码也都必须提交到这个版本库

SVN控制系统工作的流程

  1. 在中央库上创建或者从主干上复制一个分支
  2. 从中央库check out下这个分支的代码
  3. 增加自己的代码文件,修改现存的代码或删除代码文件
  4. commit代码,假设有人在刚刚的分支上提交了代码,你就会提示代码过期
  5. 如果up代码后再提交,up代码的时候如果出现冲突,就需要解决冲突问题再提交

SVN的缺点

  1. 当你无法连接到中央版本库的环境下,你就无法提交代码,将代码加入版本控制
  2. 数据存储不透明
  3. 由于代码库集中管理,中央版本库的存储需要做备份

git

git是由Linus开发的,与linux系统紧密结合,以至于在windows上必须通过cygwin才能使其完美的工作,并且git为分布式版本控制系统,没有中央版本库,开发者本地也包含一个完整的git库,从某种程度上讲,本地的仓库和远程的仓库在身份上是等价的,没有主次之分。

git工作的流程

  1. 在本地创建一个git库,然后将其添加到远程的git库中
  2. 在本地添加或删除文件,通过commit提交到本地的git库中
  3. 将本地git库中的分支push到远程git的分支,如果远程git库有别人push过,那么远程git库将不允许你push,这时就需要先git到本地库中,再push到远程git库中

企业应用场景

SVN是主流的版本控制软件,需要了解安装,部署,维护和排除故障等问题,以及简单的使用,包括建立仓库和添加删除账号。

SVN服务的运行模式与访问方式

SVN服务端运行模式

  1. 独立服务器访问,访问地址为svn://ip地址/sadoc
  2. 借助apache等http服务,访问地址为http://ip地址/sadoc,单独安装apache+svn或CSVN一套整合软件,带web页面
  3. 直接访问,访问地址为file:///svn/svndata/sadoc

SVN客户端访问

访问方式是根据服务端运行方式决定 file,http,https,svn和svn+ssh等

SVN档案库的数据格式

SVN的存储版本数据有两种方式,BDB(一种事务安全型表类型)和FSFS(一种不需要数据库的存储系统),因为BDB方式可能在服务器中断的时候锁住数据,所以还是用FSFS方式更加安全一些。

  • BDB(Berkeley DB)版本库可以使用一种经过充分测试的后台数据库实现,不能通过网络共享的文件系统上使用,BDB为1.2版本以前的缺省版本库格式。

  • FSFS(FS_FS)是一个专用于Subversion版本的文件系统后端,存储为二进制,可以使用网络文件系统,例如NFS或SMBFS等,是1.2版本以后的缺省版本库格式

CVS是一个基于RCS文件的版本控制系统,每个CVS文件都不过是普通的文件,加上一些额外的信息,这些文件会简单的重复本地文件的树结构,不会有数据损失的风险

SVN解决了并行读写共享文件以及添加运行实时事务的特性,不过数据存储从此变得不透明,不能看到实体文件。

SVN日常使用流程

  1. 首先使用SVN服务器下载项目最新代码
  2. 进入自己的分支进行开发工作,完成一个部分向服务器上自己的分支提交一次代码
  3. 最后把自己分支合并到服务器主分支上

缺点:

  1. 由于每次提交都会保留一个原始版本,因此SVN数据库容量暴增
  2. 如果不能连接到SVN服务器,基本上不能工作,无法提交,还原,对比等
  3. 不适合开源系统的开发,即多人开发

优点:

  1. 管理方便,逻辑清晰
  2. 易于管理,集中式svn保证数据安全性
  3. 代码一致性高
  4. 适合开发人数不多的情况
  5. 普及度高

安装SVN

SVN的安装

一般我们认为功能型的软件用yum,性能型的软件用编译安装,SVN就属于功能型软件。

[root@why-1 ~]# yum search subversion

如果需要保留yum的软件包,可以修改/etc/yum.conf中的keepcache修改为1,默认为0

SVN的配置

[root@why-1 ~]# mkdir /usr/local/svndata            #数据存储的根目录
[root@why-1 ~]# mkdir /usr/local/svnpasswd          #用户及密码的权限目录

SVN的启动

[root@why-1 ~]# 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                : 显示程序版本信息

其中-d和-r是常用的。

[root@why-1 ~]# svnserve -d -r /usr/local/svndata
[root@why-1 ~]# ps -ef | grep svn
root     16973     1  0 01:11 ?        00:00:00 svnserve -d -r /usr/local/svndata
root     16975 16890  0 01:11 pts/2    00:00:00 grep svn
[root@why-1 ~]# netstat -nlptu | grep 3690
tcp        0      0 0.0.0.0:3690                0.0.0.0:*                   LISTEN      16973/svnserve      

配置SVN

建立项目版本库

我们可以创建多个项目版本库,下边以一个为例进行介绍,svn类似mysql的帮助

[root@why-1 ~]# 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@why-1 ~]# 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 之前版本兼容的格式

创建一个项目

[root@why-1 ~]# svnadmin create /usr/local/svndata/whysite
[root@why-1 ~]# ll /usr/local/svndata/
总用量 4
drwxr-xr-x 6 root root 4096 2月  14 01:18 whysite
[root@why-1 ~]# tree /usr/local/svndata/
/usr/local/svndata/
└── whysite
    ├── conf
    │   ├── authz
    │   ├── passwd
    │   └── svnserve.conf
    ├── db
    │   ├── current
    │   ├── format
    │   ├── fsfs.conf
    │   ├── fs-type
    │   ├── min-unpacked-rev
    │   ├── rep-cache.db
    │   ├── revprops
    │   │   └── 0
    │   │       └── 0
    │   ├── revs
    │   │   └── 0
    │   │       └── 0
    │   ├── transactions
    │   ├── txn-current
    │   ├── txn-current-lock
    │   ├── txn-protorevs
    │   ├── uuid
    │   └── write-lock
    ├── format
    ├── 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
    ├── locks
    │   ├── db.lock
    │   └── db-logs.lock
    └── README.txt

11 directories, 28 files

包含配置,db,格式和锁等。

[root@why-1 ~]# cd /usr/local/svndata/whysite/conf/
[root@why-1 conf]# ll
总用量 12
-rw-r--r-- 1 root root 1080 2月  14 01:18 authz         #权限管理文件
-rw-r--r-- 1 root root  309 2月  14 01:18 passwd        #用户和密码文件
-rw-r--r-- 1 root root 2279 2月  14 01:18 svnserve.conf #主配置文件,包含上面两个文件

配置主配置文件

[root@why-1 conf]# cp svnserve.conf svnserve.conf.old
[root@why-1 conf]# vi svnserve.conf
[root@why-1 conf]# diff svnserve.conf svnserve.conf.old 
12,13c12,13
< anon-access = none
< auth-access = write
---
> # anon-access = read
> # auth-access = write
20c20
< password-db = /usr/local/svnpasswd/passwd
---
> # password-db = passwd
27c27
< authz-db = /usr/local/svnpasswd/authz
---
> # authz-db = authz
[root@why-1 conf]# cp passwd authz /usr/local/svnpasswd/
[root@why-1 conf]# chmod 700 /usr/local/svnpasswd/*

配置密码文件

[root@why-1 conf]# vi /usr/local/svnpasswd/passwd
按照格式在[user]标签下添加用户名密码即可
why = 123456
mabiao = 654321
pqt = 654321

配置权限文件

[root@why-1 conf]# vi /usr/local/svnpasswd/authz
readgroup = mabiao,pqt
[whysite:/]
why = rw 
@readgroup = r
格式
[版本库:/项目/目录]
@用户组名=权限
用户名=权限
[/]表示根目录及以下,通过启动时时指定,即对全部版本库欧设置权限
[repos:/]表示对版本库repo有设置权限
[repos:/whysite]表示对版本库中的whysite项目有设置权限
[repos:/whysite/blog]表示对版本库中的whysite项目的blog目录有设置权限
权限主体可以是用户,用户组和`*`,用户组前加@,*代表全部用户
权限可以是w,r,wr和空
作为测试我在[groups]标签下添加了一下权限

配置生效

另外说一下,修改svnserve.conf需要重启生效,而修改passwd和authz文件不需要重启即可生效

[root@why-1 conf]# pkill svnserve 
[root@why-1 conf]# svnserve -d -r /usr/local/svndata

使用SVN

windows下使用svn

http://down10.zol.com.cn/wenjiangl/TortoiseSVNv1.9.5.27581.zip 64位操作系统使用,安装过程就不过多介绍了,选择适当的目录安装,选择下一步下一步就行。 我在windows上创建了一个目录,右击就会看到SVN checkout和TortoiseSVN,选择checkout

输入svnurl svn://192.168.0.201/whysite,我的svn服务器ip地址为192.168.0.201,项目为whysite,下边是svn的下载到本地的路径

输入用户名和密码,选择ok进行登录,下面勾选为保存用户名和密码

登录后显示当前项目版本为0

在测试目录下创建文件,然后进行commit

勾选要提交文件,中间的框中为提交的描述,点击ok提交

显示提交文件,如果是修改文件,则是蓝色的,提交新的文件为紫色,提交一个删除或者替换为深红色,其他项为黑色,另外显示当前项目版本为1

查看一下我们上传的文件,选择TortoiseSVN,然后选Repo-browser

可以看到我们刚上传的文件

windows下其他操作1

通过windows+R键打开windows运行,运行到%APPDATA%\Subversion\auth目录 可以看到一些目录,这些就是我们在登录的时候在缺省目录下的三个目录中保存认证信息

  • svn.simple目录里包含基本认证方式的认证信息,包括用户名和密码,密码保存是以WinCrypt API加密的,不是文本形式
  • svn.ssl.server里包含了ssl服务器证书
  • svn.username里包含了用户名认证的信息,不需要提供用户名和密码

windows下其他操作2

客户端密码删除可以在TortoiseSVN的setting中,有Saved Data进行清空,不过清空是清空所有,所以最好去svn.simple删除你想删除的

windows下其他操作3

查看历史版本可以在TortoiseSVN的show log查看 选择上方版本,双击下方修改的文件就可以对比提交的修改,也可以右击选择其他的对比或者打开等操作 以上python代码有误,应该是print 'mabiao'

windows下其他操作4

如果遇到svn库变化,可以在TortoiseSVN的relocate选项进行修改

Linux下使用svn

[root@why-1 conf]# svn help
用法: svn <subcommand> [options] [args]
Subversion 命令行客户端,版本 1.6.11。
使用“svn help <subcommand>” 显示子命令的帮助信息。
使用“svn --version”查看程序的版本号和版本库访问模块,或者
使用“svn --version --quiet”只查看程序的版本号。

大多数的子命令可接受文件或目录参数,对目录进行递归处理。
如果没有指定参数,默认对当前目录(包含当前目录)递归处理。

可用的子命令: 
   add
   blame (praise, annotate, ann)
   cat
   changelist (cl)
   checkout (co)            #从源码库取出一个工作版本的拷贝
   cleanup
   commit (ci)              #提交
   copy (cp)                #做一个工作拷贝
   delete (del, remove, rm) #删除一个本地或者svn server response的文件或者目录
   diff (di)                #比较文件和库中对应文件的不同
   export                   #导出一个无版本控制的目录树,一般用于导出发行或者上线
   help (?, h)
   import                   #将本地当前目录下文件导入svn response中
   info                     #当前目录工作拷贝中某文件信息,例如url,版本,修改日期等
   list (ls)                #列出当前工作拷贝下的文件
   lock
   log
   merge                    #将两个来源之间的差异应用到工作拷贝路径
   mergeinfo
   mkdir                    #在本地或者svn server创建目录
   move (mv, rename, ren)
   propdel (pdel, pd)
   propedit (pedit, pe)
   propget (pget, pg)
   proplist (plist, pl)
   propset (pset, ps)
   resolve
   resolved
   revert
   status (stat, st)
   switch (sw)
   unlock
   update (up)

Subversion 是版本控制工具。
欲取得详细资料,请参阅 http://subversion.tigris.org/

提取数据

[root@why-1 ~]# mkdir /svndata
[root@why-1 ~]# svn co svn://192.168.0.201/whysite /svndata/ --username=why --password=123456

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

   <svn://192.168.0.201:3690> 81071893-52d7-4118-9722-886b2e7ea6a0

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

你可以通过在“/root/.subversion/servers”中设置选项“store-plaintext-passwords”为“yes”或“no”,
来避免再次出现此警告。
-----------------------------------------------------------------------
保存未加密的密码(yes/no)?yes
A    /svndata/test.py
取出版本 2。

然后在windows中修改,并提交后在linux端进行更新

[root@why-1 ~]# svn update svn://192.168.0.201/whysite /svndata/ --username=why --password=123456
跳过“svn://192.168.0.201/whysite”
U    /svndata/test.py
更新到版本 3。
冲突概要:
  跳过的路径:1
当然本地客户端也可以通过file方式
[root@why-1 ~]# svn co file:///usr/local/svndata/whysite
A    whysite/test.py
取出版本 3。

Linux客户端默认是不支持中文的,如果有中文名称文件会下载不下来,需要调整字符集

export LC_CTYPE="en_US.UTF-8"       #修改字符源码
export LC_ALL=                      
locale

当然也可以调整为LANG=gb2312

提交

[root@why-1 ~]# cd /svndata/
[root@why-1 svndata]# svn ls svn://192.168.0.201/whysite /svndata/ --username=why --password=123456
test.py
[root@why-1 svndata]# svn ls svn://192.168.0.201/whysite /svndata/ --username=why --password=123456 --verbose
      3 why                   2月 14 03:45 ./
      3 why                11 2月 14 03:45 test.py
[root@why-1 svndata]# cat test.py 
print 'why'

然后我通过在windows上修改文件test.py内容为print 'yanwei',并且提交,再在linux下创建文件touch {a..f},此时我们的Linux客户端的版本为,因为我当前的版本与SVN服务器的版本不同

[root@why-1 svndata]# svn add {a..f}
A         a
A         b
A         c
A         d
A         e
A         f
[root@why-1 svndata]# svn ci 
svn: 提交失败(细节如下): 
svn: 无法使用外部编辑器获得日志信息;考虑设置环境变量 $SVN_EDITOR,或者使用 --message (-m) 或 --file (-F) 选项
svn: 没有设置 SVN_EDITOR,VISUAL 或 EDITOR 环境变量,运行时的配置参数中也没有 “editor-cmd” 选项
[root@why-1 svndata]# svn ci -m "test"
增加           a
增加           b
增加           c
增加           d
增加           e
增加           f
传输文件数据......
提交后的版本为 4

版本冲突测试

[root@why-1 svndata]# echo "print pqt" > test.py 
[root@why-1 svndata]# svn add test.py 
svn:  警告: “test.py”已纳入版本控制
[root@why-1 svndata]# svn ci -m "test2"
正在发送       test.py
传输文件数据.svn: 提交失败(细节如下): 
svn: 文件 “/test.py” 已经过时
这时test.py的版本为3.svn版本4中的test.py不一致,这时候就需要update
[root@why-1 svndata]# svn up svn://192.168.0.201/whysite /svndata/ --username=why --password=123456
跳过“svn://192.168.0.201/whysite”
在 “/svndata/test.py” 中发现冲突。
选择: (p) 推迟,(df) 显示全部差异,(e) 编辑,
        (mc) 我的版本, (tc) 他人的版本,
        (s) 显示全部选项: df                #我选择了df,显示全部差异
--- /svndata/.svn/text-base/test.py.svn-base    二 2月 14 04:14:41 2017
+++ /svndata/.svn/tmp/test.py.tmp   二 2月 14 04:35:42 2017
@@ -1 +1,4 @@
-print 'why'
\ No newline at end of file
+<<<<<<< .mine
+print 'pqt'
+=======
+print 'yanwei'>>>>>>> .r5
选择: (p) 推迟,(df) 显示全部差异,(e) 编辑,(r) 已解决,
        (mc) 我的版本, (tc) 他人的版本,
        (s) 显示全部选项: tc
G    /svndata/test.py
更新到版本 5。
冲突概要:
  跳过的路径:1
然后从新修改并提交。
一般开发都是各自负责各自的模块,在核心主文件上才会有这种问题,需要根据提交的描述,或者沟通这些内容。

创建分支

[root@why-3 svndata]# mkdir -p /svn/trunk /svn/branch /svn/tag
[root@why-3 svndata]# ll /svn
total 12
drwxr-xr-x 2 root root 4096 Feb 16 15:30 branch
drwxr-xr-x 2 root root 4096 Feb 16 15:30 tag
drwxr-xr-x 2 root root 4096 Feb 16 15:30 trunk
[root@why-3 svndata]# svn import /svn file:///usr/local/svndata/whysite -m "import"     #没有被版本管理的文件或者目录添加到版本控制
Adding         /svn/trunk
Adding         /svn/tag
Adding         /svn/branch

Committed revision 2.
[root@why-3 svndata]# svn copy svn://192.168.0.203/whysite/trunk svn://192.168.0.203/whysite/branch/branch_170216 -m "create a branch by why" --username=why --password=123456

Committed revision 3.

可以在windows中update,选择TortoiseSVN,然后选Repo-browser,也可以看到对应的branch。

对于运维人员来讲,可以把其他的开发人员的权限给到branch下,甚至具体的小分支上,防止新来的开发人员盗取代码等。

SVN的钩子脚本

SVN钩子脚本的介绍

SVN钩子脚本和shell脚本相同,是被某些版本库事件触发,例如创建新版本或修改未被版本控制的属性。最简单的钩子脚本就是版本更新后,进行远端数据同步。

SVN钩子脚本模板

这些钩子模板的后缀都为.tmpl代表模板

[root@why-3 svndata]# cd /usr/local/svndata/whysite/hooks/
[root@why-3 hooks]# ll
total 36
-rw-r--r-- 1 root root 1977 Feb 16 15:19 post-commit.tmpl               #提交模板
-rw-r--r-- 1 root root 1638 Feb 16 15:19 post-lock.tmpl                 #锁模板
-rw-r--r-- 1 root root 2289 Feb 16 15:19 post-revprop-change.tmpl
-rw-r--r-- 1 root root 1567 Feb 16 15:19 post-unlock.tmpl               #取消锁
-rw-r--r-- 1 root root 3426 Feb 16 15:19 pre-commit.tmpl                #预提交
-rw-r--r-- 1 root root 2410 Feb 16 15:19 pre-lock.tmpl
-rw-r--r-- 1 root root 2786 Feb 16 15:19 pre-revprop-change.tmpl
-rw-r--r-- 1 root root 2100 Feb 16 15:19 pre-unlock.tmpl
-rw-r--r-- 1 root root 2780 Feb 16 15:19 start-commit.tmpl              #开始提交

每个版本库都有这些模板,可以通过看脚本的内容,查看是什么事件触发了脚本,以及如何给脚本传递参数。不过由于在一个空环境中执行钩子脚本,就是没有环境变量,甚至没有$PATH或%PATH%,由于这些原因,在正常环境下可以执行的脚本在subversion中无法正常执行,所以最好指定绝对路径或环境变量

常用钩子脚本

  • post-commit在提交完成成功创建版本之后执行该钩子,提交已经完成,无法进行修改,因此脚本返回值结果被忽略,提交完成时触发事务
  • pre-commit提交完成前触发该脚本
  • start-commit在客户端还没有向服务器提交数据之前,即没有建立Subversion transaction之前执行此脚本,提交前触发该脚本

非常用钩子脚本

  • pre-revprop-change修改属性之前执行此脚本
  • post-revprop-change修改属性之后执行此脚本
  • pre-unlock文件解锁前执行此脚本
  • post-unlock文件解锁后执行此脚本
  • pre-lock文件加锁前执行此脚本
  • post-lock文件加锁后执行此脚本

钩子脚本案例

pre-commit限制上传文件的扩展名或大小 post-commit SVN更新后邮件提醒相关人员,触发checkout实时通过rsync等进行同步

实时同步

[root@why-3 hooks]# vi post-commit      #创建脚本
[root@why-3 hooks]# cat post-commit     
REPOS="$1"
REV="$2"


export LC_CTYPE="en_US.UTF-8"
export LC_ALL=

LOGPATH="/app/log"

[ ! -d ${LOGPATH} ] && mkdir ${LOGPATH} -p
#update content from svn
SVN=/usr/bin/svn
$SVN update svn:192.168.0.203/whysite /svn1 --username why --password 123456
if [ $? -eq 0 ]
then
    /usr/bin/rsync -az --delete /svn1 /svn2
fi

[root@why-3 hooks]# chmod 700 post-commit               #给予svn可执行权限
[root@why-3 hooks]# ll post-commit
-rwx------ 1 root root 2197 Feb 16 17:24 post-commit
[root@why-3 hooks]# cd
[root@why-3 ~]# yum install -y rsync
[root@why-3 ~]# mkdir /svn1 /svn2                       #创建同步目录svn1和svn2,由svn1同步到svn2
[root@why-3 ~]# /usr/bin/svn co svn://192.168.0.203/whysite /svn1 --username why --password 123456  #事先拉取数据
[root@why-3 ~]# cd /svndata/
[root@why-3 svndata]# touch rsync
[root@why-3 svndata]# svn add rsync 
A         rsync
[root@why-3 svndata]# svn ci -m "test rsync"
Adding         rsync
Transmitting file data .
Committed revision 4.
[root@why-3 svndata]# ll /svn1/
total 0
[root@why-3 svndata]# ll /svn2/
total 4
drwxr-xr-x 2 root root 4096 Feb 16 17:25 svn1

限制上传文件的扩展名或大小

这里要用到一个命令svnlook

[root@why-3 ~]# svnlook help  
general usage: svnlook SUBCOMMAND REPOS_PATH [ARGS & OPTIONS ...]
Note: any subcommand which takes the '--revision' and '--transaction'
      options will, if invoked without one of those options, act on
      the repository's youngest revision.
Type 'svnlook help <subcommand>' for help on a specific subcommand.
Type 'svnlook --version' to see the program version and FS modules.

Available subcommands:
   author
   cat
   changed
   date
   diff
   dirs-changed
   help (?, h)
   history
   info
   lock
   log
   propget (pget, pg)
   proplist (plist, pl)
   tree
   uuid
   youngest

[root@why-3 ~]# svnlook help log
log: usage: svnlook log REPOS_PATH

Print the log message.

Valid options:
  -r [--revision] ARG      : specify revision number ARG
  -t [--transaction] ARG   : specify transaction name ARG

代码

企业代码上线

一般企业每个项目会有trunk,branch和tags三个目录

  • trunk为主版本,只有在上线的时候才会合并提交
  • branch分支,为测试使用,几天以上的代码有分支,测试需要分支通过,合并到主版本合并到分支进行测试通过,最后才能合并到主线进行测试
  • tags为项目版本记录,可以理解为发布的存档

小型公司甚至直接上传测试环境由用户来测试,其实可以优化的点很多

  1. 在主机上搭建相应环境确认功能正常,无明显负载等变化,测试通过后再上线,如果有测试人员就更好了
  2. 程序代码上线要有规定时间,例如三天一次,更新尽可能在下午下班前一到两个小时
  3. 代码上线前要先备份,方便网站程序出了问题进行回滚,最简单的方式就是软链到不同日期的程序目录或者通过改名的方式,最好是有脚本
  4. 更严谨的就是分两组下线后进行更新后再上线,重复几次把所有的节点上线

再大点的中型网站就会有更多的流程

  1. 开发测试
  2. 测试人员测试或者自动化测试,包括内网外网测试
  3. 小点的更新由开发上线,大版本运维上线,这个上线前可能要领导批准
  4. 上线后如果有问题,需要有问题的严重级别区分,是否需要回滚

大型网站

  1. 开发人员每天进行修改代码,提交到trunk上,长期代码走上述branck的流程最后合并到trunk
  2. 办公内网测试,由开发人员或测试人员通过脚本或者jenkins等工具实现统一部署配置和代码到办公测试环境
  3. 测试人员测试,和开发人员协调,确认无误后定位tags版本,如果有问题按照测试不通过方式处理
  4. 根据tags版本checkout上线代码和配置推送到IDC管理服务器,进行编译或者打包等操作分发到IDC测试环境
  5. IDC测试环境没有问题,继续打好tag标记,注意与办公测试的描述不同,可以加上时间,如果有问题按照测试不通过方式处理
  6. 运维人员进行推送上线

在此内有几点要注意

  1. 最重要的是办公测试,IDC测试,IDC正式环境的操作系统,软件版本,依赖版本统一
  2. 办公测试,IDC测试,IDC正式环境的配置是不同的,基本是按照等比例的服务器配置设定
  3. 打包,tags描述,都要区分上述三种环境以及日期,可以精确到分钟
  4. 上线可以分两组上线,第一组下线,然后接到测试LVS上测试一下,通过再接到生产环境LVS,第二组同理,三组的话会出现新老版本同时存在的问题。
  5. 对于PHP程序可以直接推送更新,JAVA程序则需要下线进行更新,如果有前端DNS只能解析,还可以分地区上线,然后普及到全球服务器,这个是灰度发布,一般门户网站这么操作。
  6. 越往底层上线的间隔时间越长,前端可能每天都在上线
  7. 这是代码上线,静态的图片或者页面等都可以直接推送上线