一、SVN简介
1.1、简介
Subversion(SVN) 是一个开源的版本控制系統, Subversion 管理着随时间改变的数据。 这些数据放置在一个中央资料档案库(repository) 中。 这个档案库很像一个普通的文件服务器, 不过它会记住每一次文件的变动。 这样你就可以把档案恢复到旧的版本, 或是浏览文件的变动历史。
1.2、相关概念
-
repository(源代码库):源代码统一存放的地方
-
Checkout(提取):当你手上没有源代码的时候,你需要从repository checkout一份
-
Commit(提交):当你已经修改了代码,你就需要Commit到repository
-
Update (更新):当你已经Checkout了一份源代码, Update一下你就可以和Repository上的源代码同步,你手上的代码就会有最新的变更
二、SVN安装及配置
参考文档:https://blog.csdn.net/qq_33722172/article/details/84144400
1)yum 安装svn
[root@svn ~]# yum -y install subversion #查看版本 [root@svn ~]# svnserve --version svnserve, version 1.7.14 (r1542130) compiled Apr 11 2018, 02:40:28 Copyright (C) 2013 The Apache Software Foundation. This software consists of contributions made by many people; see the NOTICE file for more information. Subversion is open source software, see http://subversion.apache.org/ The following repository back-end (FS) modules are available: * fs_base : Module for working with a Berkeley DB repository. * fs_fs : Module for working with a plain file (FSFS) repository. Cyrus SASL authentication is available.
2)创建版本库目录及版本库
[root@svn ~]# mkdir -p /var/svn/svnrepos/ [root@svn ~]# svnadmin create /var/svn/svnrepos/svn-test #创建版本库 [root@svn ~]# cd /var/svn/svnrepos/svn-test [root@svn svn-test]# ll total 8 drwxr-xr-x 2 root root 54 Nov 6 20:50 conf drwxr-sr-x 6 root root 233 Nov 6 20:50 db -r--r--r-- 1 root root 2 Nov 6 20:50 format drwxr-xr-x 2 root root 231 Nov 6 20:50 hooks drwxr-xr-x 2 root root 41 Nov 6 20:50 locks -rw-r--r-- 1 root root 229 Nov 6 20:50 README.txt [root@svn svn-test]# cd conf/ [root@svn conf]# ll total 12 -rw-r--r-- 1 root root 1080 Nov 6 20:50 authz #负责账号权限的管理,控制账号是否读写权限 -rw-r--r-- 1 root root 309 Nov 6 20:50 passwd #负责账号和密码的用户名单管理 -rw-r--r-- 1 root root 3090 Nov 6 20:50 svnserve.conf #svn服务器配置文件
3)编辑svnserve.conf
[root@svn conf]# vim svnserve.conf anon-access = none #匿名访问的权限,可以是read,write,none,默认为read auth-access = write #使授权用户有写权限 password-db = passwd #密码数据库的路径 authz-db = authz #访问控制文件
4)编辑authz文件
[root@svn conf]# vim authz .... [groups] # harry_and_sally = harry,sally # harry_sally_and_joe = harry,sally,&joe admin = lawrence #添加组 # [/foo/bar] # harry = rw # &joe = r # * = # [repository:/baz/fuz] # @harry_and_sally = rw # * = r [svn-test:/] #版本库 @admin = rw #读写权限
5)编辑passwd文件
[root@svn conf]# vim passwd [users] # harry = harryssecret # sally = sallyssecret lawrence = 123456
6)启动,查看端口进程
[root@svn conf]# svnserve -d -r /var/svn/svnrepos [root@svn conf]# ps -ef|grep svn root 61898 1 0 21:06 ? 00:00:00 svnserve -d -r /var/svn/svnrepos root 61900 61105 0 21:06 pts/1 00:00:00 grep --color=auto svn [root@svn conf]# netstat -lntp|grep svn tcp 0 0 0.0.0.0:3690 0.0.0.0:* LISTEN 61898/svnserve
7)使用TortoiseSVN客户端访问
在linux上登录时这样子的:
三、SVN相关命令
3.1、svn checkout path
svn checkout svn://10.0.0.201/svn-test svn co svn://10.0.0.201/svn-test #简写
3.2、svn checkout path subv
把你的工作拷贝放到subv而不是和前面那样放到trunk
3.3、svn add file
file是某个文件或者某个目录,如果添加所有的文件则用点“.”表示。
svn add file 例如:svn add test.php svn add *.php(添加当前目录下所有的php文件) svn add . (表示添加所有文件) ------------------------------------------------------------ [root@svn ~]# cd svn-test/ [root@svn svn-test]# echo aaa > test.txt [root@svn svn-test]# svn add test.txt A test.txt [root@svn svn-test]# echo bbb > b.txt [root@svn svn-test]# svn add . svn: warning: W150002: '/root/svn-test' is already under version control svn: E200009: Could not add all targets because some targets are already versioned svn: E200009: Illegal target for the requested operation [root@svn svn-test]# svn status #查看状态 ? b.txt A test.txt [root@svn svn-test]# svn add b.txt A b.txt [root@svn svn-test]# svn status A b.txt A test.txt
3.4、svn lock
#加锁/解锁命令。 svn lock -m "LockMessage" [--force] path 例如:svn lock -m “lock test file” test.php svn unlock path
3.5、svn update
#更新版本命令。 svn update -r m path 例如: svn update 后面没有目录,默认更新当前目录及子目录的所有文件到最新版本。 svn update -r 200 test.php (将版本库中的文件test.php还原到版本200) 简写:svn up update命令还可以进行文件恢复。 (1)不小心写错了很多东西,想撤销所写的东西(已经把修改提交到服务器) svn update -r 版本号 (2)不小心删错了文件,想把文件恢复回来(已经把删除提交到服务器) svn update -r 版本号
3.6、svn status
svn status -v path svn status path 简写:svn st ------------------------------ [root@svn svn-test]# svn status ? c.txt [root@svn svn-test]# svn status -v ./* 1 1 lawrence b.txt ? c.txt 1 1 lawrence test.txt -------------------------------------- 显示文件和子目录的状态。 第一列保持相同,第二列显示工作版本号,第三和第四列显示最后一次修改的版本号和修改人。 注:svn status、svn diff和 svn revert这三条命令在没有网络的情况下也可以执行的,原因是svn在本地的.svn中保留了本地版本的原始拷贝。 文件状态描述: A 被添加到本地代码仓库 ''没有修改 C 冲突 D 被删除 I 被忽略 M 被修改 R 被替换 X 外部定义创建的版本目录 ? 文件没有被添加到本地版本库内 !文件丢失或者不完整(不是通过svn命令删除的文件) ~ 受控文件被其他文件阻隔
3.7、svn delete
svn delete path -m “delete test file” 例如: 1、删除远程服务器文件 svn delete svn://192.168.1.1/pro/domain/test.php -m “delete test file” 2、删除本地文件,然后提交 svn delete test.php, 然后再svn ci -m “delete test file”,推荐使用这种 简写:svn (del, remove, rm)
3.8、svn log
[root@svn svn-test]# svn log test.txt ------------------------------------------------------------------------ r1 | lawrence | 2019-11-06 21:54:05 +0800 (Wed, 06 Nov 2019) | 1 line add file ------------------------------------------------------------------------ #查看一段日期的日志 svn log -r {2018-07-03}:{2018-07-09} #显示某一版本范围的log列表 #显示从r199687到r199385范围的所有带jaspersong字符串的log svn log -r r103546:r104414 | grep -A 2 jaspersong #这里说明一下grep -A 2 "jasper"|中A后面数字的差别,不同的数字表示显示的log版本信息不同的行数。 #查看某一版本所修改的文件列表及说明,此命名用得比较多。 svn log -r r196674 -v #查找分支所有的修改 svn log -v --stop-on-copy $URL
3.9、svn info path
[root@svn svn-test]# svn info test.txt Path: test.txt Name: test.txt Working Copy Root Path: /root/svn-test URL: svn://10.0.0.201/svn-test/test.txt Repository Root: svn://10.0.0.201/svn-test Repository UUID: 66b9f439-5010-441e-8e9b-53af2df44b87 Revision: 1 Node Kind: file Schedule: normal Last Changed Author: lawrence Last Changed Rev: 1 Last Changed Date: 2019-11-06 21:54:05 +0800 (Wed, 06 Nov 2019) Text Last Updated: 2019-11-06 21:46:14 +0800 (Wed, 06 Nov 2019) Checksum: 972a1a11f19934401291cc99117ec614933374ce
3.10、svn diff path
#默认将修改的文件与基础版本比较。 svn diff test.php svn diff -r m:n path #对版本m和版本n比较差异 svn diff -r 200:201 test.php 简写:svn di -------------------------------------------- [root@svn svn-test]# echo ccc >> test.txt [root@svn svn-test]# svn commit -m "modify test.txt" test.txt Sending test.txt Transmitting file data . Committed revision 2. [root@svn svn-test]# svn log test.txt ------------------------------------------------------------------------ r2 | lawrence | 2019-11-06 22:28:32 +0800 (Wed, 06 Nov 2019) | 1 line modify test.txt ------------------------------------------------------------------------ r1 | lawrence | 2019-11-06 21:54:05 +0800 (Wed, 06 Nov 2019) | 1 line add file ------------------------------------------------------------------------ [root@svn svn-test]# svn diff test.txt [root@svn svn-test]# svn diff -r 2:1 test.txt Index: test.txt =================================================================== --- test.txt (revision 2) +++ test.txt (revision 1) @@ -1,2 +1 @@ aaa -ccc
3.11、svn merge -r m:n path
#Linux命令行下将两个版本之间的差异合并到当前文件。 svn merge -r m:n path svn merge -r 200:205 test.php #将版本200与205之间的差异合并到当前文件,但是一般都会产生冲突,需要处理一下。
3.12、svn help
#Linux命令行下SVN 帮助。 svn help ci
3.13、svn list path
#显示path目录下的所有属于版本库的文件和目录。 #简写:svn ls [root@svn svn-test]# svn status A c.txt A nn.txt [root@svn svn-test]# svn ls b.txt test.txt
不太常用命令:
参考文档: