盘点Linux常用运维工具(四)-版本控制篇之SVN

2020-03-26 20:07:00 浏览数 (1)

1.SVN简介和使用

代码语言:javascript复制
SVN是Subversion的简称,是一个开放源代码的版本控制系统,设计的目标就是取代CVS,相当于CVS,SVN采用了分支管理系统

扩展:
CVS是一个C(client)/S(server)系统,是一个常用的代码版本控制软件,CVS版本控制系统是一种GUN软件包,主要用于在多人开发环境下的源码的维护,之前由于CVS编码问题,很多软件开发公司使用SVN替代了CVS

官方网站:http://subversion.apache.org/  

#常见的版本控制软件

代码语言:javascript复制
1.CVS:逐渐被SVN取代
2.SVN:Subversion是一个集中式的版本控制系统
3.Git:git是一个开源的分布式版本控制系统
4.GitLab: GitLab是利用 Ruby on Rails 一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目

#SVN存储数据的方式

代码语言:javascript复制
1.BDB,Berkeley DB,一种事务安全型表类型
2.FSFS,"FSFS" 采用文件系统的方式, 替代原来的基于Berkeley DB的实现.
因为BDB方式在服务器中断时,有可能锁住数据,所以还是FSFS方式更安全一点。

#SVN运行的相关端口

代码语言:javascript复制
独立服务器       3690端口    访问方式SVN://    C/S模式
借助Apache运行    80端口    访问方式http://    

#基本的工作流程

代码语言:javascript复制
1.开发人员从服务器下载项目最新代码
2.进入自己的分支,进行开发工作,隔多久向服务器提交自己的代码
3.下班就把自己开发的分支合并到服务器主分支上

#安装和部署

#1.安装

代码语言:javascript复制
[root@ctos1 ~]# yum install -y subversion

#2.查看svn对应的端口有哪些

代码语言:javascript复制
[root@ctos1 ~]# cat /etc/services  | grep svn
svn             3690/tcp                     # Subversion
svn             3690/udp                     # Subversion
svnetworks      2973/tcp                     # SV Networks
svnetworks      2973/udp                     # SV Networks

#3.创建版本库目录

代码语言:javascript复制
[root@ctos1 ~]# mkdir /webdept  #存放版本库的主目录
[root@ctos1 ~]# svnadmin  create /webdept/www.guokeboy.cn #创建版本库
[root@ctos1 ~]# svnadmin  create /webdept/www.boyguoke.cn #创建第二个版本库
#提示:svnadmin命令是由subversion软件包提供的

#4.查看版本库中的配置文件

代码语言:javascript复制
[root@ctos1 ~]# ls /webdept/www.guokeboy.cn/
conf  db  format  hooks  locks  README.txt

#配置文件说明
dav目录     是提供Apache与mod_dav_svn使用的目录,让他们存储内部数据,刚开始新建时没有
db目录      所有版本控制的数据存放文件
Hooks目录   放置hook脚本文件的目录
locks目录   用来放置subversion监控锁定数据的目录,用来追踪存取文件库的客户端
format文    是一个文本文件
conf目录    是这个仓库的配置文件

#5.查看配置文件目录下的各个文件

代码语言:javascript复制
[root@ctos1 ~]# ls /webdept/www.guokeboy.cn/conf/
authz  passwd  svnserve.conf
[root@ctos1 ~]# ls -l /webdept/www.guokeboy.cn/conf/
total 12
-rw-r--r-- 1 root root 1080 Mar 24 23:21 authz
-rw-r--r-- 1 root root  309 Mar 24 23:21 passwd
-rw-r--r-- 1 root root 3090 Mar 24 23:21 svnserve.conf
#配置文件说明:
authz          #认证权限相关
passwd         #存放用户名和密码文件
svnserve.conf  #服务器配置文件

#6.进行配置使用

