2024年3月19日发(作者:)

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. 要避免的问题

两个用户读同一个文件

两个用户开始编辑文件

Repository

A

Read

Read

Repository

A

A

Harry

A

Sally

A'

Harry

A"

Sally

Harry首先发布版本Sally意外覆盖了Harry的版本

Repository

A'

Write

Repository

A"

Write

A'

Harry

A"

Sally

A'

Harry

A"

Sally

2.2.2 锁定-修改-解锁Solution

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

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

Harry锁定文件,然后拷贝进行

编辑

Repository

A

Read

当Harry进行编辑时,Sally读文

件失败

Repository

A

Lock

X

Read

A

HarrySally

A'

Harry

Sally

Harry发布版本并解锁

Repository

这样Sally能够对文件进行加

锁,拷贝及编辑

Repository

A"

Read

A'

Unlock

Write

Lock

A'

Harry

Sally

A'

Harry

A'

Sally

问题:

锁定可能引起管理问题:

如忘记解锁别人无法使用。

锁定造成不必要的串行作业。

锁定可引起安全问题。

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

Subversion和CVS等采用拷贝-修改-合并模型。项目成员从版本库读取个人

的工作拷贝,所有项目成员并行地在工作拷贝上工作,然后合并在一起形成新的

版本(version)。

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

两个用户读同一个文件

两个用户开始编辑文件

Repository

A

Read

Read

Repository

A

A

Harry

A

Sally

A'

Harry

A"

Sally

Harry首先发布版本

Sally得到”Out-of-Data”错误

Repository

A'

Write

Repository

A"

xWrite

A'

Harry

A"

Sally

A'

Harry

A"

Sally

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

Sally版版版版版版版版版版版版

Repository

A'

Read

版版版版版版版版版版版

Repository

A'

A'

Harry

A'A"

Sally

A'

Harry

A*

Sally

版版版版版版版版版版版

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

Repository

A"

Repository

A*

Write

Read

A'

Harry

A*

Sally

A*

Harry

A*

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 服务器.

,

SSL 加密

file:///

svn://

直接访问 svnserver

svn+ssh:// 经过认证加密访问svnserver。

例:

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

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

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

build:88/prj/template

build:88/prj/template/Dist

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

可用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]中填入"C:Program FilesAraxisAraxis Merge

";在[Setting]->[Merge]的选项中,填入"C:Program

FilesAraxisAraxis Merge

" %theirs %mine %merged ;其中"C:Program

FilesAraxisAraxis Merge "是指合并工具的路

径,%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.

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

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

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

5.2.2

导入Import

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

1.

删除与项目无关的中间文件如生成的临时文件*.obj等。 如果设置了忽

略的文件类型,或忽略的目录,可不删除。

2.

在文件夹中组织文件。

在资源浏览器中进入项目顶层文件夹,右键得到快捷菜单,选择导入…

() ,出现对话框:

图 5.5 导入对话框

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

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

注意

只要点击

确定OK

TortoiseSVN将把整个目录及目录内的文件加入到版本库中。

顶层文件夹的名字不会加入到版本库中,但其他子文件夹的名字均加入以保持版

本库的结构。该项目的文件现在处在版本库版本控制中。请注意:目前的本地项

目文件夹不处在版本控制下!要得到版本控制,必须检出Checkout版本库得到

工作拷贝!

5.2.3

特殊文件Special Files

有时你有一个包含用户特定数据的文件需要在版本控制下,这意味着每个开发人

员需要修改它以适应他的本地设置,用户每次提交均要保存这文件的变化,因此

对这类文件进行版本控制很困难。

对此建议使用template 文件,创建一共文件,它包含所有开发人员需要信息,

将它加入到版本控制下,每个开发人员均可检出这个文件, 复制并重新命名,

然后修改就没有问题了。不需要加入版本控制的文件可通过设置Subversion

特性(property) svn:ignored 来忽略。

