TortoiseSVN教程

更新时间:2024-04-11 12:09:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

TortoiseSVN教程

1 引言

? ? ? ?

团队开发?

修改文件而他人也在改?你修改的内容丢失? 保存了文件可又后悔了?想得到几天前的版本? 发现了bug,想知道bug何时引入的?

这些问题都遇到了?那就使用TortoiseSVN吧。TortoiseSVN是Subversion的客户端。Subversion是针对CVS的不足而开发的版本控制系统。这些提升主要包括以下的一些方面:

1.目录、文件以及改名等元数据的版本化

不同于 CVS 只关心文件的内容以及文件是否存在,所有文件、目录的相关操作都是被版本化的,例如文件的改名、拷贝等等; 2.提交操作是真正的原子操作 在 Subversion 中,提交操作是不可分割的,修订版本号是基于每次提交操作而非文件。提交日志被附加在每个修订版本中,而不是像 CVS 一样冗余的进行存储;

3.可通过 Apache 服务器提供基于 WebDAV/DeltaV 协议的支持,该功能可使 Subversion 通过 Apache Web 服务器使资源库更加灵活的在网上进行共享,使其在互操作性上大大优于 CVS; 4.可独立运行。当你不想使用 Apache 2.x 时候,你也可以使用 Svnserve,它可以以守护进程或者是Windows 下的服务方式独立运行; 5.分支(Branching)与标签(Tagging)操作是轻量级的; 6.客户服务器端分层库结构设计; 7.资源库可以采用数据库(BerkeleyDB)或者是使用特定格式的文件进行存储;

8.更有效的对二进制文件进行处理。

2 基本概念

2.1 版本库Repository

Subversion是版本管理的后台系统,其核心是保存数据的版本库-repository。 版本库用分层的“文件-目录”文件系统数来存储数据。连接到版本库的客户能读写数据。版本库是源码的集中存放处,记录了你的每一次修改!客户端可以从版本库中取到过去的版本。

图2.1. 典型服务器/客户机模型

版版版版版版版版版版版版版版版版版版版版版版版版版版版版版版版

2.2 版本模型Versioning Models

基本问题:共享数据而不相互覆盖?

2.2.1 文件共享的问题

在合作开发中文件共享的问题是显而易见的。

图 2.2. 要避免的问题

两个用户读同一个文件两个用户开始编辑文件

RepositoryAReadReadRepositoryAAHarryASallyA'HarryA\SallyHarry首先发布版本Sally意外覆盖了Harry的版本RepositoryA'WriteRepositoryA\WriteA'HarryA\SallyA'HarryA\Sally

2.2.2 锁定-修改-解锁Solution

Visual SourceSafe采用的就是这种模型。

Figure 2.3. 锁定-修改-解锁方案

Harry锁定文件,然后拷贝进行编辑Repository ARead当Harry进行编辑时,Sally读文件失败Repository ALockXRead AHarrySallyA'HarrySallyHarry发布版本并解锁Repository这样Sally能够对文件进行加锁,拷贝及编辑Repository A\ReadA'UnlockWriteLockA'HarrySallyA'HarryA'Sally

问题:

? 锁定可能引起管理问题: 如忘记解锁别人无法使用。 ? 锁定造成不必要的串行作业。 ? 锁定可引起安全问题。

2.2.3 拷贝-修改-合并解决方案

Subversion和CVS等采用拷贝-修改-合并模型。项目成员从版本库读取个人的工作拷贝,所有项目成员并行地在工作拷贝上工作,然后合并在一起形成新的版本(version)。

图 2.4. 拷贝-修改-合并方案

两个用户读同一个文件两个用户开始编辑文件RepositoryAReadReadRepositoryAAHarryASallyA'HarryA\SallyHarry首先发布版本Sally得到”Out-of-Data”错误RepositoryA'WriteRepositoryA\xWriteA'HarryA\SallyA'HarryA\Sally

Figure 2.5. ... 拷贝-修改-合并方案Continued