代码语言:javascript复制
[root@ctos1 conf]# pwd
/webdept/www.guokeboy.cn/conf
[root@ctos1 conf]# vim svnserve.conf 
[general]
anon-access = read   #打开注释,匿名用户访问可以读,如果是none就是匿名用户不可以访问
auth-access = write  #打开注释,用户认证可以写,可以是read,write,none
password-db = passwd #打开注释,密码库文件,默认使用的是同一目录下的passwd文件作为用户密码库
authz-db = authz     #打开注释,认证权限文件
realm = www.guokeboy.cn  #打开注释,设置登录提示信息

#7.配置用户和密码

代码语言:javascript复制
[root@ctos1 conf]# cat passwd 
[users]
guoke = 123456
top = 123456

#8.配置权限

代码语言:javascript复制
[root@ctos1 conf]# cat authz 
[groups]
Check = guoke  #定义组,在[groups下面添加],格式:用户组名=用户1,用户2

[/]   #/表示当前所在版本库目录,这里代表www.guokeboy.cn
top = rw   #top用户可以读写
@Check = r #Check组的权限,只读
*=    #其他成员没有权限

#目录格式:
[/目录名]
@用户组名 = 权限
用户名 = 权限
*=

#9.启动服务和查看相关进程

代码语言:javascript复制
[root@ctos1 conf]# svnserve -d -r /webdept/
 #启动了所有版本库, 再 –r。如果只需要某一个版本库,后面添加/webdept/www.xuegod.cn/的版本库即可   -d=daemon -r=root of directory of save指定根目录

#10.查看进程

代码语言:javascript复制
[root@ctos1 conf]# ps aux | grep svn
root       1769  0.0  0.0 180736   808 ?        Ss   23:30   0:00 svnserve -d -r /webdept/
root       1771  0.0  0.0 112712   952 pts/0    R    23:30   0:00 grep --color=auto svn

#11.查看端口

代码语言:javascript复制
[root@ctos1 conf]# netstat -untpl | grep svn
tcp        0      0 0.0.0.0:3690            0.0.0.0:*               LISTEN      1769/svnserve

#12.使用svn导入测试代码

代码语言:javascript复制
#导入代码格式:svn[选项] 源码 svn://server ip/项目名
#常用的选项
    Import    将未版本化的文件纳入版本控制并提交
    Checkout    从版本库中检出一个修订版
    Update    更新工作拷贝
    Add,delete,copy move    增、删、复制、移动文件或目录
    Status    检查状态差异
    Diff    检查文件行级详细差异
    Revert    恢复
    Resolve    解决冲突
    Switch    切换工作拷贝对应的版本库分支
    Log    查看历史记录
    List    显示文件目录
    Cat    查看某个文件内容

#SVN更多帮助命令

代码语言:javascript复制
[root@ctos1 conf]# svn help
usage: svn <subcommand> [options] [args]
Subversion command-line client, version 1.7.14.
Type 'svn help <subcommand>' for help on a specific subcommand.
Type 'svn --version' to see the program version and RA modules
  or 'svn --version --quiet' to see just the version number.

Most subcommands take file and/or directory arguments, recursing
on the directories.  If no arguments are supplied to such a
command, it recurses on the current directory (inclusive) by default.

Available subcommands:
   add
   blame (praise, annotate, ann)
   cat
   changelist (cl)
   checkout (co)
   cleanup
   commit (ci)
   copy (cp)
   delete (del, remove, rm)
   diff (di)
   export
   help (?, h)
   import
   info
   list (ls)
   lock
   log
   merge
   mergeinfo
   mkdir
   move (mv, rename, ren)
   patch
   propdel (pdel, pd)
   propedit (pedit, pe)
   propget (pget, pg)
   proplist (plist, pl)
   propset (pset, ps)
   relocate
   resolve
   resolved
   revert
   status (stat, st)
   switch (sw)
   unlock
   update (up)
   upgrade

