SVN版本控制服务
SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于CVS,它采用了分支管理系统,它的设计目标就是取代CVS。互联网上很多版本控制服务已从CVS迁移到Subversion。也是就是CVS的接班人!
CVS是一个C/S系统,是一个常用的代码版本控制软件。主要在开源软件管理中使用。与它相类似的代码版本控制软件有subversion。多个开发人员通过一个中心版本控制系统来记录文件版本,从而达到保证文件同步的目的。CVS版本控制系统是一种GNU软件包,主要用于在多人开发环境下的源码的维护。但是由于之前CVS编码的问题,现在大多数软件开发公司都使用SVN替代了
CVS。
官方网站:http://subversion.apache.org/
Windows客户端 TortoiseSVN:http://tortoisesvn.net/
常见的版本控制软件
CVS,逐渐被SVN取代,是CVX重写版和改写版
SVN,Subversion
Git,Git是一个开源的分布式版本控制系统,用以有效、高速的处理从很小到非常大的项目版本管理。Git 是 Linus Torvalds (林纳斯·托瓦兹)为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件
GitLab版本管理
GitLab是利用 Ruby on Rails 一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。它拥有与Github类似的功能,能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历史库。团队成员可以利用内置的简单聊天程序(Wall)进行交流。它还提供一个代码片段收集功能可以轻松实现代码复用,便于日后有需要的时候进行查找
SVN存储数据的方式
BDB,Berkeley DB,一种事务安全型表类型
FSFS,“FSFS” 采用文件系统的方式, 替代原来的基于Berkeley DB的实现.
因为BDB方式在服务器中断时,有可能锁住数据,所以还是FSFS方式更安全一点。
SVN的运行方式及端口
独立服务器 3690端口 访问方式SVN:// C/S模式
借助apache运行 80端口 访问方式 http://
工作流程
集中式代码管理的核心是服务器,所有开发者在开始新一天的工作之前必须从服务器获取代码,然后开发,最后解决冲突,提交。所有的版本信息都放在服务器上。如果脱离了服务器,开发者基本上可以说是无法工作的。下面举例说明:开始新一天的工作:
1、从服务器下载项目组最新代码。
2、进入自己的分支,进行工作,每隔一个小时向服务器自己的分支提交一次代码
(很多人都有这个习惯。因为有时候自己对代码改来改去,最后又想还原到前一个小时的版本,或者看看前一个小时自己修改了哪些代码,就需要这样做了)。
3、下班时间快到了,把自己的分支合并到服务器主分支上,一天的工作完成,并反映给服务器。
这就是经典的svn工作流程.
SVN+Apache运行原理
SVN搭配Apache的时候,Apache需要使用mod_dav_svn这个模块,他的运行机制如下:
在一台服务器上建立一个源代码库,库里可以存放许多不同项目的源程序。有源代码库管理员统一管理这些源程序。
每个用户在使用源代码库之前,首先要把源代码库里的项目文件下载到本地,然后开发人员可以在本地修改,然后用svn命令进行提交,由源代码库统一管理修改。
mod_dav_svn 可以让版本库通过http协议实现网站展现
准备环境
SVN+HTTP Serve 39
Client Server 46
软件安装
[root@localhost ~]# yum install -y subversion httpd mod_dav_svn #包括HTTP所需模块一起装
#查看已注册端口
[root@localhost ~]# cat /etc/services | grep svn
svn 3690/tcp # Subversion
svn 3690/udp # Subversion
svnetworks 2973/tcp # SV Networks
svnetworks 2973/udp # SV Networks
svnet 3413/tcp # SpecView Networking
svnet 3413/udp # SpecView Networking
ml-svnet 4171/tcp # Maxlogic Supervisor Communication
创建版本库目录
[root@localhost ~]# mkdir /webdep #存放版本库的主目录
创建两个版本库
[root@localhost ~]# svnadmin create /webdep/test1
[root@localhost ~]# svnadmin create /webdep/test2
svnadmin命令是由subversion这个软件包提供的
[root@localhost ~]# ll /webdep/test1 #随便查看一个版本库
总用量 8
drwxr-xr-x. 2 root root 54 11月 1 18:30 conf 是这个仓库的配置文件(仓库的用户访问账号、权限等),也是我们要关注的配置文件
drwxr-sr-x. 6 root root 233 11月 1 18:30 db 就是所有版本控制的数据存放文件
-r--r--r--. 1 root root 2 11月 1 18:30 format 是一个文本文件,里面只放了一个整数。表示当前文件库配置的版本号
drwxr-xr-x. 2 root root 231 11月 1 18:30 hooks 放置hook脚本文件的目录
drwxr-xr-x. 2 root root 41 11月 1 18:30 locks 用来放置subversion监控锁定数据的目录,用来追踪存取文件库的客户端
-rw-r--r--. 1 root root 229 11月 1 18:30 README.txt
dav目录:是提供apache与mod_dav_svn使用的目录,让他们存储内部数据,刚开始新建时此目录没有
[root@localhost ~]# ll /webdep/test1/conf/
总用量 12
-rw-r--r--. 1 root root 1080 11月 1 18:30 authz #认证权限相关
-rw-r--r--. 1 root root 309 11月 1 18:30 passwd #用户名和密码
-rw-r--r--. 1 root root 3090 11月 1 18:30 svnserve.conf #服务器配置文件
针对不同版本库修改配置文件
[root@localhost ~]# vim /webdep/test1/conf/svnserve.conf #修改test1的配置文件
[general]
anon-access = read #原先注释掉了,匿名用户可以读,使用none的话就是匿名用户不可以访问
auth-access = write #这几行都要取消注释,认证用户可以写,可以是read,write,none
password-db = passwd #密码库文件,默认使用的是同一目录下的passwd文件作为用户密码库
authz-db = authz #认证权限文件
realm = My First Repository #登陆提示信息
注意:此配置文件的所有内容必须顶格,否则会报错
配置用户和密码及认证权限
[root@localhost ~]# vim /webdep/test1/conf/passwd //设置用户名和密码
[users]
test1 = 123456
test2 = 123456
test3 = 123456
#末尾添加上面三行
#对于部分版本,前面的[users]是有#号的,如果有#号,一定要取消,否则只能使用匿名用户登录,客户端登录不会出现登录窗口或密码提示,除非在配置文件将anon设置为none,否则将返回一个错误
#这里的密码都是明文,没有加密
[root@localhost ~]# vim /webdep/test1/conf/authz #设置用户和组的权限
[aliases]
# joe = /C=XZ/ST=Dessert/L=Snake City/O=Snake Oil, Ltd./OU=Research Institute/CN=Joe Average
[groups] #此行默认存在了
test = test1,test2 定义组,在[groups]下面添加
#用户组格式 用户组名 = 用户1,用户2
#一个组可以包含多个用户,英文逗号间隔,用户名必须是
[/] #/表示我当前所在版本库目录,这里代表test1
test3 = rw #test3读写权限
@test = r #@test表示这个组的权限,就是上面定义的组的成员
*= #除了上面的有赋予权限成员之外,其他的成员都没有权限
SVN目录格式:
[/目录名]
@用户组名 =权限
用户名 =权限
*=
服务SVN启动及创建测试代码
[root@localhost ~]# svnserve -d -r /webdep/test1
#启动了所有版本库, 再 -r。如果只需要某一个版本库,
后面添加/webdep/test1的版本库即可 -d=daemon -r=root of directory of save指定根目录
查询到下面这行内容就可以了
[root@localhost ~]# ps -aux |grep svn
root 9954 0.0 0.0 180736 808 ? Ss 18:53 0:00 svnserve -d -r /webdep/test1
root 9956 0.0 0.0 112728 972 pts/1 S+ 18:55 0:00 grep --color=auto svn
查看端口正常
[root@localhost ~]# netstat -luntp |grep 3690
tcp 0 0 0.0.0.0:3690 0.0.0.0:* LISTEN 9954/svnserve
使用svn导入测试代码
导入测试代码格式: svn [选项] 源码 svn://server ip/项目名
常见的选项:
import:将未版本化的文件纳入版本控制并提交
checkout:从版本库中检出一个修订版
update:更新工作拷贝
add,delete,copy,move:增、删、复制、移动文件或目录
status:检查状态差异
diff:检查文件行级详细差异
revert:恢复
resolve:解决冲突
switch:切换工作拷贝对应的版本库分支
log:查看历史记录
list:显示文件目录
cat:查看某个文件内容
推送代码
创建一个目录
[root@localhost ~]# mkdir localsvn
[root@localhost ~]# cd localsvn/;
[root@localhost localsvn]# touch 1.html 2.html 模拟两个页面
[root@localhost ~]# svn import /root/localsvn/ file:///webdep/test1/ -m "first edit"
正在增加 localsvn/1.html
正在增加 localsvn/2.html
提交后的版本为 1。
本地导入代码,使用file,仅仅能在服务器本地导入, -m=messages,类似注释,首次加入代码使用import
-m 标注版本信息
代码取出
svn: E170000: URL “svn://10.10.100.39/test1” 不存在
奇怪,怎么会提示库不存在呢?推送的时候是成功的,肯定是哪里配置问题。后来尝试了半天,也在网上搜索了很久,终于发现问题所在。
如果你的svn库的路径为:/webdep/test1(这是你版本库的路径,就是你Linux上的仓库)
那么你启动时,不能用命令:
svnserve -d -r /webdep/test1
而要用命令:
svnserve -d -r/webdep
[root@localhost ~]# ps -aux |grep svn
root 9954 0.0 0.0 180736 1064 ? Ss 18:53 0:00 svnserve -d -r /webdep/test1
root 23991 0.0 0.0 112728 972 pts/1 S+ 19:45 0:00 grep --color=auto svn
[root@localhost ~]# kill -9 9954
[root@localhost ~]# svnserve -d -r /webdep/
[root@localhost ~]# svn checkout svn://10.10.100.39/test1/ test
认证领域: <svn://10.10.100.39:3690> My First Repository
“root”的密码: #默认直接回车就可以
认证领域: <svn://10.10.100.39:3690> My First Repository
“test1”的密码: #输入在配置文件写的密码
-----------------------------------------------------------------------
注意! 你的密码,对于认证域:
<svn://10.10.100.39:3690> My First Repository
只能明文保存在磁盘上! 如果可能的话,请考虑配置你的系统,让 Subversion
可以保存加密后的密码。请参阅文档以获得详细信息。
你可以通过在“/root/.subversion/servers”中设置选项“store-plaintext-passwords”为“yes”或“no”,
来避免再次出现此警告。
-----------------------------------------------------------------------
保存未加密的密码(yes/no)?no #这里写no
A test/1.html
A test/2.html
取出版本 1。
代码添加
[root@localhost ~]# cd test/ #进入你取下代码的目录
[root@localhost test]# touch 5.html #新建代码
[root@localhost test]# svn add 5.html #添加到SVN服务中
[root@localhost test]# svn commit -m "second edit"
认证领域: <svn://10.10.100.39:3690> My First Repository
“test1”的密码:
-----------------------------------------------------------------------
注意! 你的密码,对于认证域:
<svn://10.10.100.39:3690> My First Repository
只能明文保存在磁盘上! 如果可能的话,请考虑配置你的系统,让 Subversion
可以保存加密后的密码。请参阅文档以获得详细信息。
你可以通过在“/root/.subversion/servers”中设置选项“store-plaintext-passwords”为“yes”或“no”,
来避免再次出现此警告。
-----------------------------------------------------------------------
保存未加密的密码(yes/no)?no
svn: E170001: 提交失败(细节如下):
svn: E170001: 认证失败
commit,SVN的提交是将在工作空间做的修改进行提交,包括文件内容的修改,文件或目录的添加,删除,命名,移动等操作。开发项目时,你会在工作拷贝中修改项目的代码,你总要把修改之后做过的改动又存回到项目仓库中去。这个过程称为“提交”。提交是将你对工作拷贝所作的所有改动发送并存储到中央项目仓库中。
add 功能:向文件拷贝所在的文件夹中添加新的文件,并作出标识,是新添加的,下一步提交时将一并提交到Subversion版本库中去。简单的说就是将一新文件加入svn,你添加再提交后该文件就进入subversion版本中去了;
checkout:check out导出获得文件后,导出的文件仍处于SVN版本控制中,与版本库保持关联,比如你可以进行Svn Update或者Svn Commit操作,checkout是第一次用,后面的用法就是更新
SVN+Apache
SVN+Apache的需要subversion的两个动态库支持,同时我们需要密码的验证支持!
查看apache对svn模块的支持
[root@localhost ~]# vim /etc/httpd/conf.modules.d/10-subversion.conf
有下面svn相关库,就证明安装成功
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@localhost ~]# ls /etc/httpd/modules/mod_dav_svn.so
/etc/httpd/modules/mod_dav_svn.so
[root@localhost ~]# ls /etc/httpd/modules/mod_authz_svn.so
/etc/httpd/modules/mod_authz_svn.so
配置apache支持svn
[root@localhost ~]# vim /etc/httpd/conf.d/subversion.conf
<Location /webdep>
DAV svn
SVNParentPath /webdep #svn根目录
AuthType Basic #Basic认证方式
AuthName "test1 website Dept" #认证显示信息,提示信息
AuthUserFile /webdep/svn/passwd #用户密码文件
AuthzSVNAccessFile /webdep/svn/authz #访问控制权限文件
Require valid-user #要求正式用户,不能匿名
</Location>
创建用户passwd文件
[root@localhost ~]# mkdir /webdep/svn
[root@localhost ~]# htpasswd -c /webdep/svn/passwd user1
New password:
Re-type new password:
Adding password for user user1
第一次用c,创建,第二次就不用
[root@localhost ~]# htpasswd /webdep/svn/passwd user2
New password:
Re-type new password:
Adding password for user user2
[root@localhost ~]# htpasswd /webdep/svn/passwd user3
New password:
Re-type new password:
Adding password for user user3
[root@localhost ~]# cat /webdep/svn/passwd
user1:$apr1$f9e0V8uE$AxxyBxx781bXduWHjdNqF/
user2:$apr1$DL0MU9KX$Q2t8LGgOirg5.nW8KJ29L.
user3:$apr1$aDM0NkuG$nOTqDG4OkxIwyXmbhFEPc1
创建权限authz文件
[root@localhost ~]# vim /webdep/svn/authz
[groups]
all = user1,user2
[/] #“/”表示所有仓库的跟目录下
#user1 = rw
[test1:/] #第一个仓库,user1和user2可以读写
@all = rw
[test2:/] #第二个仓库目录,user2和user3可以读写
User2 = rw
User3 = rw
启动服务测试
[root@localhost ~]# systemctl restart httpd