5.3 检出工作拷贝

从版本库执行

检出(

checkout

就能得到工作拷贝。

在资源浏览器中选定将要存放工作目录的拷贝,右键弹出快捷菜单,选择C

出…,将出现对话框:(如果该目录已在版本控制下,则没有检

出而是更新(Update)和提交(Commit))

图 5.6检出对话框

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

注意

你只能将文件检出到一个空目录里。如果你想检出刚导入的文件,Subversion

将报错。你只能将文件检出到另一个目录或先删除已经存在的源文件再执行检

出。

5.4 导出Exporting

如果不想包含.svn ,可将版本库导出到一个空目录。这时所有文件不处在版本

控制下。方法:右键,选择TortoiseSVN-〉 导出…()。

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

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

有时你想将他人的改动合并到你本地的工作拷贝。从服务器上取改动到本地的过

程叫更新updating。 更新也许是单个文件、或选择的一组文件、或整个目录。

在资源浏览器中选择待更新的文件或目录, 右键并选择更新Update ,他人

的修改将合并到你本地的文件中,你所做的改动保存在同一文件中。这时版本库

没有受变化,即合并只在本地进行。

如果你和他人改动的是相同部分但改动不一样,就会在更新过程中产生冲突

conflicts。冲突在对话框中用红色表示,双击后用外部编辑器解决冲突。

TortoiseSVN也允许你将工作拷贝更新到指定版本。用更新至版本Update to

命令,在弹出的对话框中输入指定的版本号即可。

注意

如果你更新到指定版本,再提交是将出现out of date 错误!如果你想撤销修

改并从以前的版本开始工作,你必须使用从显示日志Show Log对话框中选择

复原自此版本以来的变更Revert changes from this revision 命令或使

用快捷菜单中的合并 菜单命令。

更新至版本Update 命令允许复原至低版本。比如你的工作

目录版本是100,你想复原至版本50-直接填写在复原对话框中填写复原至版

本50。通常,不复原单个文件,确实需要,从记录对话框(Log)选择储存版

本至Save 命令。

5.6 解决冲突

有时你从版本库更新文件会有冲突。冲突产生于两人都修改文件的某一部分。解

决冲突只能靠人而不是机器。当产生冲突时,你应该打开冲突的文件,查找以

<<<<<<<开始的行。冲突部分被标记:

<<<<<<< filename

your changes

=======

code merged from repository

>>>>>>> revision

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

更新前的本地文件。

V

你作改动的基础版本。

V

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

使用外部合并工具或使用快捷菜单的编辑冲突Edit Conflict 命令来解决冲

突。然后从快捷菜单中执行已解决Resolved 命令,将改动提交到版本库。请

注意,解决命令并不解决冲突,而仅仅是删除 and

.r* 文件并允许你提交。

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

这个过程叫

提交

committing 。 在提交前需要确认工作拷贝是最新的。用更新

Updates 或先用检查更新Check For Updates 检查变更了的文件。如果

你的工作拷贝已更新且没有冲突,可用快捷菜单中的提交 完成提

交过程。

图 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 ) 命令。

弹出的对话框将显示出你的修改或版本库中别人的修改,这样可在更新前检查是

否有冲突。

提交 命令也可用来显示本地的修改,如果不想实际提交到版本库,

点击

取消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 分支/标记对话框

从工作目录父文件夹点出快捷键,选择分支/标记 ,输入版

本库中存放分支/标记路径的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

这确实是个问题!由于Checkout检出了分支中的所有数据, 转向

只是转移你工作目录中变化了的数据。

为了能在新的的工作拷贝上工作,你可以:

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

方。

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

在下面的对话框中输入你的分支的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

创建补丁文件

首先你需要测试你的修改是否正确,然后用创建补丁 而不是

使用提交 ,这将创建包含改动的文件。

5.15.2

套用补丁文件

5.16 重新装入工作拷贝

Figure 5.21 重定位对话框

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