Sally版版版版版版版版版版版版版RepositoryA'Read版版版版版版版版版版版RepositoryA'A'HarryA'A\SallyA'HarryA*Sally版版版版版版版版版版版版版版版版版版版版版版版版RepositoryA\RepositoryA*WriteReadA'HarryA*SallyA*HarryA*Sally

如果修改不重叠,TortoiseSVN可自动合并。修改重叠则引起冲突(conflict)。冲突只能靠手工修改!

这种模型好像很混乱,但实际上很好用。解决冲突的时间大大小于因锁定而等待的时间。解决冲突的最好办法是沟通。

2.3 实际操作Subversion 2.3.1 工作拷贝Working Copies

Subversion的工作拷贝就是包含文件的本地目录树,与一般目录的树状结构相同,可以进行任意的工作!工作结束后可将新的文件“发布”到版本库。 工作拷贝中包含了由Subversion创建和维护的一个特殊的子目录.svn ,该目录保存了重要的信息。不要删除这个目录!

例如,假定你的版本库包含两软件项目:paint和calc。

图 2.6. 版本库文件系统

用检出(checkout)得到工作拷贝。

2.3.2 Repository URLs:版本库URL

Subversion的版本库借助不同方法得到:本地磁盘、网络协议等:

Table 2.1. Repository Access URLs

Schema Access Method 本地磁盘. 利用WebDAV 协议访问Apache SVN 服务器. 同http://, SSL 加密 file:/// http:// https:// svn:// 直接访问 svnserver svn+ssh:// 经过认证加密访问svnserver。 例:

File:///c:/svn/prj/template , File:///c:/svn/prj/template/Dist

c:/svn/prj/template是版本库的目录,Dist是版本库的子目录名称 http://build:88/prj/template http://build:88/prj/template/Dist

http://build:88是Apache设置的URL,prj是通过Apache设置的位置,template是版本库名称,Dist是目录名

2.3.3 版本Revisions

svn commit 操作提交修改。版本库接受一次提交后,在文件系统树创建新的状态,称之为版本revision。每个版本是一个递增的自然数。

图 2.7. 版本库

全局版本号

版本号代表整个版本库而非单个文件!

工作拷贝如何跟踪版本库?

Subversion将下列两种管理信息记录在.svn/:

? 工作版本 working revision ? 从版本库更新的时间。

通过这些信息,在与版本库交换信息后,Subversion可得出文件的四种状态:

? 未修改,新版本,提交无效

? 本地修改,新版本,可提交,更新无效

? 未修改,但在版本库中已修改,过期,提交无效,可更新

? 本地修改,在版本库中已修改,过期。先更新,修改冲突,再提交。

版本库中的最新版本是用HEAD Revision标志的,每次更新操作都是将HEAD Revision更新到工作目录。

工作目录可以通过Update to revision指令回溯到以前版本,这时工作目录中的版本与版本库中的HEAD Revision是不一致的,如果做了本地修改,再进行提交时,由于SVN不允许从当前版本不是HEAD Revision版本的工作目录提交,这时就会出现“过期”错误,需要首先执行Update,即将HEAD Revision更新到本地,解决冲突后,才能提交。

3 服务器设置

3.1 基于Apache的服务器

这是设置Subversion服务器的最好方法。优点:

? ? ? ? ?

利用WebDAV

用浏览器浏览版本库 认证 安全?线路压缩?

3.2 基于Svnserve的服务器

优点:

? 不需要安装Apache服务器 ? 容易安装 ? 速度较快

? 适合本地版本管理

4 版本库

4.1 用TortoiseSVN创建版本库

图 4.1. 没有版本控制的文件夹TortoiseSVN菜单

1. 进入资源管理器

2. 创建版本库的子目录,如C:/SVNRepository。

3. 在新建的目录中右键 TortoiseSVN-> Create Repository here.... 可用FSFS和BDB两种格式创建。 注意:不要编辑版本库中的文件! 本地进入方式:file:///C:/SVNRepository/

4.2 版本库备份

最简单的办法是备份版本库文件夹!

推荐办法:

