- 浏览: 2511512 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (676)
- linux运维 (157)
- php (65)
- mysql (78)
- nginx (27)
- apche (18)
- framework (6)
- windows (9)
- IDE工具 (23)
- struts2 (7)
- java (13)
- 移动互联网 (14)
- memcache redis (23)
- shell基础/命令/语法 (37)
- shell (50)
- puppet (4)
- C (11)
- python (9)
- 产品经理 (27)
- Sphinx (4)
- svn (12)
- 设计构建 (12)
- 项目管理 (44)
- SEO (1)
- 网站架构 (26)
- 审时度势 (42)
- 网络 (14)
- 激发事业[书&视频] (81)
- 其它 (12)
- 摄影 (8)
- android (21)
最新评论
-
zhongmin2012:
原文的书在哪里
数据库水平切分的实现原理解析---分库,分表,主从,集群,负载均衡器 -
renzhengzhi:
你好,请问个问题,从master同步数据到slave的时候,s ...
数据库水平切分的实现原理解析---分库,分表,主从,集群,负载均衡器 -
ibc789:
你好,看了你的文章,我想请教个问题, 我在用 redis的时候 ...
redis 的两种持久化方式及原理 -
iijjll:
写得非常好
数据库水平切分的实现原理解析---分库,分表,主从,集群,负载均衡器 -
iijjll:
写得非常好
数据库水平切分的实现原理解析---分库,分表,主从,集群,负载均衡器
一、版本库访问URL
模式 访问方法
file:/// 直接版本库访问(本地磁盘)。
http:// 通过配置Subversion的Apache服务器的WebDAV协议。
https:// 与http://相似,但是包括SSL加密。
svn:// 通过svnserve服务自定义的协议。
svn+ssh:// 与svn://相似,但通过SSH封装。
二、修订版本关键字
HEAD
版本库中最新的版本。
BASE
工作拷贝中的“原始”修订版本。
COMMITTED
在BASE版本之前(或在Base)一个项目最后修改的版本。
PREV
一个项目最后修改版本之前的那个版本(技术上为COMMITTED -1)。
PREV、BASE、和COMMITTED指的都是本地路径而不是URL
三、修订版本日期
在任何你使用特定版本号和版本关键字的地方,你也可以在“{}”中使用日期,你也可通过日期或者版本号配合使用来访问一段时间的修改!
如下是一些Subversion能够接受的日期格式,注意在日期中有空格时需要使用引号。
$ svn checkout --revision {2002-02-17}
$ svn checkout --revision {15:30}
$ svn checkout --revision {15:30:00.200000}
$ svn checkout --revision {"2002-02-17 15:30"}
$ svn checkout --revision {"2002-02-17 15:30 +0230"}
$ svn checkout --revision {2002-02-17T15:30}
$ svn checkout --revision {2002-02-17T15:30Z}
$ svn checkout --revision {2002-02-17T15:30-04:00}
$ svn checkout --revision {20020217T1530}
$ svn checkout --revision {20020217T1530Z}
$ svn checkout --revision {20020217T1530-0500}
当你指定一个日期,Subversion会在版本库找到接近这个日期的最新版本
你可以使用时间段,Subversion会找到这段时间的所有版本
$ svn log --revision
{2002-11-20}:{2002-11-29}
我们也曾经指出,你可以混合日期和修订版本号
$ svn log --revision {2002-11-20}:4040
四、初始化的checkout
大多数时候,你会使用checkout从版本库取出一个新拷贝开始使用Subversion,这样会在本机创建一个项目的本地拷贝,这个拷贝包括版本库中的HEAD(最新的)版本
$ svn checkout http://svn.collab.net/repos/svn/trunk
通过输入特定URL取出任意深度的子目录
$ svn checkout http://svn.collab.net/repos/svn/trunk/doc/book/tools
在版本库URL之后指定一个目录,这样会将你的工作目录放到你的新目录,举个例子:
$ svn checkout http://svn.collab.net/repos/svn/trunk subv
这样将把你的工作拷贝放到subv而不是和前面那样放到trunk
五、svn status可能返回的状态码
L abc.c # svn已经在.svn目录锁定了abc.c
M bar.c # bar.c的内容已经在本地修改过了
M baz.c # baz.c属性有修改,但没有内容修改
X 3rd_party # 这个目录是外部定义的一部分
foo.o # svn并没有管理foo.o
! some_dir # svn管理这个,但它可能丢失或者不完整
~ qux # 作为file/dir/link进行了版本控制,但类型已经改变
I .screenrc # svn不管理这个,配置确定要忽略它
A + moved_dir # 包含历史的添加,历史记录了它的来历
M + moved_dir/README # 包含历史的添加,并有了本地修改
D stuff/fish.c # 这个文件预定要删除
A stuff/loot/bloo.h # 这个文件预定要添加
C stuff/loot/lump.c # 这个文件在更新时发生冲突
R xyz.c # 这个文件预定要被替换
S stuff/squawk # 这个文件已经跳转到了分支
svn status也有一个--verbose(-v)选项,它可以显示工作拷贝中的所有项目,即使没有改变过
$ svn status --verbose
上面所有的svn status调用并没有联系版本库,只是与.svn中的元数据进行比较的结果,最后,是--show-updates(-u)参数,它将会联系版本库为已经过时的数据添加新信息:
$ svn status --show-updates --verbose
M * 44 23 sally README
M 44 20 harry bar.c
* 44 35 harry stuff/trout.c
D 44 19 ira stuff/fish.c
A 0 stuff/things/bloo.h
Status against revision: 46
这三个命令(svn status、svn diff和 svn revert)都可以在没有网络的情况下工作
六、解决冲突
我们可以使用svn status -u来预测冲突
$ svn update
U INSTALL
G README
C bar.c
Updated to revision 46
C表示冲突,说明服务器上的改动同你的改动冲突了,你需要自己手工去解决
如果你遇到冲突,三件事你可以选择:
1,“手动”合并冲突文本(检查和修改文件中的冲突标志)。
小于号、等于号和大于号串是冲突标记,并不是冲突的数据,你一定要确定这些内容在下次提交之前得到删除,前两组标志中间的内容是你在冲突区所做的修改
修改完毕,并去掉表示的符号
$ svn resolved sandwich.txt
$ svn commit -m "Go ahead and use my sandwich, discarding Sally's edits."
2,用某一个临时文件覆盖你的工作文件。
$ cp sandwich.txt.r2 sandwich.txt
$ svn resolved sandwich.txt
3,运行svn revert <filename>来放弃所有的修改。
七、提交修改
svn commit命令发送所有的修改到版本库,当你提交修改时,你需要提供一些描述修改的日志信息,你的信息会附到这个修订版本上,如果信息很简短,你可以在命令行中使用--message(-m)选项
$ svn commit --message "Corrected number of cheese slices."
Sending sandwich.txt
Transmitting file data .
Committed revision 3.
如果你把写日志信息当作工作的一部分,你也许会希望通过告诉Subversion一个文件名得到日志信息,使用--file选项:
$ svn commit --file logmsg
Sending sandwich.txt
Transmitting file data .
Committed revision 4.
八、检验历史
svn log 展示给你主要信息:附加在版本上的日志信息和所有版本的路径修改。
svn diff
1,检查本地修改
不使用任何参数调用时,svn diff将会比较你的工作文件与缓存在.svn的“原始”拷贝
2,比较工作拷贝与版本库
如果传递一个--revision(-r)参数,你的工作拷贝会与指定的版本比较。
$ svn diff --revision 3 rules.txt
3,比较版本库和版本库
如果通过--revision (-r)传递两个版本号,通过冒号分开,这两个版本会进行比较
$ svn diff --revision 2:3 rules.txt
你不仅可以用svn diff比较你工作拷贝中的文件,你甚至可以通过提供一个URL参数来比较版本库中两个文件的的区别,通常在本地机器没有工作拷贝时非常有用
svn cat 如果你只是希望检查一个过去的版本而不希望察看它们的区别,使用svn cat
svn list可以在不下载文件到本地目录的情况下来察看目录中的文件
$ svn list http://svn.collab.net/repos/svn
如果你希望察看详细信息,你可以使用--verbose (-v)参数
$ svn list --verbose http://svn.collab.net/repos/svn
九、其他命令
svn cleanup 查找工作拷贝中的所有遗留的日志文件,删除进程中的锁
svn import命令是拷贝用户的一个未被版本化的目录树到版本库最快的方法
$ svnadmin create /usr/local/svn/newrepos
$ svn import mytree file:///usr/local/svn/newrepos/some/project
Adding mytree/foo.c
Adding mytree/bar.c
Adding mytree/subdir
Adding mytree/subdir/quux.h
Committed revision 1.
将会拷贝目录mytree到版本库的some/project
$ svn list file:///usr/local/svn/newrepos/some/project
bar.c
foo.c
subdir/
===============================================================================================
分支与合并
一、建立分支
建立分支最简单的方法:svn copy可以直接对两个URL操作
$ svn copy http://svn.example.com/repos/calc/trunk \
http://svn.example.com/repos/calc/branches/my-calc-branch \
-m "Creating a private branch of /calc/trunk."
Committed revision 341.
二、拷贝特定的修改
查看区别
$ svn diff -r 343:344 http://svn.example.com/repos/calc/trunk
svn merge命令几乎完全相同,但不是打印区别到你的终端,它会直接作为本地修改作用到你的本地拷贝
$ svn merge -r 343:344 http://svn.example.com/repos/calc/trunk
U integer.c
$ svn status
M integer.c
当你提交你的修改时,确定你的日志信息中说明你是从某一版本搬运了修改
$ svn commit -m "integer.c: ported r344 (spelling fixes) from trunk."
svn merge这个命令包括三个参数:
1,初始的版本树(通常叫做比较的左边),
2,最终的版本树(通常叫做比较的右边),
3,一个接收区别的工作拷贝(通常叫做合并的目标)。
svn merge的语法允许非常灵活的指定参数
$ svn merge http://svn.example.com/repos/branch1@150 \
http://svn.example.com/repos/branch2@212 \
my-working-copy
$ svn merge -r 100:200 http://svn.example.com/repos/trunk my-working-copy
$ svn merge -r 100:200 http://svn.example.com/repos/trunk
第一种语法使用URL@REV的形式直接列出了所有参数,
第二种语法可以用来作为比较同一个URL的不同版本的简略写法,
最后一种语法表示工作拷贝是可选的,如果省略,默认是当前目录。
三、预览合并
$ svn merge --dry-run -r 343:344 http://svn.example.com/repos/calc/trunk
U integer.c
$ svn status
# nothing printed, working copy is still unchanged.
--dry-run选项实际上并不修改本地拷贝,它只是显示实际合并时的状态信息,对于得到“整体”的印象,这个命令很有用,因为svn diff包括太多细节
四、常见用例
查
找分支产生的版本(分支的“基准”)的最好方法是在svn
log中使用--stop-on-copy选项,log子命令通常会显示所有关于分支的变化,包括
创建分支的过程,就好像你在主干上一样,--stop-on-copy会在svn log检测到目标拷贝或者改名时中止日志输出
$ svn log --verbose --stop-on-copy \
http://svn.example.com/repos/calc/branches/my-calc-branch
…
------------------------------------------------------------------------
r341 | user | 2002-11-03 15:27:56 -0600 (Thu, 07 Nov 2002) | 2 lines
Changed paths:
A /calc/branches/my-calc-branch (from /calc/trunk:340)
$
如下是最终的合并过程,然后
$ cd calc/trunk
$ svn update
At revision 405.
$ svn merge -r 341:405 http://svn.example.com/repos/calc/branches/my-calc-branch
U integer.c
U button.c
U Makefile
$ svn status
M integer.c
M button.c
M Makefile
# ...examine the diffs, compile, test, etc...
$ svn commit -m "Merged my-calc-branch changes r341:405 into the trunk."
Sending integer.c
Sending button.c
Sending Makefile
Transmitting file data ...
Committed revision 406.
五、取消修改
svn merge另一个常用的做法是取消已经做得提交
$ svn merge -r 303:302 http://svn.example.com/repos/calc/trunk
U integer.c
$ svn status
M integer.c
$ svn diff
…
# verify that the change is removed
…
$ svn commit -m "Undoing change committed in r303."
Sending integer.c
Transmitting file data .
Committed revision 350.
六、找回删除的项目
一个好的策略是使用svn log --verbose来察看你删除的项目,--verbose选项显示所有改变的项目的每一个版本 ,你只需要找出你删除文件或目录的那一个版本
svn copy命令,精确的拷贝版本和路径“坐标对”到你的工作拷贝
$ svn copy --revision 807 \
http://svn.example.com/repos/calc/trunk/real.c ./real.c
$ svn status
A + real.c
$ svn commit -m "Resurrected real.c from revision 807, /calc/trunk/real.c."
Adding real.c
Transmitting file data .
Committed revision 1390.
七、发布分支
这是版本控制可以做的帮助,典型的过程如下:
开发者提交所有的新特性到主干。 每日的修改提交到/trunk:新特性,bug修正和其他。
这个主干被拷贝到“发布”分支。 当小组认为软件已经做好发布的准备(如,版本1.0)然后/trunk会被拷贝到/branches/1.0。
项目组继续并行工作,一个小组开始对分支进行严酷的测试,同时另一个小组在/trunk继续新的工作(如,准备2.0),如果一个bug在任何一个位置被发现,错误修正需要来回运送。然而这个过程有时候也会结束,例如分支已经为发布前的最终测试“停滞”了。
分支已经作了标签并且发布,当测试结束,/branches/1.0作为引用快照已经拷贝到/tags/1.0.0,这个标签被打包发布给客户。
分支多次维护。当继续在/trunk上为版本2.0工作,bug修正继续从/trunk运送到/branches/1.0,如果积累了足够的bug修正,管理部门决定发布1.0.1版本:拷贝/branches/1.0到/tags/1.0.1,标签被打包发布。
整个过程随着软件的成熟不断重复:当2.0完成,一个新的2.0分支被创建,测试、打标签和最终发布,经过许多年,版本库结束了许多版本发布,进入了“维护”模式,许多标签代表了最终的发布版本。
八、转换工作拷贝
svn switch命令改变存在的工作拷贝到另一个分支
$ svn info | grep URL
URL: http://svn.example.com/repos/calc/trunk
$ svn switch http://svn.example.com/repos/calc/branches/my-calc-branch
U integer.c
U button.c
U Makefile
Updated to revision 341.
$ svn info | grep URL
URL: http://svn.example.com/repos/calc/branches/my-calc-branch
九、版本库布局
如果一个版本库只是存放一个项目,人们会在顶级目录创建这些目录:
/trunk
/branches
/tags
如果一个版本库保存了多个项目,管理员会通过项目来布局
/paint/trunk
/paint/branches
/paint/tags
/calc/trunk
/calc/branches
/calc/tags
十、数据的生命周期
假定你最终完成了calc项目你的个人分支上的所有工作,在合并了你的所有修改到/calc/trunk后,没有必要继续保留你的私有分支目录
$ svn delete http://svn.example.com/repos/calc/branches/my-calc-branch \
-m "Removing obsolete branch of calc project."
Committed revision 375.
如果浏览你删除的目录还不足够,你可以把它找回来,恢复数据对Subversion来说很简单,如果你希望恢复一个已经删除的目录(或文件)到HEAD,仅需要使用svn copy -r来从旧的版本拷贝出来
$ svn copy -r 374 http://svn.example.com/repos/calc/branches/my-calc-branch \
http://svn.example.com/repos/calc/branches/my-calc-branch
发表评论
-
svnchanged_export.py 导出svn版本之间的变更文件
2012-06-18 17:03 3812===================== ... -
【汇总】svn
2011-12-22 13:13 1472========================回 ... -
shell之同步svn代码到os
2011-11-23 11:37 3201#!/bin/sh #SVN路径 svn_path_ ... -
批量删除版本库中的.svn文件夹(win客户端)
2011-10-17 15:40 1808安装:建立一个文本文件,随意起个名字,例如aaa.reg ... -
从SVN导出指定版本号之间修改的文件
2011-08-21 14:15 3584当一个网站项目进入运营维护阶段以后,不会再频繁地更新全部源文件 ... -
(图解) SVN版本冲突解决详解
2010-09-20 10:45 6254版本冲突原因: 假设 A 、 B ... -
TortoiseSVN 汉化版安装
2009-10-31 10:36 4837http://tortoisesvn.net/download ... -
[已测试]centos安装配置svn,并更新源代码
2009-09-10 13:28 3746安装完lamp以后,通过查看/etc/passwd /etc ... -
svn利用TortoiseSVN忽略文件或文件夹(目录)
2009-08-07 11:01 3074如果文件已经存在于版本库,你需要做以下步骤: To ... -
ubuntu安装配置svn,并更新源代码
2009-07-23 22:03 5807=============================== ... -
windows下搭建svn (一)
2009-06-15 21:37 17291 svn 下载页面:http://subversion.ti ...
相关推荐
svn操作手册svn操作手册svn操作手册svn操作手册svn操作手册
SVN svn SVN中文手册 SVN资料 svn配置SVN svn SVN中文手册 SVN资料 svn配置SVN svn SVN中文手册 SVN资料 svn配置SVN svn SVN中文手册 SVN资料 svn配置SVN svn SVN中文手册 SVN资料 svn配置SVN svn SVN中文手册 SVN...
SVN手册 For Subversion 1.7
SVN手册文档 pdf.zip
Version Control with Subversion For Subversion 1.6
SVN Tortoise客户端用法,经典SVN操作手册
SVN1.9 英文手册,来自官方安装包
svn手册 htm 文件svn手册 htm 文件
在linux下的svn英文版使用手册,包括一些常用命令和基本操作
svn用户手册 svn常见操作 svn用户手册 svn常见操作 svn用户手册 svn常见操作
文档中有详细的svn下载、安装和使用的内容,本文档是个人手工整理。
svn手册 word排版,可供直接下载打印。 初学svn,可从此手册入手,能比较快的了解svn的基本原理,怎么使用,如何实现版本控制,以及基本的菜单操作,结合tortoise使用,更加得心应手。
svn 操作手册 svn使用说明 svn中文说明书 这个说明书是中文版的,基于1.7.9的,从官方下载的。
SVN安装配置手册,想学习svn的来看看吧,svn不错的哦
SVN使用手册.pdf
SVN用户操作手册 SVN用户操作手册 SVN用户操作手册
SVN使用手册大全,让你知道如何使用SVN
svn安装配置手册 svn安装配置手册 svn安装配置手册
svn中文手册 PowerDesigner中文手册
SVN命令使用手册.doc SVN命令使用手册.doc SVN命令使用手册.doc