5.17 版本库浏览器The Repository Browser

直接在版本库上工作!

图 5.22 版本库浏览器

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

5.18 谁动了我的代码?

Figure 5.23 注解/谴责对话框

有时你不但要知道那些代码改动了,还要知道谁改动的!使用追根溯源(谴责)

即可!

Blame

翻译成

谴责

真不好,其意思只是

追根溯源

图 5.24. TortoiseBlame

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

5.19 最后

TortoiseSVN是开源项目,可通过

/repos/tortoisesvn/

获取最新的源代码。这些源代码

是我们学习的极好的范本!

6 部门版本管理工具使用教程

6.1 SVN版本管理的安装配置

1. 安装TortoiseSVN (下载地址)

点击Next 进入下一步

接受License,点击Next 进入下一步

点击Next 进入下一步

点击 Install 安装

若出现这个界面,手动关闭这些应用程序,再点击Retry

没必要看它的版本变更记录,点击Finish 完成TortoiseSVN的安装

选择No,没必要重启现在。等安装完成汉化和配置再重启不迟。

2. 安装TortoiseSVN中文汉化补丁(LanguagePack-1.4.8.12137-win32-zh_下载地址)

点击 Install,进行安装

点击Finish完成 TortoiseSVN中文汉化补丁的安装。这时候要重启你的操作系统,不然你进

行下面的步骤3后得不到中文界面。

3. 配置中文界面

在空白处单击鼠标右键

鼠标左键单击Settings进入设置页面

在Language栏选择中文(简体)

然后点击确定,使配置生效。

现在就是我们的母语了。

SVN版本管理的基本使用

6.1.1 下载项目文件

下载项目文件——即初始化检出,版本库中文件和目录的本地映射。

建立一个空的文件夹,这个很重要,不然会产生版本文件锁的冲突。(特别是包含了隐藏目

录.svn)

选择SVN检出

在版本库URL栏输入

内网:192.168.200.39/svn/TWpm

外网:222.247.54.22/svn/TWpm

这里也可以点击

右边的3个点图标

输入你的用户账号,可以是中文名称,为了能与公司的LDAP集成,建议用邮箱@前面的字

符作为账号,并输入对应密码,默认密码123456,如果要修改,可以联系

***********************.cn

可以选择保存认证来避免每次输入密码的麻烦。

来浏览服务器上对应的目录

选择一个目录,URL会被自动变更到这个目录

也就是说你可以不下载整个根目录下的文件,而只关心你要的文件。

能浏览下载文件,代表你具有可读的权限。

这里只下载了“00过程中间库”目录,对应URL为:

6.1.2 上传文件

上传文件——即进行修改操作,需要具有可写权限

在某个文件夹里新建了一个文档

右键选择TortoiseSVN增加来添加你的新增文件

点击确定

再点击确定

注意这里只是标记了这个文件要将被做提交操作,但还没有真的提交到服务器

文件会增加一个粗体加号

要真的提交,就要执行

弹出如下窗口

勾选你要添加的文件,点击确定

这就完成了提交新增文件的操作。

可以整个提交一个目录甚至多个目录,只是把这里的文件操作,变为目录好了。这里就不啰

嗦了。

提交后刷新,可以看到这个文件被标记了

随便修改一下,

,这说明这是未被更改的版本。

这就说明被修改了。

现在可以提交你的修改到服务器。

这里注意:这并不代表你的本机的版本是最新的,只能说明是目前为止,最近一次提交

更改后,你没有对其进行修改。一个好的习惯是,每次都

先更新你的目录,再做修改。

如果要删除这个文件(目录),可以

把它标记为要删除,再做提交。

这里一定注意,做了操作要生效,只有提交成功才算。

6.1.3 查看服务器上的版本

点击HEAD

这里可以输入你的版本号,查询这个版本号的文件。

这里仅是查询,并不是会把你的文件回溯到那个版本。