svnadmin hotcopy path/to/repository path/to/backup --clean-logs

5 日常应用指南

5.1 开始

5.1.1 Tortoise设置

1 忽略文件

在SVN 的[Setting]的[General]中,设置需要忽略的文件以便忽略掉一些临时的、无用的文件,常被忽略的文件有*.opt *.ncb *.suo *.plg *.pch *.idb *.pdb *.scc *.obj Debug Release *.o *.bin *.out *.ilk *.aps debug release *.clw *.bak。每个程序员可以根据自己的需要进行修改忽略文件,上面只是使用VC++与Tornado编程时常用的一些忽略文件。

图 5.1. Tortoise忽略文件设置图

2 合并比较工具

在Merge Tool中可以选择用来合并的工具,强烈推荐用Araxis Merge。在[Setting]->[Diff]中填入\Files\\Araxis\\Araxis Merge v6.5\\Merge.exe\;在[Setting]->[Merge]的选项中,填入\Files\\Araxis\\Araxis Merge v6.5\\Merge.exe\%theirs %mine %merged ;其中\Files\\Araxis\\Araxis Merge v6.5\\Merge.exe\是指合并工具的路

径,%theirs %mine %merged分别指..将要合并到主干的分支,主干,及合并后的结果。

图 5.2. Tortoise合并比较工具设置图

5.1.2 操作TortoiseSVN

图 5.3 TortoiseSVN右键菜单

所有TortoiseSVN命令均可以在资源浏览器的右键菜单中执行。

5.1.3 认证

如果版本库设置了权限保护,则会弹出认证对话框。

图 5.4认证对话框

如果使用Windows域认证,用户名前需要包括域名,如MYDOMAIN/johnd.

5.2 数据导入版本库

5.2.1 版本库结构Repository Layout

根据不同需要来建立版本库的结构: 1. 创建新的空文件夹。

2. 创建目录结构 – 先不放文件!

3. 右键菜单,点击导入…(Import...)将结构加入到版本库中。

注意:文件夹的名字不导入版本库。

通过版本库浏览器(Repo Browser)可直接浏览版本库结构。

5.2.2 导入Import

在将项目文件导入到版本库前,先进行下列操作:

1. 删除与项目无关的中间文件如生成的临时文件*.obj等。 如果设置了忽略的文件类型,或忽略的目录,可不删除。 2. 在文件夹中组织文件。

在资源浏览器中进入项目顶层文件夹,右键得到快捷菜单,选择导入… (Import...) ,出现对话框:

图 5.5 导入对话框

在对话框中输入仓库的URL。

导入信息(import message)作为版本日志信息。

注意

只要点击确定OK TortoiseSVN将把整个目录及目录内的文件加入到版本库中。顶层文件夹的名字不会加入到版本库中,但其他子文件夹的名字均加入以保持版本库的结构。该项目的文件现在处在版本库版本控制中。请注意:目前的本地项目文件夹不处在版本控制下!要得到版本控制,必须检出Checkout版本库得到工作拷贝!

5.2.3 特殊文件Special Files

有时你有一个包含用户特定数据的文件需要在版本控制下,这意味着每个开发人员需要修改它以适应他的本地设置,用户每次提交均要保存这文件的变化,因此对这类文件进行版本控制很困难。

对此建议使用template 文件,创建一共文件,它包含所有开发人员需要信息,将它加入到版本控制下,每个开发人员均可检出这个文件, 复制并重新命名,然后修改就没有问题了。不需要加入版本控制的文件可通过设置Subversion 特性(property) svn:ignored 来忽略。

5.3 检出工作拷贝

从版本库执行检出(checkout)就能得到工作拷贝。

在资源浏览器中选定将要存放工作目录的拷贝,右键弹出快捷菜单,选择C出…Checkout...,将出现对话框:(如果该目录已在版本控制下,则没有检出而是更新(Update)和提交(Commit))

图 5.6检出对话框

如果文件夹不存在,会自动创建。

注意