Subversion is a tool for version control.
For additional information, see http://subversion.apache.org/
代码语言:javascript复制
[root@ctos1 ~]# mkdir  localsvn
[root@ctos1 ~]# cd localsvn/
[root@ctos1 localsvn]# touch 1.html 2.html
[root@ctos1 localsvn]# cd
[root@ctos1 ~]# svn import /root/localsvn/ file:///webdept/www.guokeboy.cn/ -m "first edit"
Adding         localsvn/1.html
Adding         localsvn/2.html

Committed revision 1.
 //本地导入代码,使用file,仅仅能在服务器本地导入, -m=messages,类似注释,首次加入代码使用import
 

#13.下载代码

代码语言:javascript复制
[root@ctos1 ~]# svn checkout  svn://192.168.86.128/www.guokeboy.cn/ test
Authentication realm: <svn://192.168.86.128:3690> www.guokeboy.cn
Password for 'root':  #默认回车
Authentication realm: <svn://192.168.86.128:3690> www.guokeboy.cn
Username: guoke #输入用户
Password for 'guoke':   #输入密码

-----------------------------------------------------------------------
ATTENTION!  Your password for authentication realm:

   <svn://192.168.86.128:3690> www.guokeboy.cn

can only be stored to disk unencrypted!  You are advised to configure
your system so that Subversion can store passwords encrypted, if
possible.  See the documentation for details.

You can avoid future appearances of this warning by setting the value
of the 'store-plaintext-passwords' option to either 'yes' or 'no' in
'/root/.subversion/servers'.
-----------------------------------------------------------------------
Store password unencrypted (yes/no)? no #需不需要保存密码
A    test/1.html
A    test/2.html
Checked out revision 1.

#14.开发然后提交代码

代码语言:javascript复制
[root@ctos1 ~]# ls
localsvn  test
[root@ctos1 ~]# cd test/ #进入下载代码的目录
[root@ctos1 test]# touch 5.html  #自己开发代码
[root@ctos1 test]# svn add 5.html #添加到暂存区
A         5.html
[root@ctos1 test]# svn commit -m "new edit" #进行提交,
Authentication realm: <svn://192.168.86.128:3690> www.guokeboy.cn
Password for 'guoke': 
Authentication realm: <svn://192.168.86.128:3690> www.guokeboy.cn
Username: top
Password for 'top': 
#注意点:设置用户权限的时候guoke这个用户只有只读权限,没有写权限,如果使用这个用户来进行提交的话,就会报错
所有我们需要更换别的有写的权限的用户来进行提交
-----------------------------------------------------------------------
ATTENTION!  Your password for authentication realm:

   <svn://192.168.86.128:3690> www.guokeboy.cn

can only be stored to disk unencrypted!  You are advised to configure
your system so that Subversion can store passwords encrypted, if
possible.  See the documentation for details.

You can avoid future appearances of this warning by setting the value
of the 'store-plaintext-passwords' option to either 'yes' or 'no' in
'/root/.subversion/servers'.
-----------------------------------------------------------------------
Store password unencrypted (yes/no)? no 
Adding         5.html
Transmitting file data .
Committed revision 2.

2.SVN Apache使用

#运行原理

代码语言:javascript复制
SVN搭配Apache的时候,Apache需要使用mod_dav_svn这个模块,

#运行机制

代码语言:javascript复制
#需要在一台服务器上建立一个源代码库,在用户使用源代码库之前,需要把源代码库里的项目文件下载到本地,然后进行开发,再使用svn进行提交,由源代码库统一管理修改,mod_dav_svn 可以让版本库通过http协议实现网站展现

#实验环境 一台:svn http服务器 一台:client server客户端服务器

#配置

#1.安装软件

代码语言:javascript复制
[root@ctos1 ~]# yum install -y subversion httpd mod_dav_svn

#2.查看apache对svn模块的支持

代码语言:javascript复制
[root@ctos1 ~]# cd /etc/httpd/conf.modules.d/
[root@ctos1 conf.modules.d]# cat 10-subversion.conf 
LoadModule dav_svn_module     modules/mod_dav_svn.so
LoadModule authz_svn_module   modules/mod_authz_svn.so
LoadModule dontdothat_module  modules/mod_dontdothat.so