可以复制对应版本的拷贝,做为你现在工作的参考。

6.1.4 还原操作

如果你进行了大量操作,但不想提交,想还原,可以选择

来选择对于修改做还原

还原至历史中的某个版本,选中某个文件,点击“显示日志”

选中你要还原的历史版本,点击右键“复原到此版本”。

弹出确认窗口,选择“是”。

点击“确认”,然后再做提交既可。

6.1.5 SVN 恢复删除

本地删除——指的是在客户端delete了一个文件,但还没有commit,使用revert来撤销删除。

选中要删除的文件点击“删除”

文件夹会打上删除标记

如果此时发现删错了文件夹,还没有commit。则使用revert来撤销删除。

弹出如下窗口

都点击确认按钮即可还原。

服务器删除 ——通过本地删除后提交服务器的情况。通过show Log找到被删的项,选中,

点击右键->Revert changes from this revision。

如上所说作删除标记然后提交。

点击提交

输入日志信息,点击确认。则将删除提交了服务器。即服务器上面看不到该文件了。但是并

没有从版本库中删除,版本库中依然保存着该删除文件或文件夹的信息。

点击show Log

找到被删的项

选中,点击右键->Revert changes from this revision

选择是

确认则恢复了该文件夹(或者文件)。

然后提交,则将刚才删除的文件夹提交到了版本服务器。

6.1.6 标签

为某个评审通过后的文件建立基线。

如下图所示

弹出如下窗口,填写日志(最好养成写日志的习惯)。

点击确认。

注意:

对于标签的管理,最好作为项目的政策,我们要决定标签所在的位置,确定所有用户知道如

何处理拷贝的目录(也就是确保他们不会提交他们)。

TortoiseSVN使用简介

2009-04-24 来源:

1.安装及下载client 端

2.什么是SVN(Subversion)?

3.为甚么要用SVN?

4.建立一个Working目录

5.新增档案及目录到Repository中

6.更新档案及目录

7.更新至特定版本

8.复制档案及目录

9.制作Tag或是Release

10.快速参考

o

10.1

取得(Checkout)Repository

o

10.2更新(Update)档案或目录

o

10.3新增(Add)档案或目录

o

10.4提交(Commit)修改过的档案或目录

o

10.5

Copy/Tag/Branch/Release档案或目录

6.2 安装及下载client 端

1. 下载Windows 端程序:/downloads。一般而言,如果是32-bit的Windows XP 应

该使用 这个档案。如果是

64-bit 的操作系统,则应该使用

这个档案。

2. 执行下载回来的TortoiseSVN 安装程序,就会进行TortoiseSVN 的安

装。正确安装后,应该进行一次的重开机,以确保TortoiseSVN 的正

确无误。

3. 安装成功后,在档案管理员内按下鼠标右键,应该可以看到如右图所

示:

大部分的TortoiseSVN的操作都是透过档案管理员及鼠标右键就可以完成

了。如果您之前使用过TortoiseCVS,应该会对这种操作方式感到十分亲切。

6.3 什么是SVN(Subversion)?

有一个简单但不十分精确比喻: SVN = 版本控制 + 备份服务器

简单的说,您可以把SVN当成您的备份服务器,更好的是,他可以帮您记住每次上传到这个服务器的档案

内容。并且自动的赋予每次的变更一个版本。

通常,我们称用来存放上传档案的地方就做Repository。用中文来说,有点像是档案仓库的意思。不过,通

常我们还是使用Repository这个名词。基本上,第一次我们需要有一个新增(add)档案的动作,将想要备份

的档案放到Repository上面。日后,当您有任何修改时,都可以上传到Repository上面,上传已经存在且

修改过的档案就叫做commit,也就是提交修改给SVN server的意思。针对每次的commit,SVN server都会

赋予他一个新的版本。同时,也会把每次上传的时间记录下来。日后,因为某些因素,如果您需要从Repository

下载曾经提交的档案。您可以直接选择取得最新的版本,也可以取得任何一个之前的版本。如果忘记了版

本,还是可以靠记忆尝试取得某个日期的版本。

6.4 为甚么要用SVN?

1. 备份工作档案是十分重要的。您永远不知道计算机上的硬盘何时会坏掉。根据经验法则再加上摩菲定

理,坏事情往往都发生在最重要的时刻。例如,要release东西的前一刻,硬盘完全坏掉,无法修复。

所以,常常备份工作数据是非常重要的。大部分公司的server都会有专门的备份机制,甚至是异地备

援。绝对比放在自己的计算机里头,或是随身碟上面来的安全。

2. 版本控管非常重要。您无法保证手头上最新版本永远都是对的。很多时候,在经过数天努力工作后,

您才发现走错方向。需要将所有的修改回复到数天前版本。没有几个人能够完全记住自己修改过什么

东西。如果没有做好版本控管,那么,最差的状况就是要全部重来。

3. 伙伴间的数据同步也是非常重要的。很多时候,除了您个人外,还有其它的伙伴也需要您的档案。怎

么把最新的档案提供给伙伴呢?用e-mail?根据经验,用e-mail是一个很差的办法。到了最后,根本

就不知道哪一封e-mail才是新的。因为可能您最新的e-mail已经被当成垃圾信给丢了。别忘了,现在

很多e-mail软件都有anti-spam的功能,说不定这些信件都被当成广告信给处理掉了。而且,您也应

该知道一般档案如果放在e-mail内,档案大小会变得比较大(通常是原来的4/3倍以上)。如果每天

更新一次,恐怕几天没收信的话,信箱就爆了!

4. 如果没有一个好的办法,备份不同版本是很耗费硬盘空间的。例如:您有一个总共10MB的目录,使

用单纯的档案备份。如果有10个版本就会变成100MB。20个版本就有200MB。如果,不想备份这

么多版本,势必就是要减少备份的次数。拉长备份周期将会导致数据遗失的危险性增高。把旧的不需

要的备份删除?根据经验,只要时间一拉长,您跟本就不知道一个月以前的版本是重要或者是不重要。

SVN能帮我们解决上面的问题吗?答案是肯定的:

1. SVN Repository可以是自己计算机上的一个目录,或者是随身碟(不建议这样用)。当然也可以是公

司的服务器。

2. SVN有很棒的版本控管机制。所有上传的版本都会帮您记录下来。日后您可以随时取得某一个时刻的

版本。而且,也有版本分支及合并等好用的功能。

3. SVN可以让不同的开发者存取同样的档案,并且利用SVN Server作为档案同步的机制。也就是说,

您有档案更新时,无须将档案寄给您的开发成员。只需要告诉他新的版本已经在SVN Server上面,

请他自己去SVN Server上面就可以取得最新版本。而且,SVN Server也可以做到当您上传新版本后,

自动发信给相关的成员。

4. SVN的存放档案方式是采用差异备份的方式。也就是说,他只会备份有不同的地方。所以很省硬盘空

间。此外,他也可以针对所谓的非文字文件进行差异备份。

6.5 建立一个Working目录

所谓的Working目录其实就是您平常用来存放工作档案的地方。通常我们会等到自己的工作做的一个段落

的时候再进行备份。所以我们平常都是在Working目录下面工作,等到适当时机在commit到repository中。

举例来说,我们想在D盘下面建立一个名为working的目录。首先先把这个目录建立出来。

此时,这个目录应该为空的。

在档案管理员中按下右键后(您可以在working目录的icon上按,也可进入working

目录后,在空白的地方按),选择SVN checkout。

接着您可以看到如下的画面:

首先我们要填入的是repository的位置,对于SVN来说,repository的位置都是URL。由于我们前面已经在

E槽建立一个repository,因此,我们现在要在URL of repository这一栏填入svn://127.0.0.1/svn/HTOA。