你只能将文件检出到一个空目录里。如果你想检出刚导入的文件,Subversion将报错。你只能将文件检出到另一个目录或先删除已经存在的源文件再执行检出。

5.4 导出Exporting

如果不想包含.svn ,可将版本库导出到一个空目录。这时所有文件不处在版本控制下。方法:右键,选择TortoiseSVN-〉 导出…(Export...)。

5.5 将别人的改动更新到你的工作拷贝

图 5.7已完成更新的进度对话框

有时你想将他人的改动合并到你本地的工作拷贝。从服务器上取改动到本地的过程叫更新updating。 更新也许是单个文件、或选择的一组文件、或整个目录。在资源浏览器中选择待更新的文件或目录, 右键并选择更新Update ,他人的修改将合并到你本地的文件中,你所做的改动保存在同一文件中。这时版本库没有受变化,即合并只在本地进行。

如果你和他人改动的是相同部分但改动不一样,就会在更新过程中产生冲突 conflicts。冲突在对话框中用红色表示,双击后用外部编辑器解决冲突。 TortoiseSVN也允许你将工作拷贝更新到指定版本。用更新至版本Update to Revision... 命令,在弹出的对话框中输入指定的版本号即可。

注意

如果你更新到指定版本,再提交是将出现out of date 错误!如果你想撤销修改并从以前的版本开始工作,你必须使用从显示日志Show Log对话框中选择复原自此版本以来的变更Revert changes from this revision 命令或使用快捷菜单中的合并Merge... 菜单命令。

更新至版本Update to Revision... 命令允许复原至低版本。比如你的工作目录版本是100,你想复原至版本50-直接填写在复原对话框中填写复原至版本50。通常,不复原单个文件,确实需要,从记录对话框(Log)选择储存版本至Save revision to... 命令。

5.6 解决冲突

有时你从版本库更新文件会有冲突。冲突产生于两人都修改文件的某一部分。解决冲突只能靠人而不是机器。当产生冲突时,你应该打开冲突的文件,查找以<<<<<<<开始的行。冲突部分被标记:

<<<<<<< filename your changes =======

code merged from repository >>>>>>> revision

Subversion为每个冲突文件产生三个附加文件:

filename.ext.mine

更新前的本地文件。

filename.ext.rOLDREV

你作改动的基础版本。

filename.ext.rNEWREV

更新时从版本库得到的最新版本。

使用外部合并工具或使用快捷菜单的编辑冲突Edit Conflict 命令来解决冲突。然后从快捷菜单中执行已解决Resolved 命令,将改动提交到版本库。请注意,解决命令并不解决冲突,而仅仅是删除filename.ext.mine and filename.ext.r* 文件并允许你提交。

5.7 将本地做的改动提交到版本库

这个过程叫提交committing 。 在提交前需要确认工作拷贝是最新的。用更新Updates 或先用检查更新Check For Updates 检查变更了的文件。如果你的工作拷贝已更新且没有冲突,可用快捷菜单中的提交Commit... 完成提交过程。

图 5.8 提交对话框

如果某文件不想在版本控制下,取消复选框即可。

5.7.1 提交框中不需要控制的文件

许多不需要版本控制文件如obj文件等也出现在提交对话框中,解决办法:

? 在服务器端编辑配置文件

config,将不需要控制的文件 (或通配符)添加

到排除文件列表。其影响是全局的。

将文件添加到svn:ignore 列

? 通过快捷菜单命令Add to ignore list

表。只影响到本目录。

图 5.9提交进度

5.8 获得状态信息

通过图标可知道文件的状态:修改/新增/删除/换名。

5.8.1 图标

图 5.10 资源浏览器显示的图标

新近检出的工作拷贝。Subversion状态是正常normal.

文件已修改,需要提交到版本库。Subversion状态是已修改modified。

在更新文件后自己的修改与他人的修改冲突。状态是冲突conflict。

文件(夹)被锁定且状态是正常normal,提醒你需要解锁才能允许其他用户提交自己修改的版本。

文件(夹)将从版本控制中删除,版本控制将忽略这些文件(夹)。状态是删除deleted。

