创建版本
版本库相当于一个集中的空间,用于存放开发者所有的工作成果。版本库不仅能存放文件,还包括了每次修改的历史,即每个文件的变动历史。
Create 操作是用来创建一个新的版本库。大多数情况下这个操作只会执行一次。当你创建一个新的版本库的时候,你的版本控制系统会让你提供一些信息来标识版本库,例如创建的位置和版本库的名字。
svnadmin create /pathto/repository
这里有详细的说明
检出操作
Checkout 操作是用来从版本库创建一个工作副本。工作副本是开发者私人的工作空间,可以进行内容的修改,然后提交到版本库中。
svn checkout http://路径(目录或文件的全路径) [本地目录全路径] --username 用户名
svn checkout svn://路径(目录或文件的全路径) [本地目录全路径] --username 用户名
# 例子:
svn co svn://localhost/测试工具 /home/testtools --username wzhnsc
svn co http://localhost/test/testapp --username wzhnsc
svn checkout svn://localhost/测试工具 /home/testtools --username wzhnsc
svn checkouthttp://localhost/test/testapp --username wzhnsc
注:如果不带--password 参数传输密码的话,会提示输入密码,建议不要用明文的--password 选项。
其中 username 与 password前是两个短线,不是一个。
不指定本地目录全路径,则检出到当前目录下。
检出用户权限之内的仓库到当前目录
D:\\SRC\\SVNdemo
λ svn checkout svn://192.168.56.101/whoami --username=iamwho
Checked out revision 0.
D:\\SRC\\SVNdemo
λ ls
whoami/
D:\\SRC\\SVNdemo
λ ls -a whoami\\
./ ../ .svn/
如果是第一进行需要进行认证
λ svn checkout svn://192.168.56.101/whoami --username=iamwho
Authentication realm: <svn://192.168.56.101:3690> c25526d4-9179-46e8-b951-a0ee69630537
Password for 'iamwho': ******
Checked out revision 0.
也可以使用TortoiseSVN进行可视化操作。
导出文件
干净模式
svn export [-r 版本号] http://路径(目录或文件的全路径) [本地目录全路径] --username 用户名
svn export [-r 版本号] svn://路径(目录或文件的全路径) [本地目录全路径] --username 用户名
svn export 本地检出的(即带有.svn文件夹的)目录全路径 要导出的本地目录全路径
例子:
svn export svn://localhost/测试工具 /home/testtools --username wzhnsc
svn export svn://localhost/test/testapp --username wzhnsc
svn export /home/testapp /home/testtools
注:第一种从版本库导出干净工作目录树的形式是指定URL,
如果指定了修订版本号,会导出相应的版本,
如果没有指定修订版本,则会导出最新的,导出到指定位置。
如果省略 本地目录全路径,URL的最后一部分会作为本地目录的名字。
第二种形式是指定 本地检出的目录全路径 到 要导出的本地目录全路径,所有的本地修改将会保留,
但是不在版本控制下(即没提交的新文件,因为.svn文件夹里没有与之相关的信息记录)的文件不会拷贝。
切换URL
svn switch http://目录全路径 本地目录全路径
例子:
svn switch http://localhost/test/456 . <- (原为123的分支)当前所在目录分支到localhost/test/456
导入文件
svn import [PATH] URL
例子:
svn import /home/testtools svn://localhost/test/testapp --username=user0
将未版本化的文件或树提交到存储库中。
查看相关
目录结构
svn list svn://路径(目录或文件的全路径)
svn ls svn://路径(目录或文件的全路径)
例子:
svn list svn://localhost/test
svn ls svn://localhost/test <- 显示svn://localhost/test目录下的所有属于版本库的文件和目录
文件信息
svn info 文件名
例子:
svn info test.php
文件内容
svn cat http://文件全路径
例子:
svn cat http://localhost/test/readme.txt
19、新建一个分支copy
svn copy branchA branchB -m "make B branch" // 从branchA拷贝出一个新分支branchB
20、合并内容到分支merge
svn merge branchA branchB // 把对branchA的修改合并到分支branchB
文件日志
svn log 文件名
例子:
svn log test.php<- 显示这个文件的所有修改记录,及其版本号的变化
文件状态
使用svn status
查看当前状态,其格式
svn st 目录路径/名
svn status 目录路径/名<- 目录下的文件和子目录的状态,正常状态不显示
【?:不在svn的控制中; M:内容被修改;C:发生冲突;
A:预定加入到版本库;K:被锁定】
svn -v 目录路径/名
svn status -v 目录路径/名<- 显示文件和子目录状态
【第一列保持相同,第二列显示工作版本号,
第三和第四列显示最后一次修改的版本号和修改人】
命令帮助
svn help <- 全部功能选项
svn help ci <- 具体功能的说明
文件差异
svn diff 文件名
svn diff -r 修正版本号m:修正版本号n 文件名
例子:
svn diff test.php<- 将修改的文件与基础版本比较
svn diff -r 200:201 test.php<- 对 修正版本号200 和 修正版本号201 比较差异
提交更改
Commit 操作是用来将更改从工作副本到版本库。这个操作会修改版本库的内容,其它开发者可以通过更新他们的工作副本来查看这些修改。
在提交之前,你必须将文件/目录添加到待变更列表中。列表中记录了将会被提交的改动。当提交的时候,我们通常会提供一个注释来说明为什么会进行这些改动。这个注释也会成为版本库历史记录的一部分。Commit 是一个原子操作,也就是说要么完全提交成功,要么失败回滚。用户不会看到成功提交一半的情况。例如在当前目录中添加一个Python文件,文件的图标会出现一个符号
以下是在Cmder中的操作
可以看到Cmder似乎支持(用白色小括号显示当前发生了更改)显示svn status,并且当前目录中有一个预定加入到版本库的文件。
添加文件
使用svn add
和svn commit
,其一般格式如下
svn add 文件名
注:告诉SVN服务器要添加文件了,还要用svn commint -m真实的上传上去!
例子:
svn add test.php <- 添加test.php
svn commit -m “添加我的测试用test.php“ test.php
svn add *.php <- 添加当前目录下所有的php文件
svn commit -m “添加我的测试用全部php文件“ *.php
添加文件
svn add
返回svn status
的状态值,并且小括号变成红色。
提交文件
提交后svn status
值为空并且小括号颜色变回白色。
添加目录
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 ‘
提交更改
svn commit -m “提交备注信息文本“ [-N] [--no-unlock] 文件名
svn ci -m “提交备注信息文本“ [-N] [--no-unlock] 文件名
必须带上-m参数,参数可以为空,但是必须写上-m
例子:
svn commit -m “提交当前目录下的全部在版本控制下的文件“ * <- 注意这个*表示全部文件
svn commit -m “提交我的测试用test.php“ test.php
svn commit -m “提交我的测试用test.php“ -N --no-unlock test.php <- 保持锁就用–no-unlock开关
svn ci -m “提交当前目录下的全部在版本控制下的文件“ * <- 注意这个*表示全部文件
svn ci -m “提交我的测试用test.php“ test.php
svn ci -m “提交我的测试用test.php“ -N --no-unlock test.php <- 保持锁就用–no-unlock开关
Tortoise图标
使用TortoiseSVN通常图标会发生一定的变化如下
其中一个文件带着绿色小勾的是已经存在于版本库之中的文件,而本来应该带着问号的toDemo.py是未在版本库之中的。当前添加toDemo.py后又发生如下变化:
可以看到文件图标上添加了一个蓝色加号,继续提交后
可以看到文件图标加号变成了绿色小勾了。
通常TortoiseSVN的图标变化如下:
这是一些常用的,个别可以在 setting --> icon set 中查看
删除文件
其格式一般如下
svn delete svn://路径(目录或文件的全路径) -m “删除备注信息文本”
推荐如下操作:
svn delete 文件名
svn ci -m “删除备注信息文本”
例子:
svn delete svn://localhost/testapp/test.php -m “删除测试文件test.php”
推荐如下操作:
svn delete test.php
svn ci -m “删除测试文件test.php”
删除toDemo.py文件
可以看到文件状态变成D
了,继续提交
加锁解锁
锁定工作拷贝中文件,避免其他用户修改导致冲突。
svn lock -m “加锁备注信息文本“ [--force] 文件名
svn unlock 文件名
例子:
svn lock -m “锁信测试用test.php文件“ test.php
svn unlock test.php
更新版本
顾名思义,update 操作是用来更新版本库的。这个操作将工作副本与版本库进行同步。由于版本库是由整个团队共用的,当其他人提交了他们的改动之后,你的工作副本就会过期。
让我们假设 Tom 和 Jerry 是一个项目的两个开发者。他们同时从版本库中检出了最新的版本并开始工作。此时,工作副本是与版本库完全同步的。然后,Jerry 很高效的完成了他的工作并提交了更改到版本库中。
此时 Tom 的工作副本就过期了。更新操作将会从版本库中拉取 Jerry 的最新改动并将 Tom 的工作副本进行更新。
更新格式
svn update
svn update -r 修正版本 文件名
svn update 文件名
例子:
svn update <- 后面没有目录,默认将当前目录以及子目录下的所有文件都更新到最新版本
svn update -r 200 test.cpp <- 将版本库中的文件 test.cpp 还原到修正版本(revision)200
svn update test.php <- 更新与版本库同步。
提交的时候提示过期冲突,需要先 update 修改文件,
然后清除svn resolved,最后再提交commit。
- 在A端修改文件toTest.py,然后执行提交
D:\\SRC\\SVNdemo\\iamwho ()
λ svn status
M toTest.py
D:\\SRC\\SVNdemo\\iamwho ()
λ svn commit -m "modify the file"
Sending toTest.py
Transmitting file data .done
Committing transaction...
Committed revision 4.
- 在B端进行更新
D:\\SRC\\SVNdemo\\whoami ()
λ svn update toTest.py
Updating 'toTest.py':
U toTest.py
Updated to revision 4.
D:\\SRC\\SVNdemo\\whoami ()
λ cat toTest.py
# encoding:utf-8
print("Hello SVN!")
修复错误
我们来假设你对工作副本做了许多修改,但是现在你不想要这些修改了,这时候 revert 操作将会帮助你。
Revert 操作重置了对工作副本的修改。它可以重置一个或多个文件/目录。当然它也可以重置整个工作副本。在这种情况下,revert 操作将会销毁待变更列表并将工作副本恢复到原始状态。
svn revert [--recursive] 文件名
注意: 本子命令不会存取网络,并且会解除冲突的状况。但是它不会恢复被删除的目录。
例子:
svn revert foo.c <- 丢弃对一个文件的修改
svn revert --recursive . <-恢复一整个目录的文件,. 为当前目录
复制分支
完整复制
svn copy URL URL
例子:
svn copy file:///home/c7mon/svn/cellsms/trunk/wwm file:///home/c7mon/svn/cellsms/trunk/tags/wwm_1.0 -m "it's the wwm_1.0 foranhui" 。
完全的服务器端拷贝,通常用在分支和标签。 如wwm项目完成后发布版本wwm_1.0
合并分支
svn 中并无特别的分支操作,可以用copy 或者 checkout一个版本进行操作,主要的是合并操作merge
svn merge SOURCE[@REV] [TARGET_WCPATH]
svn merge [-c M[,N...] | -r N:M ...] SOURCE[@REV] [TARGET_WCPATH]
svn merge SOURCE1[@REV1] SOURCE2[@REV2] [TARGET_WCPATH]
可以使用svn help merge
查看具体操作
创建如下的两个分支:
............
. .
trunk --+------------L--------------R------
\\ \\ |
\\ v
feature +------------------------o-----
r100 r200
D:\\SRC\\SVNdemo\\iamwho ()
λ svn copy trunk/ branches/feature
A branches\\feature
查看状态
D:\\SRC\\SVNdemo\\iamwho ()
λ svn st
A + branches\\feature
提交新增的分支到版本库。
D:\\SRC\\SVNdemo\\iamwho ()
λ svn commit -m "add feature"
Adding branches\\feature
Committing transaction...
Committed revision 8.
进入feature分支操作
D:\\SRC\\SVNdemo\\iamwho\\branches\\feature (branches/feature)
λ touch index.md
D:\\SRC\\SVNdemo\\iamwho\\branches\\feature (branches/feature)
λ ls
HelloWorld.md index.md readme
D:\\SRC\\SVNdemo\\iamwho\\branches\\feature (branches/feature)
λ svn add index.md
A index.md
D:\\SRC\\SVNdemo\\iamwho\\branches\\feature (branches/feature)
λ svn commit -m "add a index page"
Adding index.md
Transmitting file data .done
Committing transaction...
Committed revision 11.
切换到 trunk ,执行 svn update,然后将 feature 分支合并到 trunk 中。
$ svn merge ../branches/feature
--- Merging r9 through r12 into '.':
A index.md
--- Recording mergeinfo for merge of r9 through r12 into '.':
U .
$ ls
HelloWorld.md index.md readme
$ svn commit -m "add a index page"
Sending .
Adding index.md
Committing transaction...
Committed revision 13.
解决冲突
合并的时候可能会发生冲突。Merge 操作会自动处理可以安全合并的东西。其它的会被当做冲突。例如,"foo.c" 文件在一个分支上被修改,在另一个分支上被删除了。这种情况就需要人为处理。Resolve 操作就是用来帮助用户找出冲突并告诉版本库如何处理这些冲突。
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除了删除冲突文件,还修正了一些记录在工作拷贝管理区域的记录数据,所以我们推荐你使用这个命令。
标签操作
版本管理系统支持 tag 选项,通过使用 tag 的概念,我们可以给某一个具体版本的代码一个更加有意义的名字。
Tags 即标签主要用于项目开发中的里程碑,比如开发到一定阶段可以单独一个版本作为发布等,它往往代表一个可以固定的完整的版本,这跟 VSS 中的 Tag 大致相同。
在本地工作副本创建一个 tag。
λ svn checkout svn://192.168.56.101/whoami iamwho --username=iamwho
A iamwho\\branches
A iamwho\\tags
A iamwho\\trunk
A iamwho\\toTest.py
Checked out revision 5.
D:\\SRC\\SVNdemo\\iamwho ()
λ svn copy trunk\\ tags\\v1.0
A tags\\v1.0
上面的代码成功完成,新的目录将会被创建在 tags 目录下。
D:\\SRC\\SVNdemo\\iamwho ()
λ ls tagsv1.0/
D:\\SRC\\SVNdemo\\iamwho ()
λ ls tags\\v1.0HelloWorld.md readme
查看状态。
D:\\SRC\\SVNdemo\\iamwho ()
λ svn status
A + tags\\v1.0
A + tags\\v1.0\\HelloWorld.md
A + tags\\v1.0\\readme
提交tag内容。
D:\\SRC\\SVNdemo\\iamwho ()
λ svn commit -m "tags v1.0"
Adding tags\\v1.0
Adding tags\\v1.0\\HelloWorld.md
Adding tags\\v1.0\\readme
Committing transaction...
Committed revision 7.