接着,稍微看一下Checkout directory,这个字段应该要指向您的working目录。确认后,按下OK按钮,您

应该可以看到如下的讯息窗口。

这样就表示动作完成。按下OK按钮后,再到您刚刚建立的目录下。您将会看到working目录下面多了一个

名为.svn的目录(这个目录是隐藏的,如果您的档案管理员没有设定可以看到隐藏目录,您将无法看到它) 。

SVN会在您的工作目录下,以及其子目录下建立这个.svn的子目录。您不应该进去这个目录,尤其不应该

更动这个目录下面的任何内容。否则会很可能会造成SVN无法正常运作。

由于,原来的repository是空的,所以我们现在的working目录也是空的。如果您现在checkout的是一个

已经有内容的repository,您将会看到working目录下面现在多了许多目录及档案。

如果您要在一个已经存在的SVN Server上面checkout出上面的档案,您只需要给定正确的URL以及working

目录的名称。就可以取得指定的档案及目录了。

6.6 新增档案及目录到Repository中

假设您前面的动作都无误。现在您开始开发一个新的程序。假设您开发的程序将放在前面建立的working

目录下面的my_ prj子目录。如下

所示:

假设您已经编辑好档案,准备把他们放到SVN的repository中。您需要在my_prj目录的icon上面,按鼠标

右键,并且选择TortoiseSVN->Add:

接着,TortoiseSVN会把准备要加入的档案及目录,显示给您看。打勾的就是等下要被加入到Repository中

的。如果您有某些档案或是目录不想在这次加入,您可以让该项目不要被勾选。如此,它就不会被加入到

Repository去。

按下OK后,您将会看到如下的讯息窗口:

这样就表示成功了。有一点要注意的是,这个Add的动作并未真正的将档案放到Repository中。仅仅是告

知SVN准备要在Repository中放入这些档案。此时,如果您透过档案管理员查看这些档案,应该会看到一

个白色红底的惊叹号在档案icon的下方。

这是表示您的working目录中的档案与Repository中的档案还没有同步。现在我们要多一个commit的动作。

让这些档案真正的放入到Repository中。您可以在my_prj目录的icon上或者是my_prj目录内的空白处按

下鼠标右键,叫出如下的选单,并且选择SVN commit。

紧接着,您将会看到如下的窗口出现:

在这个窗口中,下半部会列出一个清单,让您清楚的了解到哪些档案要被commit到repository中。同样的,

如果您有档案不想在这个时候commit到Repository,您可以取消选取的档案,这样他们就不会被commit

到Repository中。

在档案列表的上方是Message栏,您可以在栏中输入本次commit的目的。这是十分重要的字段,当您commit

的次数很多时,可以靠这个讯息知道版本与版本之间的差异。当您输入好Message,按下OK之后,就可以

看到如下的窗口出现,通知您已经将指定的档案送到Repository中。

您可以到先前的folder中,确定是否所有的档案icon都有如下的绿色勾勾在上面,这样代表您的档案都正

确无误的到repository中。

有时候,因为Windows本身的问题,您可能会看到有些icon没有变成绿色的勾勾。此时,多按F5几次,

应该就可以解决这个问题。如果,仍然不行,表示您之前的commit动作真的有问题。请仔细检查之前的

commit动作是否正确。

6.7 更新档案及目录

为何需要更新?由于版本控制系统多半都是由许多人共同使用。所以,同样的档案可能还有人会去进行编

辑。为了确保您工作目录中的档案与Repository中的档案是同步的。建议您在编辑前都先进行更新的动作。

在此,我们都先假设您已经将档案check out过一次。现在要说明的是如何在一个check out过的目录进行

update。在想要更新的档案或目录icon上面按下鼠标右键。并且选择SVN Update。

正常的状况下,您可以看到如上的窗口。在这个窗口中会显示有哪些文件更新了。如果没有看到档案更新

的相关信息,这表示您的目录中的档案已经是最新的,所以无须进行更新。

