svn版本控制系统有很多用途,最近公司使用它加脚本实现产品补丁小更新(因为如果每次都大更新的话,每次都要重新打rpm包,更新yum源等,很麻烦)。
一、服务器端安装
1、安装svn
[root@svn ~]#yum install -y subversion
2、新建svn目录
[root@svn ~]#mkdir -p /root/svn/svnserver
3、启动svn服务
[root@svn ~]#svnserve -d -r /root/svn/svnserver/
如果有这个报错:svnserve: error while loading shared libraries: libaprutil-1.so.0: cannot open shared object file: No such file or directory
解决办法:
(1)找到这个文件所在目录
[root@svn ~]#find / -name "libaprutil-1.so.0" /usr/local/xxx/service/apache/lib/libaprutil-1.so.0
(2)查看共享库配置文件
[root@svn ~]#more /etc/ld.so.conf include ld.so.conf.d/*.conf
(3)添加共享库,并更新共享库
[root@svn ~]#vi /etc/ld.so.conf.d/httpd-apr.conf /usr/local/xxx/service/apache/lib/ [root@svn ~]#ldconfig -v
4、启动svn
[root@svn ~]#svn --version [root@svn ~]#svnserve -d -r /root/svn/svnserver/
备注:如果要更改端口启动的时候接上“--listen-port”新端口。
5、创建版本库
[root@svn ~]#svnadmin create /root/svn/svnserver/patch
6、修改svnserve.conf配置文件,在[general]下方加入这四行
[root@svn ~]#vim /root/svn/svnserver/patch/conf/svnserve.conf anon-access = none auth-access = write password-db = passwd authz-db = authz realm = patch
备注:realm 这行也可以不加。
7、创建svn用户和权限分配
在 /root/svn/svnserver/patch/conf目录下,有两个文件是配置用户账号密码和用户权限的。
passwd 此文件配置用户账号和密码 [root@svn ~]#vim /root/svn/svnserver/patch/conf/passwd [users] # harry = harryssecret # sally = sallyssecret xxx = 123456 zhangsan = 123456 lisi = 123456
authz 此文件配置用户权限 [root@svn ~]#vim /root/svn/svnserver/patch/conf/authz [groups] # harry_and_sally = harry,sally # harry_sally_and_joe = harry,sally,&joe admin = xxx user = xxx,zhangsan,lisi # [/foo/bar] # harry = rw # &joe = r # * = # [repository:/baz/fuz] # @harry_and_sally = rw # * = r [/] @admin = rw @user = rw
备注:authz这个文件详细控制权限,请见最后的备注。
8、设置iptables防火墙允许3690端口,或者关闭防火墙
9、 编写启动脚本
[root@svn ~]#vi /etc/init.d/server_init #!/bin/bash #chkconfig: 345 90 90 #description: server_init for patch. svnserve -d -r /root/svn/svnserver/
10、 启动脚本放入/etc/init.d/目录下,并设置开机启动
[root@svn ~]#chkconfig --add server_init [root@svn ~]#chkconfig server_init on [root@svn ~]#chmod 755 server_init
备注:如果要杀掉svnserver,用killall svnserver,然后svnserve -d -r /root/svn/svnserver/启动。
二、windows客户端安装
1、下载TortoiseSVN客户端
http://sw.bos.baidu.com/sw-search-sp/software/b2ea78514e765/TortoiseSVN-1.9.7.27907-x64.msi
2、右键点击桌面上空白区域,然后会发现右键的菜单中多了“SVN Checkout...”工具栏,点击。
3、填入服务器版本库的路径,和本地存放版本库文件的目录,这里本地C盘新建一个patch目录,会提示输入密码,并下载更新。
4、更新并提交2个文件,如下图:
如果要提交某一个文件,可以选中这个文件,然后右键选择TortoiseSVN---Add添加,提交的时候最好写上备注:
5、清除登录帐号和密码信息,然后用另外一个帐号登录(本地C盘新建一个test2目录)
备注:我这里只是举例,实际情况下是让另外一个人在其他电脑上登录另外一个帐号,验证相互提交的数据是否能同步。
如上图,表示同步成功。
三、linux客户端安装
1、安装svn
[root@svnclient ~]#yum install -y subversion
2、查看svn版本或帮助。
[root@svnclient ~]#svn --version [root@svnclient ~]#svn help [root@svnclient ~]#svn checkout --help [root@svnclient ~]#svn list --help 如果有这个报错:svnserve: error while loading shared libraries: libaprutil-1.so.0: cannot open shared object file: No such file or directory 解决办法: (1)找到这个文件所在目录 [root@svn ~]#find / -name "libaprutil-1.so.0" /usr/local/xxx/service/apache/lib/libaprutil-1.so.0 (2)查看共享库配置文件 [root@svn ~]#more /etc/ld.so.conf include ld.so.conf.d/*.conf (3)添加共享库,并更新共享库 [root@svnclient ~]#vi /etc/ld.so.conf.d/httpd-apr.conf /usr/local/xxx/service/apache/lib/ [root@svnclient ~]#ldconfig -v
3、svn list列出版本库文件,刚开始会提示输入root密码,直接回车,然后就可以输入您定义的用户和密码。
[root@svnclient ~]#svn list svn://192.168.0.181/patch 认证领域: <svn://192.168.0.181:3690> patch “root”的密码: 认证领域: <svn://192.168.0.181:3690> patch “lisi”的密码: ----------------------------------------------------------------------- 注意! 你的密码,对于认证域: <svn://192.168.0.181:3690> patch 只能明文保存在磁盘上! 如果可能的话,请考虑配置你的系统,让 Subversion 可以保存加密后的密码。请参阅文档以获得详细信息。 你可以通过在“/root/.subversion/servers”中设置选项“store-plaintext-passwords”为“yes”或“no”, 来避免再次出现此警告。 ----------------------------------------------------------------------- 保存未加密的密码(yes/no)?yes fsdfsd/ 新建文本文档 (3).txt 新建文本文档 (4).txt
4、svn checkout检出,由于之前保存了密码,所以这步步会提示输入密码。(先新建一个本地目录,比如/svndata)
备注:接用户名加这个,--username 用户名
[root@svnclient ~]#svn checkout svn://192.168.0.181/patch /svndata A /svndata/新建文本文档 (3).txt A /svndata/新建文本文档 (4).txt A /svndata/fsdfsd A /svndata/fsdfsd/sdfsdf.txt 取出版本 2。
5、更新版本库到本地
[root@svnclient svndata]#svn update [root@svnclient svndata]#svn update -r 修正版本 文件名 #将某个文件还原到某个版本
6、修改后提交到库
[root@svnclient svndata]# svn add linuxfile A linuxfile [root@svnclient svndata]# svn commit -m "20171223" linuxfile 增加 linuxfile 传输文件数据. 提交后的版本为 3。
以下这些复制网友的:
7、删除文件
svn delete svn://路径(目录或文件的全路径) -m “删除备注信息文本” 例子: svn delete svn://192.168.0.181/patch/linuxfile -m “删除测试文件linuxfile”
8、加锁/解锁
例子: svn lock -m “锁信测试用linuxfile文件“ linuxfile svn unlock linuxfile
9、比较差异
svn diff 文件名 svn diff -r 修正版本号m:修正版本号n 文件名 例子: svn diff linuxfile<- 将修改的文件与基础版本比较 svn diff -r 200:201 linuxfile<- 对 修正版本号200 和 修正版本号201 比较差异
10、查看文件或者目录状态
svn st 目录路径/名 svn status 目录路径/名<- 目录下的文件和子目录的状态,正常状态不显示 【?:不在svn的控制中; M:内容被修改;C:发生冲突; A:预定加入到版本库;K:被锁定】 svn -v 目录路径/名 svn status -v 目录路径/名<- 显示文件和子目录状态 【第一列保持相同,第二列显示工作版本号, 第三和第四列显示最后一次修改的版本号和修改人】 注:svn status、svn diff和 svn revert这三条命令在没有网络的情况下也可以执行的, 原因是svn在本地的.svn中保留了本地版本的原始拷贝。
11、查看日志
svn log 文件名 例子: svn log linuxfile<- 显示这个文件的所有修改记录,及其版本号的变化
12、查看文件详细信息
svn info 文件名 例子: svn info linuxfile
13、创建纳入版本控制下的新目录
svn mkdir 目录名 svn mkdir -m "新增目录备注文本" http://目录全路径 例子: svn mkdir newdir svn mkdir -m "Making a new dir." svn://localhost/test/newdir 注:添加完子目录后,一定要回到根目录更新一下,不然在该目录下提交文件会提示“提交失败” svn update 注:如果手工在checkout出来的目录里创建了一个新文件夹newsubdir, 再用svn mkdir newsubdir命令后,SVN会提示: svn: 尝试用 “svn add”或 “svn add --non-recursive”代替? svn: 无法创建目录“hello”: 文件已经存在 此时,用如下命令解决: svn add --non-recursive newsubdir 在进入这个newsubdir文件夹,用ls -a查看它下面的全部目录与文件,会发现多了:.svn目录 再用 svn mkdir -m "添hello功能模块文件" svn://localhost/test/newdir/newsubdir 命令, SVN提示: svn: File already exists: filesystem '/data/svnroot/test/db', transaction '4541-1', path '/newdir/newsubdir '
14、恢复本地修改
svn revert [--recursive] 文件名 注意: 本子命令不会存取网络,并且会解除冲突的状况。但是它不会恢复被删除的目录。 例子: svn revert foo.c <- 丢弃对一个文件的修改 svn revert --recursive . <-恢复一整个目录的文件,. 为当前目录
15、把工作拷贝更新到别的URL
svn switch http://目录全路径 本地目录全路径 例子: svn switch http://localhost/test/456 . <- (原为123的分支)当前所在目录分支到localhost/test/456
16、解决冲突
svn resolved [本地目录全路径] 例子: $ svn update C foo.c Updated to revision 31. 如果你在更新时得到冲突,你的工作拷贝会产生三个新的文件: $ ls foo.c foo.c.mine foo.c.r30 foo.c.r31 当你解决了foo.c的冲突,并且准备提交,运行svn resolved让你的工作拷贝知道你已经完成了所有事情。 你可以仅仅删除冲突的文件并且提交,但是svn resolved除了删除冲突文件,还修正了一些记录在工作拷贝管理区域的记录数据,所以我们推荐你使用这个命令。
17、不checkout而查看输出特定文件或URL的内容
svn cat http://文件全路径 例子: svn cat http://localhost/test/readme.txt
18、新建一个分支copy
svn copy branchA branchB -m "make B branch" // 从branchA拷贝出一个新分支branchB
19、合并内容到分支merge
svn merge branchA branchB // 把对branchA的修改合并到分支branchB
疑问:
或许有很多人会以为这些文件会以文件方式存储在服务器上,其实不是。
上传的文件放在SVN服务器的哪个目录下,SVN服务器版本库有两种格式。一种为FSFS,一种为BDB。
把文件上传到SVN版本库后,上传的文件不再以文件原来的格式存储,而是被svn以它自定义的格式压缩成版本库数据,存放在版本库中。
如果是FSFS格式,这些数据存放在版本库的db目录中,里面的revs和revprops分别存放着每次提交的差异数据和日志等信息
备注:
这是一个权限实例需求,如果需要对权限精确控制,请参考这个。
-----------------------------------------------------------------
策划组:开策划、美术读写
后端组:开后端读写,策划只读
前端组:开前端读写,策划、美术只读
美术组:开美术读写,策划只读
管理员组:所有的读写
authz:用户权限配置
示例:
[groups]
#管理组
manager = boss
#服务端用户组
server = server1,server2
#客户端用户组
client = client1,client2
#美术组
art = art1,art2
#策划组
design=design1,design2
[game:/]
@manager=rw
[game:/server]
@server=rw
[game:/client]
@client=rw
@design=r
@art=r
[game:/art]
@design=rw
@art=rw
@client=r
[game:/design]
@design=rw
@server=r
@client=r
@art=r
passwd:用户密码
[users]
boss=123456
server1=123456
server2=123456
client1=123456
client2=123456
art1=123456
art2=123456
design1=123456
design2=123456