SVN简明课程
Reference: http://www.cnblogs.com/wangkangluo1/archive/2011/08/11/2135312.html
1. 版本控制介绍
1.1. 什么是版本控制
版本控制系统用于保存编写开发应用程序时的文档的各个修订版(revision)。
版本控制也称作Revision Control System(RCS)。
名词解释:
- 修订版(revision):可以认为是某个文件在其生命周期内各个保存的快照,每个快照和一个时间区间对应。
- 版本库(Repository):存放修订版的数据库
- 本地工作拷贝(Local working copy):修订版在本地的副本
- 版本的检入(Check in):本地副本提交到服务器的版本库
- 检出(Check out):从服务器的版本库中取出修订版成为本地副本
- 版本号的来源:有两种策略,基于文件的计数和基于仓库的计数,subversion使用后者
- 标签(Tags):为版本加一个名字,便于检出
- 分支(Branches):修订版打分支,以后可以平行修改,互不干扰
- 合并(Merging):将分支的修订版合并为一个新的修订版
- 锁(Locking):为修订版枷锁
- 冲突(Conflict):并发版本控制时防止修订版混乱的错误机制
1.2. 使用版本控制的好处
对团队和个人都有好处:
- 为团队提供了所有项目文档的回退按钮;
- 支持多个开发人员在可控的方式下为相同的代码工作;
- 版本控制系统保存了文档在过去的各个改动,便于查找是谁,在何时,因为什么修改了文档;
- 支持在文档的主线上同时有多个版本;
- 支持查询在某个时点上项目各个文档的状态,可用于研究生产效率等,也可用于对以前的软件发行版的再发行。
1.3. 常见的版本控制系统
VSS:Visual Source Save,微软公司的版本控制器软件,http://msdn2.microsoft.com/zh-cn/vstudio/aa718670.aspx
CVS:Concurrent Versions System,开源免费,http://www.nongnu.org/cvs/
Subversion,开源免费,http://subversion.tigris.org/
ClearCase,IBM公司,http://www-306.ibm.com/software/awdtools/clearcase/
2. Subversion介绍
Subversion是新一代的版本控制工具,正逐步替代CVS。
资源:
subversion中文站:http://www.subversion.org.cn/
subversion与cvs的对比:http://www.uml.org.cn/pzgl/200705251.asp
3. Subversion基本使用
3.1. Subversion安装
Subversion是典型的C/S模式应用程序。
Windows环境下的安装包:http://subversion.tigris.org/files/documents/15/41687/svn-1.4.6-setup.exe
安装过程很简单,图形界面,默认选择即可。
输入svn命令查看安装是否成功:
svn --version
svn命令是subversion程序的客户端
svnserver命令可以启动svn服务器,用于搭建简易的svn服务器环境
见:http://www.easymorse.com/bbs/viewthread.php?tid=95&extra=page%3D1
3.2. 服务器端
以下是搭建简易的服务器端环境的做法,正式一般配合apache通过http访问。
3.2.1. 创建版本库
创建服务器端版本库,相当于DBMS创建数据库示例。
命令行:
svnadmin create file_path/repo_name
3.2.2. 启动服务器
svnserve.exe -d -r file_path
- -d 后台执行
- -r 版本库的根目录
访问该版本库的url:svn//localhost/repo_name
3.3. 客户端
3.3.1. 初始导入(import)
通过命令行导入:
svn import -m "init import" http://10.0.0.6/svn/teaching/
该命令可将当前路径下文件导入到版本库中。
3.3.2. 检出(checkout)
通过命令行检入:
svn co http://hibernate3demo.googlecode.com/svn/tags/helloworld_r1
或者:
svn checkout http://hibernate3demo.googlecode.com/svn/tags/helloworld_r1
或者:通过第三方图形工具的检出,比如tortoiseSVN(http://tortoisesvn.tigris.org/)
将svn服务器的最新修订版下载到本地成为本地工作拷贝。
3.3.3. 保持更新(update)
命令行:
svn update
或者
svn up
或者通过tortoiseSVN
或者通过eclipse插件,subclipse(http://subclipse.tigris.org/),在线安装:http://subclipse.tigris.org/update_1.2.x/
用svn服务器的最新修订版更新本地工作拷贝。
多人合作时:
- 更新要经常频繁的做,尽量让问题及早暴露,便于处理。
- 提交代码前要更新,否则容易产生版本冲突。
3.3.4. 添加(add)
命令行:
svn add file_path
或者通过tortoiseSVN,eclipse插件。
告知svn服务器,添加目录和/或文件到服务器上,这个操作类似SQL的insert,但是并没有真的操作,直到commit。
3.3.5. 提交改动
相当于通用概念:检入(checkin)。
命令行:
svn commit
或者:
svn ci
或者通过tortoiseSVN,eclipse插件。
提交本地工作拷贝的所有改动,而且是原子性的。
要求:一般要注明修改的原因
svn ci -m "修改bug #224"
要求:提交之前要做更新
svn up
svn ci -m "修改bug #224"
3.3.6. 还原改动
对应提交(commit),要有类似回滚(rollback)的操作。
svn revert
或者通过tortoiseSVN,eclipse插件。
这个操作对开发人员十分有用,在改动被人很多代码后可以“一键恢复”。
3.3.7. “还原”已提交的改动
revert只适合未提交的情况。
如果已经提交,发现问题,要回退到之前的修订版。
首先需要:
svn up
让本地工作拷贝更新到最新状态。
然后:
svn log your_file_path
查看文件日志,这时候提交时填写的说明信息就派上用场了。
查看两个修订版之间的不同:
svn diff -r 旧修订版序号:新修订版序号 your_file_path
或者通过tortoiseSVN,eclipse插件。
决定用哪个旧的修订版号后,用旧的修订版号文件覆盖新的修订版号文件。
svn merge -r 新修订版序号:旧修订版序号 your_file_path
还需要:
svn commit -m "恢复到某修订版(某修订版作废)"
或者通过tortoiseSVN,eclipse插件。
这个还原是所谓的,不是用旧的版本号替代,而是将旧文件覆盖新文件。
3.3.8. 拷贝文件和目录
命令行:
svn copy path/file_name newpath/new_file_name
svn commit -m "xxxx"
或者:
svn cp path/file_name newpath/new_file_name
svn commit -m "xxxx"
或者:利用windows的资源管理器/unix的cp命令
或者通过tortoiseSVN,eclipse插件。
svn的copy,是很重要的工具,版本分支和标签等概念都通过它实现。
svn的copy,是廉价的拷贝。
3.3.9. 重命名目录/文件
命令行:
svn move file_name new_file_name
或者:
svn mv file_name new_file_name
3.3.10. 处理合并冲突
svn默认不对文件加锁。
如果不同人编辑了同一个文件的不同部分,提交时会自动合并。
如果不同人编辑了同一个文件的同一部分,后提交者会报告合并冲突。
解决方法(人工仲裁):
- 放弃改动;
- 坚持你的改动,找到.mine的文件名,恢复为原文件名,然后执行:
svn resolved file_name
3.3.11. 删除文件
将本地工作拷贝删除。
命令行:
svn delete file_path
或者:
svn del file_path
4. Subversion高级内容
4.1. 文件锁
一般用于二进制内容,因为无法合并。
如果某个文件加锁,其他用户的本地工作拷贝(更新后)将是只读的。
当该用户提交后,其他用户的本地工作拷贝(更新后)才可以写操作。
其他用户可以“撬锁”,然后进行写操作。
高级配置可以配置“撬锁”权限,使不是什么人都可以“撬锁”。
4.2. 版本库创建策略
单一的版本库保存一个项目。
单一的版本库保存多个项目。
多个版本库。
4.3. 使用标签和分支
在svn中标签和分支都源于copy命令。
3个约定俗成的目录:
- trunk:主干
- branches:分支
- tags:标签
发布分支:
svn cp -m "创建用于实现radio标签的分支" https://easymorse-simpletag.googlecode.com/svn/branches/simpletag_select_1 https://easymorse-simpletag.googlecode.com/svn/branches/simpletag_select_2
切换分支:
svn switch https://easymorse-simpletag.googlecode.com/svn/branches/simpletag_select_2
合并分支需要两个步骤:
合并操作
svn merge -r 33:HEAD https://easymorse-simpletag.googlecode.com/svn/branches/simpletag_select_2
或者:
svn merge https://easymorse-simpletag.googlecode.com/svn/trunk/simpletag@HEAD https://easymorse-simpletag.googlecode.com/svn/branches/simpletag_select_1@HEAD
提交。
5. 未讲到的内容
- svn备份
- subversion属性
- 与apache集成的配置和使用
原文链接:http://www.iteye.com/topic/28013
一直以来用svn只是当作cvs,也从来没有仔细看过文档,直到今天用到,才去翻看svn book文档,惭愧
需求一:
有一个客户想对产品做定制,但是我们并不想修改原有的svn中trunk的代码。
方法:
用svn建立一个新的branches,从这个branche做为一个新的起点来开发
- svn copy svn://server/trunk svn://server/branches/ep -m "init ep"
Tip:
如果你的svn中以前没有branches这个的目录,只有trunk这个,你可以用
- svn mkdir branches
新建个目录
需求二:
产品开发已经基本完成,并且通过很严格的测试,这时候我们就想发布给客户使用,发布我们的1.0版本
- svn copy svn://server/trunk svn://server/tags/release-1.0 -m "1.0 released"
咦,这个和branches有什么区别,好像啥区别也没有?
是的,branches和tags是一样的,都是目录,只是我们不会对这个release-1.0的tag做修改了,不再提交了,如果提交那么就是branches
需求三:
有一天,突然在trunk下的core中发现一个致命的bug,那么所有的branches一定也一样了,该怎么办?
- svn -r 148:149 merge svn://server/trunk branches/ep
其中148和149是两次修改的版本号。
其他的呢?看文档
原文地址:http://blog.chinaunix.net/space.php?uid=22976768&do=blog&id=1640924
svn checkout path(path是服务器上的目录)
例如:svn checkout svn://192.168.1.1/pro/domain
简写:svn co
2、往版本库中添加新的文件
svn add file
例如:svn add test.php(添加test.php)
svn add *.php(添加当前目录下所有的php文件)
3、将改动的文件提交到版本库
svn commit -m “LogMessage“ [-N] [--no-unlock] PATH(如果选择了保持锁,就使用–no-unlock开关)
例如:svn commit -m “add test file for my test“ test.php
简写:svn ci
4、加锁/解锁
svn lock -m “LockMessage“ [--force] PATH
例如:svn lock -m “lock test file“ test.php
svn unlock PATH
5、更新到某个版本
svn update -r m path
例如:
svn update如果后面没有目录,默认将当前目录以及子目录下的所有文件都更新到最新版本。
svn update -r 200 test.php(将版本库中的文件test.php还原到版本200)
svn update test.php(更新,于版本库同步。如果在提交的时候提示过期的话,是因为冲突,需要先update,修改文件,然后清除svn resolved,最后再提交commit)
简写:svn up
6、查看文件或者目录状态
1)svn status path(目录下的文件和子目录的状态,正常状态不显示)
【?:不在svn的控制中;M:内容被修改;C:发生冲突;A:预定加入到版本库;K:被锁定】M状态一般比较多
2)svn status -v path(显示文件和子目录状态)
第一列保持相同,第二列显示工作版本号,第三和第四列显示最后一次修改的版本号和修改人。
注:svn status、svn diff和 svn revert这三条命令在没有网络的情况下也可以执行的,原因是svn在本地的.svn中保留了本地版本的原始拷贝。
简写:svn st
7、删除文件
svn delete path -m “delete test fle“
例如:svn delete svn://192.168.1.1/pro/domain/test.php -m “delete test file”
或者直接svn delete test.php 然后再svn ci -m ‘delete test file‘,推荐使用这种
简写:svn (del, remove, rm)
8、查看日志
svn log path
例如:svn log test.php 显示这个文件的所有修改记录,及其版本号的变化
9、查看文件详细信息
svn info path
例如:svn info test.php
10、比较差异
svn diff path(将修改的文件与基础版本比较)
例如:svn diff test.php
svn diff -r m:n path(对版本m和版本n比较差异)
例如:svn diff -r 200:201 test.php
简写:svn di
11、将两个版本之间的差异合并到当前文件
svn merge -r m:n path
例如:svn merge -r 200:205 test.php(将版本200与205之间的差异合并到当前文件,但是一般都会产生冲突,需要处理一下)
12、SVN 帮助
svn help
svn help ci
——————————————————————————
以上是常用命令,下面写几个不经常用的
——————————————————————————
13、版本库下的文件和目录列表
svn list path
显示path目录下的所有属于版本库的文件和目录
简写:svn ls
14、创建纳入版本控制下的新目录
svn mkdir: 创建纳入版本控制下的新目录。
用法: 1、mkdir PATH…
2、mkdir URL…
创建版本控制的目录。
1、每一个以工作副本 PATH 指定的目录,都会创建在本地端,并且加入新增
调度,以待下一次的提交。
2、每个以URL指定的目录,都会透过立即提交于仓库中创建。
在这两个情况下,所有的中间目录都必须事先存在。
15、恢复本地修改
svn revert: 恢复原始未改变的工作副本文件 (恢复大部份的本地修改)。revert:
用法: revert PATH…
注意: 本子命令不会存取网络,并且会解除冲突的状况。但是它不会恢复
被删除的目录
16、代码库URL变更
svn switch (sw): 更新工作副本至不同的URL。
用法: 1、switch URL [PATH]
2、switch –relocate FROM TO [PATH...]
1、更新你的工作副本,映射到一个新的URL,其行为跟“svn update”很像,也会将服务器上文件与本地文件合并。这是将工作副本对应到同一仓库中某个分支或者标记的方法。
2、改写工作副本的URL元数据,以反映单纯的URL上的改变。当仓库的根URL变动
(比如方案名或是主机名称变动),但是工作副本仍旧对映到同一仓库的同一目录时使用
这个命令更新工作副本与仓库的对应关系。
17、解决冲突
svn resolved: 移除工作副本的目录或文件的“冲突”状态。
用法: resolved PATH…
注意: 本子命令不会依语法来解决冲突或是移除冲突标记;它只是移除冲突的
相关文件,然后让 PATH 可以再次提交。
18、输出指定文件或URL的内容。
svn cat 目标[@版本]…如果指定了版本,将从指定的版本开始查找。
svn cat -r PREV filename > filename (PREV 是上一版本,也可以写具体版本号,这样输出结果是可以提交的)
SVN简明课程的更多相关文章
- SVN简明使用方法 .
SVN简明使用方法 TortoiseSVN 是 Subversion 版本控制系统的一个免费开源客户端,可以超越时间的管理文件和目录.文件保存在中央版本库,除了能记住文件和目录的每次修改以外,版本库非 ...
- SVN简明教程
SVN简明教程 Posted on 2010-09-07 17:34 幻海蓝梦 阅读(7196) 评论(0) 编辑 收藏 所属分类: 版本管理 http://www.emsym.com/blog ...
- [源码管理] ubuntu中svn简明用法:服务器搭建+客户端使用
本文是对网络上前人的优秀文章加以实践验证后所整理(修正或补充) 第一部分:svn服务器搭建(主要是四步走) 参考:http://www.son1c.cn/show/920.html 一,安装Subve ...
- Teamcity+SVN+VisualStudio在持续集成简明教程
Teamcity+SVN+VisualStudio持续集成 简明教程 一.写在最前: 1. 各组件版本号例如以下: Teamcity(简称tc)版本号:8.1.4 SVN版本号:Tortoi ...
- 最课程阶段大作业之01:使用SVN实现版本控制
版本控制在友军那里都是放在整个培训的最后阶段才开始讲的,但我们打算放到SE阶段.与其匆匆在项目实战阶段弄个半生不熟,然后进入实际工作中接受他人对你的怀疑,不如……早死早超生~~~. 可是,我们毕竟现在 ...
- Eclipse安装SVN插件方式简明介绍
一.Links安装: 推荐使用此种安装方式,因为它便于插件的管理. 在eclipse根目录下新建文件夹links,这样就得到了eclipse\links 在eclipse\links下新建一个link ...
- Subversion简明手册--使用hook svn
使用 hook ,为了方便管理员 控制提交的过程 Subversion 提供了 hook 机制.当特定的 事件发生时,相应的 hook 会被调用, hook 其实就相当于特定 事件的处理函数.每个 h ...
- intellijidea课程 intellijidea神器使用技巧 5-1 svn相关
subversion ==> show local history 查看历史记录 Ctrl D 历史记录对比 ctrl alt z 复原
- 2013 duilib入门简明教程 -- 部分bug (11)
一.WindowImplBase的bug 在第8个教程[2013 duilib入门简明教程 -- 完整的自绘标题栏(8)]中,可以发现窗口最大化之后有两个问题, 1.最大化按钮的样式 ...
随机推荐
- java导读
导读: 我们学习Java大概有3个方向,第一,桌面系统,包括C/S结构:第二,J2ME,面向无限领域,很有潜力的家伙,看看中国的手机用户就知道了.第三,面向企业应用.计算的平台,J2EE. ...
- Servlet程序开发-- Servlet生命周期
生命周期是一个程序的存在周期,受容器管理,所以容器决定生命周期. 生命周期包括 加载,初始化,服务,销毁,卸载 5个部分 加载:第一次使用的时候加载 初始化:init方法, 失败的话,直接卸载,如果成 ...
- iOS开发-正则表达式3种形式
转至:http://www.cnblogs.com/GarveyCalvin/p/4250145.html iOS开发-正则表达式的使用方法 前 言:在表单验证中,我们经常会使用到正则,因为我们需要用 ...
- zf-关于平台的用户名密码的设置
比如说安徽桐城的用户名密码在哪张表里设置 桐城市人民统一电子政务平台是http://localhost:8088/tc/ptzwfw.action 这个链接 在zwfw_tc 数据库的 PT_LOGI ...
- map转换成list
Java代码如下: package Test01; import java.util.ArrayList; import java.util.HashMap; import java.util.Ite ...
- CentOS 在同一窗口打开文件夹
1.打开一个文件夹 2.编辑 - 首选项 - 行为,勾选“总是在浏览器窗口打开”,点击关闭.
- jquery奇怪的问题
Jquery中 $("#data_table4 tr:eq(0)").after("<tr><td>" +result+data.row ...
- hrbustoj 1125 循环小数 II(小数变分数+极限思想)
#include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> #i ...
- Entity Framework Power Tools Beta 3
http://visualstudiogallery.msdn.microsoft.com/72a60b14-1581-4b9b-89f2-846072eff19d/ PM> Install-P ...
- 引用 struts2标签详解 - wo的的日志 - 网易博客
引用 元元 的 struts2标签详解 引用 COLD 的 struts2标签详解 要在jsp中使用Struts2的标志,先要指明标志的引入.通过jsp的代码的顶部加入以下的代码: <%@t ...