1、SVN服务简介: 较详细的看网址:http://www.cnblogs.com/liuzhong/archive/2011/07/10/2102634.html pdf文档:Subversion中文手册(自己google下浏览下也有好处)
Subversion(SVN) 是一个开源的版本控制系統, 也就是说 Subversion 管理着随时间改变的数据。 这些数据放置在一个中央资料档案库 (repository) 中。 这个档案库很像一个普通的文件服务器, 不过它会记住每一次文件的变动。 这样你就可以把档案恢复到旧的版本, 或是浏览文件的变动历史。
SVN中的一些概念 :
(1). repository(源代码库)
源代码统一存放的地方
(2). Checkout (提取)
当你手上没有源代码的时候,你需要从repository checkout一份
(3). Commit (提交)
当你已经修改了代码,你就需要Commit到repository
(4). Update (更新)
当你已经Checkout了一份源代码, Update一下你就可以和Repository上的源代码同步,你手上的代码就会有最新的变更
日常开发过程其实就是这样的(假设你已经Checkout并且已经工作了几天):Update(获得最新的代码) -->作出自己的修改并调试成功 --> Commit(大家就可以看到你的修改了) 。
如果两个程序员同时修改了同一个文件呢, SVN可以合并这两个程序员的改动,实际上SVN管理源代码是以行为单位的,就是说两个程序员只要不是修改了同一行程序,SVN都会自动合并两种修改。如果是同一行,SVN会提示文件Confict, 冲突,需要手动确认。
客户端软件:
(1)Windows下常用的客户端软件常用TortoiseSVN。它是一个免费的开源的客户端。 下载地址:http://tortoisesvn.net/downloads.html
(2)eclipse,也有一些SVN的插件。
( 3 ) 安装完,会自带svn客户端。主要用于命令行。
2、SVN安装(yum 安装)
源码包安装参看网址:http://www.cnblogs.com/xd502djj/archive/2011/01/21/1941404.html
yum 安装方式:
yum list all | grep -i subversion #查看是否有相应的安装包,如果不是你想要的版本。请自行查找yum源或者直接进行源码包编译安装。
yum install subversion -y --nogpgcheck #没安装的话安装上即可
rpm -ql subversion #查看下相关文件的安装目录
svn --version #查看下是否安装成功
3、创建版本库
mkdir /usr/local/src/svnproject/ -p #新建一个目录(目录随意),用于版本库的创建。
svnadmin create /usr/local/src/svnproject/ #建立svn版本库,可以去看看目录下生成了那些文件。
vim /usr/local/src/svnproject/conf/svnserve.conf #打开配置文件添加下列选项
[general]
anon-access = none #非授权用户无法访问
auth-access = write #使授权用户有写权限
password-db = passwd #密码文件路径,刚才创建的版本库 /usr/local/src/svnproject/ 下边的conf目录下的文件(直接写上名字就行,不用跟路径。它会自动找到这个文件)。
authz-db = authz #访问控制文件,就是配置哪些用户(passwd文件中定义的用户)对那些目录(/usr/local/src/svnprojec或者它的子目录)有那些权限(读写权限)
realm = svnproject #认证命名空间,就是你的代码版本库的路径
vim /usr/local/src/svnproject/conf/passwd #建立用户名和密码。注意顶格写
[users]
lidonghai=123
lucy=123
kate=123
vim /usr/local/src/svnproject/conf/authz #定义用户组及各个组用户对目录的访问权限设置
[groups]
admin=lidonghai #这个组只有lidonghai这一个用户。多个用户用逗号隔开即可。这里为简单。
team1=lucy #这个组只有lucy
team2=kate #这个组只有kate组
[/] # “/”符号代表的就是代码版本库/usr/local/src/svnproject。
* = #其他用户对这个代码库没有任何权限。(但是它的子目录是可以配置的)
@admin = rw #admin组即用户lidonghai对整个代码库“/usr/local/src/svnproject”具有读写的权限(包括下边的子目录)
[/project1] #代表代码库/usr/local/src/svnproject/下的project1目录。(project1这个目录不是你手动创建的,是需要管理员帮你导入生成的--见下边。之后你才可以对这个目录进行操作,比如check out下来。添加文件add。update下来。)
@team1 = rw #team1组即lucy这个用户对/usr/local/src/svnproject/project1目录有读写权限
[/project2] #解释同上
@team2 = rw
4、启动svnserver 服务
svnserver -d -r /usr/local/src/svnproject #-d 表示后台启动。-r表示指定代码库路径
netstat -tulpn #查看下3690端口是否开启
5、使用代码版本库
参看网址:这些都是如何使用。下边总结的如何上传你的本地代码。check out 到本地。
http://www.jb51.net/os/RedHat/2461.html
http://www.cnblogs.com/liuzhong/archive/2011/07/10/2102634.html
http://www.cnblogs.com/liwanggui/archive/2016/06/28/5624147.html
https://www.cnblogs.com/aaronLinux/p/5521844.html
5.1管理员导入代码创建文件夹,下边给出了命令行的方式。不习惯的话可以私用图形工具进行导入(Windows下常用的客户端软件常用TortoiseSVN)。
#下边两种方法认证时使用的就是上边配置的用户。
svn import -m"" phptest/ file:///usr/local/src/svnproject1 --username lidonghai #在本机上导入。导入完后其实你的phptest这个本地目录就没什么用了。删掉也可以。(和svn服务没啥关系了)
svn import -m "" phptest/ svn://127.0.0.1/project1 --username lidonghai #用户名是管理员才可以导入生成,lucy和kate是不能导入的。
#这种导入方式认证的方式不使用上边的配置。具体怎么认证下边会给出。
svn import -m "" phptest/ http://127.0.0.1:8080/svn/project3 --username admin #这是svn配置成http访问方式后才能使用的导入方法(http方式访问svn的配置方法稍后给出)。注意要关闭防火墙并且关闭selinux,否则可能导出时没有权限。关闭防火墙:service iptables stop 关闭selinux: setenforce 0 。(临时关闭,永久关闭 vim /etc/selinux/config ; 将SELINUX=enforcing改为SELINUX=disabled)
5.2删除创建的文件夹:
#对应上边的创建方式
svn delete -m "" file:///usr/local/src/svnproject1 --username lidonghai
svn delete -m "" svn://127.0.0.1/project1 --username lidonghai
#对应上边的创建方式
svn delete -m "" http://127.0.0.1:8080/svn/project1 --username admin
5.3check out到本地,就是从服务器拷贝一份代码到本地开始开发。
svn checkout file:///usr/local/src/svnproject1/project1 --username lidonghai
svn checkout svn://127.0.0.1/project1 --username lidonghai
#这个是基于http服务的,使用的时候请确保你已经配置了svn的http访问方式。
svn co http://127.0.0.1:8080/svn/project1 --username admin
5.4其他的常用命令就可以自己参考上边网址中的,自己测试感受下。
举例:
添加新文件
svn add 文件名
注:告诉SVN服务器要添加文件了,还要用svn commint -m真实的上传上去!
例子:
svn add test.php <- 添加test.php
svn commit -m “添加我的测试用test.php“ test.php
svn add *.php <- 添加当前目录下所有的php文件
svn commit -m “添加我的测试用全部php文件“ *.php
提交
svn commit -m “提交备注信息文本“ [-N] [--no-unlock] 文件名
svn ci -m “提交备注信息文本“ [-N] [--no-unlock] 文件名
必须带上-m参数,参数可以为空,但是必须写上-m
例子:
svn commit -m “提交当前目录下的全部在版本控制下的文件“ * <- 注意这个*表示全部文件
svn commit -m “提交我的测试用test.php“ test.php
svn commit -m “提交我的测试用test.php“ -N --no-unlock test.php <- 保持锁就用–no-unlock开关
svn ci -m “提交当前目录下的全部在版本控制下的文件“ * <- 注意这个*表示全部文件
svn ci -m “提交我的测试用test.php“ test.php
svn ci -m “提交我的测试用test.php“ -N --no-unlock test.php <- 保持锁就用–no-unlock开关
更新文件
svn update
svn update -r 修正版本 文件名
svn update 文件名
例子:
svn update <- 后面没有目录,默认将当前目录以及子目录下的所有文件都更新到最新版本
svn update -r 200 test.cpp <- 将版本库中的文件 test.cpp 还原到修正版本(revision)200
svn update test.php <- 更新与版本库同步。
提交的时候提示过期冲突,需要先 update 修改文件,
然后清除svn resolved,最后再提交commit。
更新的流程:只要你修改了文当,更新的时候就会查看svn服务器上与你本地的那个版本是否一致。如果一致,代表其他人没有修改过这个文档。那你的更新就生效了,
文档版本加1。如果比提交的时候服务器上的版本和你本地修改的文件版本不一致,代表已经有人修改了你的文件。这时svn服务器是不会接受更新的。因为不能轻易就覆盖掉
被人的更改,这时一般会update那个有冲突的文件并修改冲突(update这个文件时有多个选项自己测试下就行,随便测试没关系,即是出错也是可以返回之前的版本的。一句话
随便搞不用怕,错了就返回到之前的版本。记住如果冲突不好解决要和修改你文件的人商量下,看看双方是不是都能接受最后的更改结果。杜绝不和他人交流直接覆盖别人的
代码。)。
删除文件
svn delete svn://路径(目录或文件的全路径) -m “删除备注信息文本”
推荐如下操作:
svn delete 文件名
svn ci -m “删除备注信息文本”
例子:
svn delete svn://localhost/testapp/test.php -m “删除测试文件test.php”
推荐如下操作:
svn delete test.php
svn ci -m “删除测试文件test.php”
6、小结:上边的安装和使用命令都还比较简单。但是权限的配置没有多少人写得清楚。还有一点就是代码库的管理也是很少有人写清楚。
6.1SVN的认证方式有很多种,常用的有:
svnserver服务器 ,上边的配置就是这种认证方式。
svnserver over SSH ,这种方式我这里不介绍了。可以google下或者下载“SVN中文手册.pdf”熟悉下
Apache的HTTP服务器,后边给出配置步骤。
6.2版本库的创建策略也有多种(我上边的配置解释使用的单一版本库不保存多个项目)
单一的版本库保存一个项目。#上边配置方式就是创建了一个版本库,版本库下边是各个project1 project2 project3等目录。(举例:你们公司这个项目需要多个部门配合,那么给程序员一个目录project1用于代码开发。给产品部一个目录project2用于产品文档ppt等文件的存储。给销售一个目录用于销售文件的存取。这不就很有调理了。各个部门相互不能干涉。只有你管理员有最高权限。除你之外没有任何人可以删除目录、创建目录。多牛逼呀。其他部门在各自的目录下爱干什么干什么,没你啥事情。你最多指导下就行了。)
单一的版本库保存多个项目。#和上边那种基本一样。其实上边那种“单一版本库保存一个项目”其实就是不分出 ”子目录”(project1、project2、project3)。大家都在一个目录里边。但我觉得那种方式太粗放了。而且不怎么安全。外衣又跟给你删除了整个代码库可就不好玩了。即使你创建一个project1子目录,可以解决误删除问题,但是感觉大家伙在一块还是比较乱。反正我不想和产品以及销售的文件放一起来瞎搞(说不定那个小姑娘就给你删除了文件,给你制造点麻烦。我感觉挺难受的)。
多个版本库。#这种方式也不错,挺实用的,多个项目版本库。和上边单一库分目录效果一样。配置也挺简单。上边的权限配置弄懂了这个配置小意思。
参看网址(步骤很清晰,注意里边的project1、project2不再是目录而是独立的版本库。):http://www.linuxidc.com/Linux/2014-01/95627.htm
6.3 SVN基于httpd访问配置:简单,这里为了速度快直接用yum安装所有软件。
yum install -y subversion #安装svn服务器,安装过了不用安装了。
yum install -y httpd mod_dav_svn #安装httpd服务(安装过了就不用安装了),安装mod_dav_svn更能模块。前提是你的svn服务已经安装过了。
svnadmin create /usr/local/src/svnproject1 #创建版本库,创建过了就不用创建了。如果上边步骤做过了这一步没必要执行了。就用上边的版本库
vim /etc/httpd/conf.d/subversion.conf #配置httpd支持svn。(注意我下边的注释要去掉,要不会报错的。)
<Location /svn> #svn这个是httpd访问路径,下边看下就明白了。
DAV svn
SVNListParentPath on
SVNPath /usr/local/src/svnproject1 #这个就是/svn目录,映射的版本库目录。
AuthType Basic
AuthName "Authorization"
AuthUserFile /usr/local/src/svnproject1/conf/password #这个是你的账户文件
Require valid-user
</Location>
htpasswd -c
/usr/local/src/svnproject1
/conf/password admin #创建账户文件,和上边配置文件subversion.conf中指定的文件路径和名字必须一样啊。
htpasswd -m
/usr/local/src/svnproject1
/conf/password admin2 #多开几个账户,注意这时不能使用-c选项。-m表示追加新用户到
文件password
htpasswd -m
/usr/local/src/svnproject1
/conf/password admin3 #多开几个账户
chmod 755 -R
/usr/local/src/svnproject1 #更改文件夹权限。
chown -R apache.apache
/usr/local/src/svnproject1
#更改属主和属组
vim /etc/httpd/conf/httpd.conf #这一步随意
Listen 8080 #修改监听的端口。
service httpd restart #重启httpd服务
service iptables stop #关闭防火墙,要不你访问不了。必须
setenforce 0 #关闭selinux,必须。要不你import时会报 permision deny错误。这个重要必须先关上。我他娘的调了半天(主要还是对selinux没有学习的缘故)。
http://192.168.99.239:8080/svn/ #放到浏览器中,试一下。看见这个/svn路径了吧,这个就会被映射为版本库路径。
svn import -m "" phptest/ http://127.0.0.1:8080/svn/project3 --username admin #导入本地代码到版本库。phptest是我的测试目录。你可以什么都不加,默认导入当前目录下所有文件。