6.8 更新至特定版本

有时我们需要回溯至特定的日期或是版本,这时就可以利用SVN的Update to revision的功能。在想要更新

的档案或目录icon上面按下鼠标右键。并且选择TortoiseSVN->Update to revision。

在这个Update窗口中,您可以选择更新到最新版本(HEAD)。也可以选择更新到某个指定的版本(Revision)。

当然,您可能早就记不起来正确的版本号码。可能只隐约的记得大概在什么时间。没关系,按下Show log

按钮,您就可以回顾历史了。

所有您曾经做过的动作,及其日期与对应的版本都会列在这个窗口上面,只要在你想要的版上面点一下,

让他变成反白,然后按下OK。这个版本就会自动填入Update窗口中的Revision字段中。您只要再按下一

次OK,这个版本就会被取出来到您的硬盘中。

6.9 复制档案及目录

很多时候您会希望有另外一个复制的目录来进行新的编修。等到确定这个分支的修改已经完毕了,再合并

到原来的主要开发版本上。举例来说,我们目前在working copy下面有如下的目录及档案:

现在,我们要为trunk这个目录建立一个branch。假设我们希望这个目录是在

D:workingmy_prjbranchmy_new_branch_for_testing。首先我们可以在trunk目录下面的空白处,或是直

接在trunk的icon下面按下鼠标右键。

在选择Branch/Tag…这个项目后,您将会看到如下的对话框出现。

请先确认From WC at URL: 中的目录是您要复制的来源目录。接着,在To URL中输入您要复制过去的路径。

通常我们会将所有的branch集中在一个目录下面。以上面的例子来说,branch档案都会集中在branch的

子目录下面。在To URL中您只需要输入您要的目录即可。目录不存在时,会由SVN帮您建立。特别需要注

意的是SVN因为斜线作为目录分隔字符,而非反斜线。

接着在Log message输入您此次branch的目的为何。按下OK就可以了。

如果成功,将可以看到下面的画面:

按下OK就可以关闭这个窗口了。如果您此时立刻去

working copy的branch子目录下面,您将会失望的发

现在该目录下面并没有刚刚指定的目录存在。这是因

为您working copy的部份还是旧的,您只需要在

branch子目录下面进行SVN update就可以看到这个

新增的目录了。新增的目录就与原来的目录无关了。

您可以任意对他进行编辑,一直到您确认好所有在

branch下面该做的工作都完成后,您可以选择将这个

branch merge回原来的trunk目录,或者是保留它在branch中。

要merge回trunk目录中,方法很简单。以上面的例子来说,我们在D:workingmy_prjtrunk目录空白处,

按下鼠标右键,选择Merge:

接着可以看到如下的画面:

这个画面主要分为三个部份,前面的From: 与 To: 是要问您打算从Branch中的哪个版本到哪个版本,merge

回原来的trunk目录中。因此,From跟To的URL字段应当都是指定原来branch的目录下。剩下的就是指

定要merge的revision范围。以上面的例子而言,我们从Branch的Revision 7开始merge到Branch下面的

最新版本。您可以透过,Dry run按钮,试作一次Merge。这个merge只会显示一些讯息,不会真正的更新

到trunk的目录去。只有按下Merge按钮后,才会真正的将branch的档案与trunk的档案合并起来。

上面的讯息告诉我们在trunk目录下面的及已经被更改过了。如果您在现在到trunk目录

下,会看到这两个档案处于被修改的状态。

如果您确认这次的merge没有问题,您可以直接使用commit来将这两个被修改的档案commit回SVN

repository上。如果有问题,您可以直接修改这两个档案,直到确认ok了,再行commit。

一切顺利的话,您就成功的将branch的档案merge回trunk了。

6.10 制作Tag或是Release

所谓的Tag或是Release就是一个特别的版本,因为这个版本可能有特别的意义。例如:这个版本是特别的