将加入到版本控制的文件或文件夹。状态是新增added 。

5.8.2 版本库状态 Status Of The Repository

图 5.11检查更新

想知道别人修改了哪些文件?用检查更新..(Check For Updates...) 命令。弹出的对话框将显示出你的修改或版本库中别人的修改,这样可在更新前检查是否有冲突。

提交Commit.... 命令也可用来显示本地的修改,如果不想实际提交到版本库,点击取消Cancel 即可。

5.9 加入新文件或目录

图 5.12加入快捷菜单

开发中新增文件或文件夹,如需要加入到版本控制,选择加入Add;如果不想要加入到版本控制,选择加入忽略列表Add To Ignore List

5.10 忽略文件和目录

图 5.13 不需要版本控制快捷菜单

大多数项目会有一些文件(夹)不需要版本控制,如编译产生的*.obj, *.lst,等。每次提交,TortoiseSVN提示那些文件不需要控制,因此最好是在项目中将这些中间文件或编译结果加入忽略列表。

5.10.1 全局忽略列表The Global Ignore List

忽略文件的另一个办法是加入全局忽略列表global ignore list。 全局忽略列表是客户端特性,他影响所有项目,但只在该客户端PC起作用。通常用 svn:ignore 会更好因为它对所有客户起作用。

5.11 删除、换名和移动

从快捷菜单的TortoiseSVN 子菜单进入删除、改名等操作

Figure 5.14 版本化文件(夹)资源管理器上下文菜单

如果你想在工作拷贝中移动文件: 1. 选择待移动的文件和文件夹;

2. 按住鼠标右键拖动文件(夹)到工作拷贝内的新地方; 3. 松开右键

4. 在弹出菜单中选择move files in Subversion to here

如果你在资源管理器中象往常那样删除了文件而没有在版本控制中删除,提交对话框将提示这些文件并让你在提交前在版本控制中删除它们。

5.12 撤销修改

如果你想撤销自上次更新后所作的改动,选择文件,点击鼠标右键,在快捷菜单的TortoiseSVN子菜单中选择复原revert ,在对话框中选择你想要复原的文件,点击确定OK.

图 5.15 复原对话框

5.12.1 撤销已提交的变更

复原Revert 只撤销本地的改动,而不撤销已提交文件的改动。如果你想撤销某一版本的全部变更,可从版本记录对话框中处理。

5.13 版本日志对话框

对每次提交的更改,你必须同时提供更改的日志,以便日后能找出为什么/如何改动。

5.13.1 弹出日志对话框

日志对话框显示所有日志信息并显示在3个格里: ? 顶格显示版本号,包括日期,提交者等。 ? 中格显示上格所选版本的完整日志Log。 ? 底格显示该版本改动的文件列表。

图5.16 日志对话框

弹出Log日志对话框的方式:

? 从

TortoiseSVN 子快捷菜单

? 从属性页 ? 更新进度对话框。

5.13.2 得到更多信息

图5.17 日志对话框顶层上下文快捷菜单

在顶格还提供快捷菜单,可以允许过如下操作得到版本的更多信息: ? ? ? ?

你通

将选定的版本于当前工作拷贝进行比较。可以设置缺省比较工具。 保存选定版本的文件。

从选定版本创建branches/tags。

将选定版本的文件(夹)更新到当前工作拷贝。从某一版本更新的时候最好选择对整个目录进行更新,以免出现版本失配情况。

? 撤销对选定版本发生的修改。如果工作目录中的文件已经被改变,就可

能需要解决撤销修改时产生的冲突。 通过选择两个版本日志记录可以允许你对两个版本进行比较。 需要注意的地方:

5.14 分支/标记

版本控制的作用是能将变更隔离成独立的方向,称之为分支branch. 分支用于主发布前尝试新特性。

另一特性是标记特殊版本,以利于在任何时间重新创建环境。这个过程叫标记tagging.

Subversion并没有特别的用于分支和标记的命令,而是用cheap copies代替。Cheap copies有点像连接links。

