Svn服务器搭建以及常用命令使用方法

delims 于 2018-08-17 发布

前言

开发这几年来,基本都是用的svn客户端管理来管理代码,用过 Versions 和 CornerStone ,很少用命令行,对svn的命令掌握的也不全。我觉得要想在开发这条路上走的更远,熟练的用命令行来管理代码是最基本的技能。用svn命令行管理代码并不复杂,很容易学习,熟练之后会觉得比图形化工具还方便,因为只用键盘就可以操作。最主要是还可以提高逼格。我觉得十分有必要抽一点时间系统的学习一下svn的常用命令。

创建一个本地SVN仓库

为了方便演示svn命令,又不想用自己公司的服务器,可以先搭建一个本地svn服务器。打开终端输入命令:

delimss-MacBook-Pro:~ delims$ svnadmin create ~/svnserver/
delimss-MacBook-Pro:~ delims$ 

svnadmin create [PATH] 是在本地创建一个仓库,此时控制台没有任何输出,我们看看这个目标下生成的文件

delimss-MacBook-Pro:~ delims$ cd ~/svnserver/
delimss-MacBook-Pro:svnserver delims$ ls
README.txt	db		hooks
conf		format		locks

可以看到生成了一堆文件和文件夹,conf文件夹里包含了仓库的配置信息
看下里面有什么

delimss-MacBook-Pro:svnserver delims$ cd conf/
delimss-MacBook-Pro:conf delims$ ls
authz		hooks-env.tmpl	passwd		svnserve.conf

可以看到conf文件夹里包含了4个文件

文件 说明
svnserve.conf 守护进程配置文件
authz 保存了用户名和权限
passwd 保存了用户名的密码
hooks-env.tmpl 钩子脚本环境配置文件

这几个配置文件,有用的代码都是被注释掉的,我们需要手动修改一下,主要是删除注释符号#,其次也会适当做些修改,修改如下:

svnserve.conf

修改前 修改后 说明
[general]
# anon-access = read
# auth-access = write
# password-db = passwd
# authz-db = authz
[general]
anon-access = none
auth-access = write
password-db = passwd
authz-db = authz
anon-access 代表匿名访问权限
赋值给none表示不允许匿名访问
注意:#后面有一个空格也要删除

authz

修改前 修改后 说明
[groups]
# harry_and_sally = harry,sally
# [/foo/bar]
# harry = rw
# * = r
[groups]
harry_and_sally = harry,sally
[/]
&harry_and_sally = rw
* = r
修改这三行,即创建两个用户并组成
一个group,并给予此group所有成员
根目录的读写权限

passwd

修改前 修改后 说明
[users]
# harry = harryssecret
# sally = sallyssecret
[users]
harry = 123
sally = 123
设置用户密码,只是用来演示,
我们就设置一个简单的吧

启动本地svn服务器

配置好以后,我们就启动服务器,键入命令:

delimss-MacBook-Pro:conf delims$ svnserve -d -r ~/svnserver/
delimss-MacBook-Pro:conf delims$ ps -e | grep svn
  974 ??         0:00.00 /Applications/Xcode.app/Contents/Developer/usr/bin/svnserve -d -r /Users/delims/svnserver/
  977 ttys000    0:00.00 grep svn

此时可以看到成功开启了svnserve进程,还可以发现svnserve工具是包含在Xcode中的,不得不感叹,Xcode真是一个百宝囊。

我们随便找个目录把我们本地svn服务器上的仓库拉下来

delimss-MacBook-Pro:temp delims$ svn co svn://localhost
Authentication realm: <svn://localhost:3690> 7a441335-b969-42c4-aa80-56391f894982
Password for 'delims': *****  //输入macOS用户密码

Authentication realm: <svn://localhost:3690> 7a441335-b969-42c4-aa80-56391f894982
Username: harry  //刚才配置的用户名harry
Password for 'harry': ***  //输入我们配置的简单密码123

Checked out revision 0.  //成功检出,版本号为 0

可以看到成功检出了我们本地服务器的仓库并放在了本地。。。

svn命令行操作

我们先来添加一个文件并提交到服务器

delimss-MacBook-Pro:temp delims$ echo 1 > 1.txt  //添加一个文件
delimss-MacBook-Pro:temp delims$ ls
1.txt  //文件添加了
delimss-MacBook-Pro:temp delims$ svn st 
?       1.txt  //可以看到此文件的状态是?,也就是还没有加入到版本控制
delimss-MacBook-Pro:temp delims$ svn add 1.txt //加入到版本控制
A         1.txt //状态变为A,表示已经加入到了版本控制

//提交到服务器,并添加注释
delimss-MacBook-Pro:temp delims$ svn ci 1.txt -m "提交第一个文件" 
Adding         1.txt  
Transmitting file data .done
Committing transaction...
Committed revision 1. //已成功上传到服务器,版本号+1

为了更好的演示,我将AFNetworking的源码放到根目录

