是一个集中式版本控制系统,用于团队协作。SVN的仓库在服务器上,需要在联网条件下才能提交和更新。
SVN的运行方式有两种:独立服务器和借助Apache。SVN可以安装在Linux或Windows系统中,安装完成后自带独立的SVN服务器,可以立刻使用。
SVN的数据存储方式有两种:Berkeley DB(数据库)和FSFS(文件系统)。Berkeley DB方式在服务器中断时可能锁住数据。FSFS方式更常用。
常用的客户端是TortoiseSVN(乌龟)。也可以用WEB方式或命令行方式访问。
ubversion由几个组件组成: SVN:命令行客户端程序(常用)。 SVNversion:此工具用来显示工作拷贝的状态(用术语来说,就是当前项目的修订版本)。 SVNlook:直接查看Subversion版本库的工具。 SVNadmin:建立、调整和修复Subversion版本库的工具(重要)。 SVNdumpfilter:过滤Subversion版本库转储数据流的工具。 mod_dav_SVN:ApacheHTTP服务器的一个插件,使版本库可以通过网络访问。 SVNserve:一个单独运行的服务器程序,可以作为守护进程或由SSH调用,这是另一种使版本库,可以通过网络访问的方式(重要)。 SVNsync:一个通过网络增加镜像版本库的程序。
SVN:拷贝-修改-合并 多个用户可以同时阅读编辑同一个文件(每个用户在本地都有一份拷贝),A先提交编辑后的文件后,B如果提交,SVN会提示文件已过期,需要先更新为最新版本。如果B与A修改的文件位置不重叠,B可以顺利更新并提交。如果重叠,B更新时会报错‘冲突’,此时需要人工介入处理。
团队协作时,为了确保版本一致,必须保证所有人用的数据都是从SVN服务器checkout到本地的,且受SVN版本控制。 基本流程是:建仓库–关联项目(原始项目文件可以删除)–各团队成员checkout到本地–正常使用(增加add,更新update,提交commit)
不同的Linux版本,安装方式不同。以服务器常用的centOS为例,用yum install安装(源码安装容易导致版本依赖问题)。
检查是否已安装rpm -qa subversion 卸载旧版本:yum remove subversion
单独安装SVN:yum install subversion 如果需要配合Apache:yum install httpd httpd-devel subversion mod_dav_svn mod_auth_mysql
svnserve --version 如果输出版本号,则安装成功。
可以一个仓库对应一个项目,也可以一个仓库对应多个项目。每个仓库都需要单独做配置。我这里用的是一个仓库对应一个项目。 建立目录:mkdir /home/svn/repository 建立仓库:svnadmin create /home/svn/repository 进入/home/svn/repository目录,用ll命令查看当前目录下的内容,会发现多了conf, db,hooks, locks目录和format,README.txt文件。
/home/svn/repository/conf下面有三个文件:authz(用户权限配置),passwd(用户和密码),svnserve.conf(SVN服务器配置)
目的:添加用户并配置密码 [users] liming=123456 xiaohong=123456 admin=123456
目的:为用户分组,为每个组设置可以访问哪个目录的权限 [groups]组别设置,每个组别可以放多个用户,每个组别可以设置 [/]目录权限设置,其中[/]表示所有仓库的根目录。多目录时用[仓库名:/]表示每个仓库的根目录。
[groups] admin=admin manager=liming,xiaohong #组名前必须加@符号,用户名前不需要加 #admin组中的用户可以读写仓库下的所有文件和目录 [/] @admin=rw #manager组中的用户只可以读写仓库下的project目录 [/project1] @manager=rw [/project2] liming=rw如果项目人数较少,也可以不分组,直接分配权限。
[/] admin=rw [/project] liming=rw xiaohong=rw注意:权限有继承关系。如果用户有父目录的某个权限,则自动获得所有子目录对应权限,除非加限制(用*=)。下例中,user2失去project1:/file1目录的权限:
[project1:/] user1=rw user2=rw *= [project1:/file1] user1=rw *=默认是3690端口。 修改 iptables -I INPUT -p tcp --dport 3690 -j ACCEPT 保存 /etc/rc.d/init.d/iptables save 重启 service iptables restart 查看 /etc/init.d/iptables status
添加端口:firewall-cmd --zone=public --permanent --add-port=3690/tcp 重启防火墙:firewall-cmd --reload 查看:firewall-cmd --list-all
这里如果报错 FirewallD is not running 的话,需要先开启防火墙:systemctl start firewalld,再进行配置。
svnserve -d -r /home/svn/repository/project1 -d:守护进程 -r:svn根目录
svnserve -d -r /home/svn/repository netstat -ntpl,查看3690端口是否已经在监听。
其中svnserve命令用绝对路径。绝对路径可以用which svnserve查。
chmod 777 /root/svn_startup.sh
vi /etc/rc.d/rc.local 在末尾添加脚本的路径,如:/root/svn_startup.sh
ps -ef|grep svnserve 如果可以看到svnserve,则设置成功。
SVN服务器端和客户端数据的存放格式不同,在服务器端不可能找到和客户端直接对应的文件。你在SVN服务器的仓库/home/svn/repository中,找不到任何一个用SVN客户端看到的目录或文件。
svn import命令执行成功后,SVN客户端就可以看到对应的项目列表了。此时应将原项目文件删除,需要时重新从SVN执行checkout操作,以确保项目的版本可以关联同步。 这里用一个仓库对应多个项目,在Linux本地进行关联(SVN路径前加’file://’)。如果跨主机关联项目,SVN路径前加’svn://IP地址’。 语法:svn import 项目绝对路径 SVN路径名 -m "日志信息" 例如: svn import /home/testuser/project1 file:///home/svn/repository/project1 -m "improt project1" svn import /home/testuser/project2 file:///home/svn/repository/project2 -m "improt project2"
导出某一个版本的数据,导出后项目文件脱离SVN版本控制。导出文件夹下没有.svn目录。 - 从SVN服务器导出: svn export [-r 版本号] svn://路径(目录或文件的全路径) [本地绝对路径] --username 用户名 - 将本地有关联的项目变为无关联的: svn export 本地检出的(即带有.svn文件夹的)目录全路径 要导出的本地目录全路径
语法:svn checkout svn://路径(目录或文件的全路径) [本地绝对路径] --username 用户名 例如:svn checkout svn://119.119.119.119/project1 本地绝对路径为空时,将会在当前目录中建立项目副本。
添加:svn add file 例如:svn add test.php
当文件修改过或者新添加的,要用commit命令提交到SVN服务器。 提交:svn commit -m "日志信息" PATH 例如:svn commit -m "add test.php file” test.php`
执行update命令前必须确保项目或文件已checkout到本地。 更新:svn update -r path 注意:svn update如果后面没有目录,默认将当前目录以及子目录下的所有文件都更新到最新版本。 例如: svn update -r 200 test.php(将版本库中的文件test.php还原到版本200) svn update test.php(更新至版本库中最新版本。)
svn delete svn://119.119.119.119/project1