在由工作拷贝创建branch/tag前,你必须确认已更新版本库。 创建branch/tag非常简单:

图 5.18 分支/标记对话框

从工作目录父文件夹点出快捷键,选择分支/标记Branch/Tag... ,输入版本库中存放分支/标记路径的URL,在原来输入trunk 的地方输入tags/tagname ,这里tagname 可能是ProjectName_v1.10.

C:/SVNRepository/trunk/ProjectName/... C:/SVNRepository/trunk/AnotherProject/...

C:/SVNRepository/branches/ProjectName_SpecialDebugBuildBasedOn_v1.09/ C:/SVNRepository/tags/ProjectName_v1.10

点击OK ,Subversion在你选择的版本库的目录内创建了一个cheap copy。创建Branch / Tag不影响你的工作目录。

5.14.1 检出或切换To Checkout or to

Switch...

这确实是个问题!由于Checkout检出了分支中的所有数据, 转向Switch... 只是转移你工作目录中变化了的数据。 为了能在新的的工作拷贝上工作,你可以:

? 再次执行检出

Checkout 。你可以检出任意次到你本地硬盘上的任何地

方。

? 转换到新创建的版本库拷贝上。只需执行切换

Switch...

在下面的对话框中输入你的分支的URL,保留“Head Revision”点击 OK,你的工作目录将切换到新的分支/标记branch / tag.

切换与更新,不会丢失你在本地所作的修改,而是将未提交的修改合并。

Figure 5.19 切换对话框

分支与标记的不同点:

? 标记用于创建项目特殊阶段的静态快照 – 不再用于开发 – 而分支是用

于开发的。这是我们建议使用/trunk /branches /tags 的理由。

? 如果你在工作拷贝上修改并提交,则在分支的修改体现在分支上而不是

主干上。

将分支合并到主干上

合并过程是项目管理关键及核心所在,通常合并场景是这样的:开发人员分别在trunk及branches进行修改。当某一branch上已经完成新特性实现或者清除BUG等工作,需要将修改的内容与trunk的内容进行同步,这样的同步过程就是合并。合并过程的实质是svn diff过程,通过diff找到branches所做的所有修改,将这些修改合并到当前trunk work copy中。需要注意的是,如果直接将branch和trunk进行diff合并,会造成从上次trunk与branch同步之后,trunk所做的修改都会被移除,这不是我们所期望的结果。

图 5.20 合并对话框

而且理解起来会有些困难,需要结合实际操作才能掌握其基本方式,请参考《TortoiseSVN版本管理快速入门》。

5.15 创建并应用补丁Creating and Applying

Patches

如果谁都可以修改,项目将没完没了,永远不会稳定下来。怎么办呢?通过“补丁patch”!将补丁提交的具有写权限开发团队,他们先审查补丁,再决定是否提交到版本库。

补丁文件仅显示工作拷贝和基础版本的差异。

5.15.1 创建补丁文件

首先你需要测试你的修改是否正确,然后用创建补丁Create Patch... 而不是使用提交Commit... ,这将创建包含改动的文件。

5.15.2 套用补丁文件

5.16 重新装入工作拷贝

Figure 5.21 重定位对话框

如果因为某种原因版本库修改位置,你需要使用重新定位命令。

5.17 版本库浏览器The Repository Browser

直接在版本库上工作!

图 5.22 版本库浏览器

进入版本库浏览器后,使用快捷菜单!

5.18 谁动了我的代码?

Figure 5.23 注解/谴责对话框

有时你不但要知道那些代码改动了,还要知道谁改动的!使用追根溯源(谴责)Blame... 即可!将Blame翻译成谴责真不好,其意思只是追根溯源

图 5.24. TortoiseBlame

使用内建在TortoiseSVN中的TortoiseBlame可非常方便地查看修改的历史

5.19 最后

TortoiseSVN是开源项目,可通过

http://svn.collab.net/repos/tortoisesvn/ 获取最新的源代码。这些源代码是我们学习的极好的范本!

本文来源:https://www.bwwdw.com/article/l0cp.html

Top