前言
开发这几年来,基本都是用的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>