前言
开发这几年来,基本都是用的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: 7a441335-b969-42c4-aa80-56391f894982
Password for 'delims': ***** //输入macOS用户密码
Authentication realm: 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
auth
blame (praise, annotate, ann)
cat
changelist (cl)
checkout (co)
cleanup
commit (ci)
copy (cp)
delete (del, remove, rm)
diff (di)
export
help (?, h)
import
info
list (ls)
lock
log
merge
mergeinfo
mkdir
move (mv, rename, ren)
patch
propdel (pdel, pd)
propedit (pedit, pe)
propget (pget, pg)
proplist (plist, pl)
propset (pset, ps)
relocate
resolve
resolved
revert
status (stat, st)
switch (sw)
unlock
update (up)
upgrade