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/