delimss-MacBook-Pro:temp delims$ ls
1.txt		AFNetworking
delimss-MacBook-Pro:temp delims$ svn st
?       AFNetworking  //可以看到AFNetworking还没有加入版本控制
delimss-MacBook-Pro:temp delims$ svn add AFNetworking/ \\添加上
这句命令执行完会显示有大量的被添加记录,下面提交到服务器
delimss-MacBook-Pro:temp delims$ svn ci AFNetworking -m "添加AFNetworking"
这句命令执行完后,最后面会显示,说明一已经成功上传到服务器,版本号是2
Transmitting file data ..................................................................................................................................................................................................................................done
Committing transaction...
Committed revision 2.
delimss-MacBook-Pro:temp delims$ svn st  //查看状态,没有任何输出,表示当前没有文件变动
delimss-MacBook-Pro:temp delims$ svn info //查看当前svn信息,发现版本号依然是0
Path: .
Working Copy Root Path: /Users/delims/temp
URL: svn://localhost
Relative URL: ^/
Repository Root: svn://localhost
Repository UUID: 7a441335-b969-42c4-aa80-56391f894982
Revision: 0
Node Kind: directory
Schedule: normal
Last Changed Rev: 0
Last Changed Date: 2018-08-17 09:59:13 +0800 (Fri, 17 Aug 2018)

更新一下代码

delimss-MacBook-Pro:temp delims$ svn update  //更新一下svn
Updating '.':
At revision 2.
delimss-MacBook-Pro:temp delims$ svn info
Path: .
Working Copy Root Path: /Users/delims/temp
URL: svn://localhost
Relative URL: ^/
Repository Root: svn://localhost
Repository UUID: 7a441335-b969-42c4-aa80-56391f894982
Revision: 2
Node Kind: directory
Schedule: normal
Last Changed Author: harry
Last Changed Rev: 2
Last Changed Date: 2018-08-17 12:55:56 +0800 (Fri, 17 Aug 2018)

查看一下svn 提交记录

delimss-MacBook-Pro:temp delims$ svn log
------------------------------------------------------------------------
r2 | harry | 2018-08-17 12:55:56 +0800 (Fri, 17 Aug 2018) | 1 line

添加AFNetworking
------------------------------------------------------------------------
r1 | harry | 2018-08-17 11:44:12 +0800 (Fri, 17 Aug 2018) | 1 line

提交第一个文件
------------------------------------------------------------------------

PS: 这个命令是查看当前仓库所有文件的所有提交记录,如果只是查看某个文件的记录就这样

delimss-MacBook-Pro:temp delims$ svn log 1.txt 
------------------------------------------------------------------------
r1 | harry | 2018-08-17 11:44:12 +0800 (Fri, 17 Aug 2018) | 1 line

提交第一个文件
------------------------------------------------------------------------

如果只查看最近的几条记录就这样

delimss-MacBook-Pro:temp delims$ svn log -l 1  //查看最近的1条记录
------------------------------------------------------------------------
r2 | harry | 2018-08-17 12:55:56 +0800 (Fri, 17 Aug 2018) | 1 line

添加AFNetworking
------------------------------------------------------------------------

当前版本是2,如果我要回到版本1.就这样


delimss-MacBook-Pro:temp delims$ svn update -r 1 //指定版本号
Updating '.':
D    AFNetworking
Updated to revision 1.
delimss-MacBook-Pro:temp delims$ ls
1.txt  //已经回到版本1

浏览服务器上的文件可以这样操作

delimss-MacBook-Pro:temp delims$ svn list svn://localhost
1.txt
AFNetworking/
delimss-MacBook-Pro:temp delims$ svn list svn://localhost/AFNetworking
.cocoadocs.yml
.git/
.gitignore
.travis.yml
AFNetworking/
AFNetworking.podspec
AFNetworking.xcodeproj/
AFNetworking.xcworkspace/
CHANGELOG.md
CONTRIBUTING.md
Example/
Framework/
LICENSE
README.md
Tests/
UIKit+AFNetworking/
fastlane/
delimss-MacBook-Pro:temp delims$ 

创建一个新分支

delimss-MacBook-Pro:temp delims$ svn copy svn://localhost/AFNetworking svn://localhost/AFNetworking2 -m "创建一个新分支"
Committing transaction...
Committed revision 3.  

再来看下服务器上的目录

delimss-MacBook-Pro:temp delims$ svn list svn://localhost
1.txt
AFNetworking/
AFNetworking2/

可以看到服务器上的目录已经被更改了

更新本地,

delimss-MacBook-Pro:temp delims$ svn update
这里会输出大量日志
delimss-MacBook-Pro:temp delims$ ls 
1.txt		AFNetworking	AFNetworking2

可以看到本地文件和服务器同步了 修改文件

delimss-MacBook-Pro:temp delims$ svn st
M       AFNetworking/README.md
delimss-MacBook-Pro:temp delims$ svn ci AFNetworking/README.md -m "修改一个文件" 
Sending        AFNetworking/README.md
Transmitting file data .done
Committing transaction...
Committed revision 4.

先介绍这些吧

键入svn help查看svn所有命令,打印如下:

   add <br>
   auth <br>
   blame (praise, annotate, ann) <br>
   cat <br>
   changelist (cl) <br>
   checkout (co) <br>
   cleanup <br>
   commit (ci) <br>
   copy (cp) <br>
   delete (del, remove, rm) <br>
   diff (di) <br>
   export <br>
   help (?, h) <br>
   import <br>
   info <br>
   list (ls) <br>
   lock <br>
   log <br>
   merge <br>
   mergeinfo <br>
   mkdir <br>
   move (mv, rename, ren) <br>
   patch <br>
   propdel (pdel, pd) <br>
   propedit (pedit, pe) <br>
   propget (pget, pg) <br>
   proplist (plist, pl) <br>
   propset (pset, ps) <br>
   relocate <br>
   resolve <br>
   resolved <br>
   revert <br>
   status (stat, st) <br>
   switch (sw) <br>
   unlock <br>
   update (up) <br>
   upgrade <br>