[root@ctos1 ~]# ls /etc/httpd/modules/mod_dav_svn.so  /etc/httpd/modules/mod_authz_svn.so 
/etc/httpd/modules/mod_authz_svn.so  /etc/httpd/modules/mod_dav_svn.so
#两个模块对应的物理路径

#3.配置apache支持svn

代码语言:javascript复制
[root@ctos1 conf.d]# pwd
/etc/httpd/conf.d
[root@ctos1 conf.d]# cat subversion.conf 
<Location /webdept>
    DAV svn
    SVNParentPath /webdept
    AuthType Basic
    AuthName "www.guokeboy.cn website"
    AuthUserFile /webdept/svn/passwd
    AuthzSVNAccessFile /webdept/svn/authz
    Require valid-user
</Location>

#内容解释:

代码语言:javascript复制
SVNParentPath /webdept                 #svn根目录
AuthType Basic                         #basic认证方式
AuthName "www.skills.com website"      #提示信息
AuthUserFile /webdept/svn/passwd       #用户密码文件
AuthzSVNAccessFile /webdept/svn/authz  #访问控制权限文件
Require valid-user                     #允许的用户 

#4.创建用户passwd文件

代码语言:javascript复制
[root@ctos1 ~]# mkdir /webdept/svn
[root@ctos1 ~]# htpasswd -c /webdept/svn/passwd user1
New password: 
Re-type new password: 
Adding password for user user1
[root@ctos1 ~]# htpasswd  /webdept/svn/passwd user2
New password: 
Re-type new password: 
Adding password for user user2
[root@ctos1 ~]# htpasswd  /webdept/svn/passwd user3
New password: 
Re-type new password: 
Adding password for user user3
[root@ctos1 ~]# cat /webdept/svn/passwd 
user1:$apr1$uCWFxUQh$6tdbjdjf5O0y301vJg9wn.
user2:$apr1$DAFkK6m/$JWUQkIccwRswDVM8Sy2WM1
user3:$apr1$bJ1LWahb$uIOk6BjrI8FN7fCrmv5Ww1

#提示:使用htpasswd创建用户的时候,第一次需要使用-c创建,创建第二个用户的时候不能使用-c,否则内容会被覆盖,而不是追加

#5.创建权限authz文件

代码语言:javascript复制
[root@ctos1 ~]# cd /webdept/svn/
[root@ctos1 svn]# ls
authz  passwd
[root@ctos1 svn]# cat authz 
[groups]

all= user1,user2

[/]
user1 = rw

[www.guokeboy.cn:/]
@all = rw

[www.boyguoke.cn:/]
user2 = rw
user3 = rw

#内容解释:

代码语言:javascript复制
all = user1,user2          #user1,user2属于all组
[www.guokeboy.cn:/] 
@all = rw                    #这个仓库,user1,user2可以读写
[www.boyguoke.cn:/]
user2 = rw
user3 = rw #这个仓库user2,user3可以读写

#6.启动服务然后进行测试

代码语言:javascript复制
[root@ctos1 ~]# systemctl restart httpd

#7.访问:

http://192.168.86.128/webdept/www.guokeboy.cn仓库的时候使用user2登录,可以读写

#8.使用user3访问www.guokeboy.cn仓库的时候就会报错

3.window客户端使用

#下载链接:http://tortoisesvn.net/downloads.html

#1安装完之后在自己磁盘中创建目录,然后checkout下来,如我在D创建了svn workdirect目录

#2.输入仓库的URL地址

#3.输入用户名和密码进行认证

#4.将文件checkout到本地目录

#5.进行开发,然后再提交

#6.然后进行commit提交

#提示:按ok提交的时候有可能需要一个有写入权限的用户,还需要将仓库文件修改为apache权限

[root@ctos1 ~]# chown -R apache.apache /webdept/www.guokeboy.cn/

0 人点赞