Milestone或是release给客户的版本。其实,Tag与Release的作法与Branch完全相同。只是Branch可能

会需要merge回原来的trunk中,而tag及release大部分都不需要merge回trunk中。举例来说,今天我

们的trunk做了一版,这个版本被认定是软件的1.0版。1.0版对于开发来说是一个非常重要的里程碑。所

以我们要特别为他做一个标记,亦即Tag。假设,这个 1.0版是要正式release给客户或是相关vendor,我

们要可以为他做一个Release的标记。基本上,SVN只有目录的概念,并没有什么Tag的用法。所以您会看

到再SVN的选单上面,Branch与Tag是同一个项目。以这个1.0的例子来说,我们就是在Trunk上面,按

下鼠标右键,选择Branch/Tag的项目:

成功的话,您就在Tag目录下面建立了一个1.0的目录。当然,如果您这时到Tag的目录下面去,会看不到

这个目录,您需要在Tag目录下面update一下,才能看到它。

制作Release的作法与Tag完全相同。只是把Tag的目录换成Release而已。

看到这里,相信大家都已经领悟到无论是Branch,Tag或是Release都只是将指定的Trunk版本复制一份到

另外一个目录去。至于这个目录要叫Branch还是叫Release,SVN根本就不管。所以,您也可取其它的目

录名称。不过,Branch,Tag及Release已经是SVN上面约定成俗的名称。所以,除非您知道自己为何这样

做,否则,最好还是follow这个命名原则,以免后面新加入的人看不懂。

NOTE:同样的道理Trunk也只是一个约定成俗的名称。不一定要叫Trunk。只是

大家看到Trunk目录就会知道这里面放的是主要的开发主干。

6.11 快速参考

前面写了不少废话,主要是给完全没有版本控制观念的人看的。如果你想直接知道某个功能如何使用,请

看下面的章节。

在后面的说明,皆以d:working当作工作目录。您可以将他换成其它任何您想要的目录。

6.11.1 取得(Checkout)Repository

1. 开启档案管理员,进入d:

2. 在档案管理员空白处按下鼠标右键,选择SVN Checkout

3. 在Checkout对话框中,

1. URL of repository:repository的位置。

2. Checkout directory:要存放working copy的地方。

4. 若d:working目录不存在,SVN会问您要不要建立这个目录,请选择Yes。

5. 接着按下OK,即可checkout该目录。

6.11.2 更新(Update)档案或目录

1. 在您要由repository更新至working copy的档案或是目录的icon上面按下鼠标右键。选择SVN

Update即可。

2. 如果是要更新至特定的版本,则选择TortoiseSVN->Update to revision。并且在Update对话框中的

Revision字段输入您要的版本。也可以透过Show Log按钮来查看版本的信息。

6.11.3 新增(Add)档案或目录

1. 在尚不属于repository的档案或目录的icon上按下鼠标右键。选择TortoiseSVN->Add。

2. 选取要新增的档案。

3. 按下OK。

NOTE:新增的档案要经过提交(Commit)的动作才回真正的放入Repository中。

6.11.4 提交(Commit)修改过的档案或目录

1. 在修改过的档案,或是在整个目录的空白处按下鼠标右键。

2. 勾选真正要提交至Repository的档案或目录。

3. 输入本次提交的纪录讯息(Message)。这个讯息应该要清楚明了,但不应过份简单。以利日后版本

追踪。

4. 按下OK。

6.11.5 Copy/Tag/Branch/Release档案或目录

1. 确认您要处理的档案或是目录已经是Repository中最新的版本。

2. 在要处理的目录或是档案上面按下鼠标右键,选择TortoiseSVN->Branch/Tag。

3. 在To URL处输入您要的目的地。

1. branch:要产生一个分支。以区别与trunk不同的开发。

2. tag:要形成一个标记,表示重要的milestone。

3. release:表示一个已经正式的release的纪录。

4. 其它:进行一个复制(copy)。