TortoiseSVN日常使用指南(一)
 
2009-04-10 来源:网络
 

本文目的在与描述TortoiseSVN客户端的日常使用。不是一个版本控制系统指南,也不是Subversion (SVN)的指南。本文档的价值在于,当你知道大概要做什么,却又记不起应该怎么做的时候,可以有个参考的地方。如果你需要了解使用Subversion进行版本控制的指南,我们建立你阅读以下这本梦幻般的书: Subversion权威指南本文档与TortoiseSVN和Subversion一样,也是处于正在开发的状态。如果你找到了错误之处,请向邮件列表报告,这样我们就可以更新它。日常使用指南(DUG)中的一些屏幕截图也许不符合当前软件中的情况。请您原谅我们。毕竟我们只是用业余的时间在制作TortoiseSVN 你应该已经安装了TortoiseSVN 你应该熟悉版本控制系统。 你应该知道Subversion的基础。 你应该已经建立了一个服务器并且可以访问Subversion库.

5.1开始

5.1.1.图标重载图

5.1.显示重载图标的资源管理器显示重载图标的资源管理器

TortoiseSVN最直观的功能之一就是图标重载,重载的图标显示在你的工作复本文件上。你一眼就可以知道文件被修改过了。参考第 5.7.1 节 “图标重载”学习不同的重载图标所表示的意义。

5.1.2. 右键菜单

图 5.2. 版本控制下一个目录的右键菜单

版本控制下一个目录的右键菜单

所有的TortoiseSVN命令都是通过windows资源管理器的右键菜单执行。右键点击一个文件或者文件夹,大多数菜单项都能够直接显示。一个命令是否显示取决于这个文件或文件夹或者它们的父文件夹是否受版本控制,你也可以将TortoiseSVN的菜单作为资源管理器菜单的一部分。

在某些情况下,你可能看到多个TortoiseSVN条目。这不是BUG!

图 5.3. 在一个版本控制的文件夹下资源管理器文件菜单中的快捷方式。

在一个版本控制的文件夹下资源管理器文件菜单中的快捷方式。

本示例是在一个受控文件夹下的某个未受控的快捷方式, 在资源管理器的文件菜单下有三个TortoiseSVN条目。一个是受控文件夹本身的,一个是快捷方式本身的,第三个是快捷方式所指向的对象。为了帮助你区分它们,菜单条目的图标的右下角有标志,表明是文件、快捷方式、文件夹或是选中了多项。

5.1.3. 拖放

图 5.4. 版本控制下的一个目录的右键拖拽菜单

版本控制下的一个目录的右键拖拽菜单

在工作拷贝里右键拖拽文件或目录到新的位置,或者右键拖拽一个非版本控制的文件或文件夹到一个版本控制目录下的时候,右键菜单还能够出现其他的命令。

5.1.4. 常用快捷方式

一些常见的操作与Windows的快捷键是一样的,但没有出现在按钮或是菜单中。如果你找不到一些显而易见的操作,比如刷新视图,请参考以下内容。

F1
当然是帮助。
F5
刷新当前视图。这也许是单键命令中唯一一个最常用的了。比如... 在资源浏览器中,这个键可以刷新工作复本中的图标重载。在提交对话框中,它可以重新扫描查找哪些是需要提交的。在版本日志对话框中,可以重新联系版本库以检查更多的最近修改情况。
Ctrl-A
全选。可用于在得到一个错误消息并想要复制粘贴到电子邮件时。使用Ctrl-A to选择错误错误,然后...
Ctrl-C
... 复制选中的文本。

5.1.5. 认证

如果要连接的版本库需要口令,一个认证对话框就会显示出来。

图 5.5. 认证对话框

认证对话框

输入你的用户名和口令。那个选择框能让TortoiseSVN在Subversion的缺省路径下$APPDATA\Subversion\auth的三个子目录里保存认证信息:

  • svn.simple文件里包含了基本认证方式所需要的认证信息(用户名/口令)。
  • svn.ssl.server文件里包含了SSL服务器证书。
  • svn.username文件里包含了用户名认证的认证信息(不需要提供密码)。

每个文件对应一个要连接的服务器。文件是纯文本格式,因此可以用文本编辑器查看每个文件是应用于哪个服务器的。如果希望Subversion和TortoiseSVN忘记某个服务器的凭证信息,只需删除这个服务器的对应文件即可。

如果想要清除所有服务器的认证缓存,可以通过TortoiseSVN的设置对话框的常规设置页来实现。那个按钮能够清除Subversion的auth目录下缓存的所有认证数据,以及老版本的TortoiseSVN存储在注册表里的认证数据。请参考 第 5.27.1 节 “常规设置”。

关于如何设置服务器的认证和权限的更多信息,请参考第 3 章 配置服务器

[提示] 提示
如果使用Windows NT域进行认证,输入用户名的时候要包括域名,如:MYDOMAIN/johnd

5.2. 导入数据到版本库

5.2.1. 版本库布局

在将你的数据导入到版本库之前,首先你得考虑如何组织你的数据。如果你使用一种推荐的布局,你在后面的操作将会更容易许多。

有一些标准的、推荐的方式来组织一个版本库。大多数人建一个trunk目录来存放开发的“主线”、一个branches目录来容纳分支拷贝、以及一个tags目录来容纳标签拷贝。如果一个版本库只存放一个项目,人们通常创建三个这样的顶层目录:

/trunk /branches /tags

如果一个版本库包含多个项目,人们通常按分支来安排布局:

/trunk/paint /trunk/calc /branches/paint /branches/calc /tags/paint /tags/calc

……或者按项目:

/paint/trunk /paint/branches /paint/tags /calc/trunk /calc/branches /calc/tags

如果项目不是密切相关,而且每一个是单独被检出,那么按项目布局是合理的。对于那些你想一次检出所有项目,或需要将它们打成一个分发包的相关项目,按分支来布局通常比较好。这种方式你只要检出一个分支,而且子项目之间的关系也比较清楚。

如果你采用顶层/trunk /tags /branches这种方式,并不意味着你必须拷贝整个主线为分支或标签,而且某些情况下这种结构更具灵活性。

对于不相关的项目,你可能更愿意使用不同的版本库。当你提交时,改变的是整个版本库的修订号,而不是项目的。让两个不相关的项目共用一个版本库,会导致修订号出现较大的跳跃。Subversion和TortoiseSVN项目看起来是在同一个主机地址,但是它们是在完全独立的版本库中开发着,并且版本号也不相干。

当然,你完全可以不理会上面提及的通用布局。你可以自由改变,来满足你和你团队的需要。请记住,不管你选择哪种布局,它都不是永久的。你可以在随时重新组织你的版本库。因为分支和标签是普通的目录,只要你愿意,TortoiseSVN可以将它们移动或重命名。

从一种布局转换到另一种布局仅仅是在服务器端移动一些文件或目录;如果你不喜欢版本库的组织形式,仅管大胆地修改那些目录。

所以,如果你还没创建一个基本的文件夹结构到你的版本库中,你现在可以这样做:

  1. 在你的硬盘上创建一个空的文件夹
  2. 在那个文件夹下创建你想要的顶级目录--千万不要放任何文件进去!
  3. 通过在那个文件夹右键,选择TortoiseSVN 导入... 将这个结构导入到版本库中。这将导入临时文件夹到版本库的根目录形成一个基本的版本库布局。

注意,你所导入的那个文件夹的名字并不存在于版本库中,仅仅是它所包含的内容。比如,创建如下结构的文件夹

C:\Temp\New\trunk C:\Temp\New\branches C:\Temp\New\tags

导入C:\Temp\New到版本库的根目录,版本库中将会是这样:

/trunk /branches /tags

你还可以使用版本库浏览器直接在版本库中创建文件夹。

5.2.2. 导入

在将你的项目导入到版本库之前,你应该:

  1. 删除所有构建工程不需要的文件(临时文件,编译器产生的文件,例如 *.obj,生成的二进制文件,...)
  2. 组织目录和子目录内的文件。尽管以后可能会改名/删除文件,我们还是建议你在导入之前使你的项目结构组织良好!

现在进入资源管理器,选择你的项目的顶层目录,右击打开上下文菜单。选择命令TortoiseSVN 导入 ...,它会弹出一个对话框:

图 5.6. 导入对话框

导入对话框

在这个对话框中,输入你的项目导入到版本库的URL。

这个输入信息将用作提交日志。

默认情况下,匹配全局忽略模式的文件和文件夹不会被导入。你可以使用包含忽略文件检验栏来禁止此行为。参考第 5.27.1 节 “常规设置”以获得关于全局忽略模式的更多信息。

当你点击确认时,TortoiseSVN 会导入包含所有文件的完整目录树到版本库。如前所述,你导入的文件夹名称不会在版本库中出现,只有这个文件夹的内容会在版本库中出现。现在这个工程就存贮在版本库,被版本控制。请注意,你导入的文件夹没有被版本控制!你需要检出刚才导入的版本,以便获得受版本控制的工作目录

5.2.3. 专用文件

有时候你需要版本控制一个包含用户专用的数据。它意味着你有一个文件,每个开发者/用户都需要修改,一边满足他/她的本地配置。但是版本控制这样的文件是困难的,因为每个用户可能都要提交他/她的修改。

在这种情况下,我们建议使用模版文件。创建你个包含所有开发者需要的数据的文件,增加到版本库中,让开发者检出。然后,每个开发者创建一个副本,改名此文件。于是,修改这个文件不再是问题。

作为例子,你可以看看TortoiseSVN的构建脚本。它调用一个TortoiseVars.bat文件,它并不在版本库中。 只有TortoiseVars.tmpl在版本库中。TortoiseVars.tmpl是一个模版文件,每个开发者都需要创建一个副本,改名为TortoiseVars.bat。在这个文件中,我们增加了注释,所以用户知道他们需要编辑那些行,以便适应他们的本地配置,使其能工作。

于是为了不干扰用户,我们也将TortoiseVars.bat增加到它的父目录的忽略列表,也就是,我们设置了Subversion属性svn:ignore包含这个文件名称。这样,每次提交时它都不会作为没有版本控制的文件出现。

5.2.4. 引用的工程

有时候,构建一个需要不同检出的工作目录是很有用的。举例来说,你需要不同的子目录来自版本库的不同位置。,或者可能完全来自不同的版本库。如果你需要每个用户具有相同的目录结构,你可以定义svn:externals属性。

比如说,你检出了/project1,工作目录是 D:\dev\project1。选择目录D:\dev\project1右击,在右键菜单选择Windows 菜单 属性。就会出现属性窗口,转到Subversion页,你可以设置属性。从组合框选择svn:externals属性,在编辑框按照名称 URL格式输入,或者你需要一个指定的版本,那么使用名称 -r版本 URL。你可以增加多个外部工程,每行一个。注意,URL必须使用逃逸字符编码,不然可能无法正常工作。举例说明,你必须将每个空格替换为%20。使用包含空格的目录名称是不可能的。假设你为D:\dev\project1设置了这些属性:

sounds http://sounds.red-bean.com/repos quick_graphs http://graphics.red-bean.com/repos/fast%20graphics skins/toolkit -r21 http://svn.red-bean.com/repos/skin-maker

现在点击 设置,然后提交你的修改。当你(或其他用户)更新工作目录时, Subversion 将会创建子目录D:\dev\project1\sounds,并且检出sounds工程,另一个子目录D:\dev\project1\quick graphs包含graphics工程,最后一个嵌套的子目录D:\dev\project1\skins\toolkit包含的skin-maker工程的版本21。

如果一个外部工程位于同一版本库中,当你向主项目提交你的修改时,你对外部工程做的修改也会包含在提交列表中。

如果外部工程位于不同的版本库,当你向主项目提交你的修改时,你对外部工程做的修改会被通报,但是你必须单独的提交这些外部项目的修改。

注意如果你修改了svn:externals属性中的URL,下次更新工作目录时,Subversion将会删除老的外部目录,重新检出副本,于是你将看到文件被增加而不是你期望的被更新。当你引用一个其它项目的标记时,这种情况就可能发生。即当那个项目发布新版本时,你将外部引用改为新的标记。

[提示] 提示
你应当认真考虑在所有外部定义中使用确定的版本号。这样做意味着你决定下载一个快照,并且精确的指明了是哪个快照。与使用通常的分支相比,你不会为第三方版本库的修改感到惊讶,这些版本库你可能没有任何控制,使用精确的版本号能使你回溯工作目录到以前的版本,你的外部定义也遵循此规则,看起来是以前的版本,即外部工作副本的更新匹配他们的老版本。对于软件工程,它是你的复杂代码构建成功或失败的重要区别。

外部定义svn:externals中的URL是绝对路径。如果你重新定位工作副本,或者外部版本库重新定位了,这些URL不会自动更新。而且,如果你分支了一个工程,它的外部定义位于同一版本库中,分支中的这些URL也不会更新;你可能需要用对分支的引用替换对最新版本的引用。

如果你需要TortoiseSVN如何处理属性的更多信息,请阅读第 5.15 节 “项目设置”。

如果你需要知道存取公共子个我我你工程的不同方法,请阅读第 B.6 节 “包含一个普通

5.3. 检出工作拷贝

为了得到一个工作拷贝,需要进行从版本库检出的操作。

在Windows资源管理器里选择一个存放工作拷贝的目录。右键点击弹出右键菜单,选择TortoiseSVN 检出…命令。然后就会看到下面的对话框:

图 5.7. 检出对话框

检出对话框

如果输入一个并不存在的目录名,那么这个名字的目录就会被创建出来。

[重要] 重要
你应该只检出到一个空的目录。如果你要将你的源代码树检出到与你导入它们时相同的目录,Subversion会给出一个错误信息它不会用已受控的文件覆盖已经存在的但未受控的文件。你必须检出到一个不同的目录或是先将已经存在的源代码树删除。

如果你只希望检出最顶层的文件夹而忽略子文件夹,请选中只检出顶层文件夹复选框。

如果项目含有外部项目的引用,而这个引用你不希望同时检出,请选中忽略外部的复选框。

[重要] 重要
如果这两个选项的任何一个选中了,你应该使用TortoiseSVN 更新至版本...来更新你的工作复本而不是使用TortoiseSVN 更新。标准的更新将会包含所有的子文件夹和外部引用。

强烈建议你只检出trunk的那部分目录树。如果你在URL中指定了目录树的父路径,你的硬盘有可能被塞满,因为你将会得到整个版本库树的复本,包括项目所有的分支和标签(tag)!

[提示] 关于导出
有时你可能想要建立一个没有.svn目录的本地的复本,比如建立一个源代码压缩包。要达到这个目的,请参考第 5.23 节 “导出一个Subversion工作拷贝”。

5.4. 让你的修改进入版本库

将你对工作复本的修改发送给版本库,称为提交修改。但在你提交之前要确保你的工作副本是最新的。你可以直接使用TortoiseSVN 更新,或者,你可以先使用TortoiseSVN 检查修改看看哪些文件在本地或是服务器上已经有了改动。

如果你的工作复本是最新的,并且没有冲突,你就已经为提交做好准备了,选择你要提交的文件和/或文件夹,然后TortoiseSVN 提交....

图 5.8. 提交对话框

提交对话框

提交对话框将显示每个被改动过的文件,包括新增的、删除的和未受控的文件。如果你不想改动被提交,只要将该文件的复选框的勾去掉就可以了。如果你要加入未受控的文件,只要勾选该文件把它加入提交列表就可以了。

那些被切换(switched)到不同版本库路径的项也用(s)标记来表示。当工作在分支上的时候你可能切换到某处,然后忘记切换回主干。这是你的警告信号!

[提示] 提交文件还是文件夹?
当你提交文件时,提交对话框只显示你所提中的文件。当你提交文件夹中,提交对话框将自动选择有改动的文件。如果你忘记了你建立的一个新文件,提交文件夹将使你可以找到它。提交一个文件夹并不意味着每个文件都被标识为修改过的,它仅仅是通过帮你多做些事从而让你的生活更滋润一点。

如果你修改的文件是使用了svn:externals从别的版本库中包含进来的,那么这些改动不会被自动提交。在文件列表下方的警告符号会告诉你是否出现了这种状况,工具提示(tooltip)提示了外部文件必须要分开提交。

[提示] 在提交对话框中有很多未受控的文件
如果你认为TSVN提交对话框显示了太多的未受控文件(如编译器产生的文件或是编辑器的备份文件),有几种方法可以处理这种情况。你可以:
  • 将文件(或是通配符扩展)加入到设置页的排除列表中。这对每个工作复本都起作用。
  • 使用TortoiseSVN 加入忽略列表,将文件加入svn:ignore列表。 这只对你设置了svn:ignore属性的路径有效。使用SVN属性对话框,你可以改变一个目录的svn:ignore属性。

参考第 5.11 节 “忽略文件和目录” 获得更多的信息。

在提交对话框中双击任何修改过的文件,将运行外部diff工具显示你作的改动。上下文菜单(右键菜单)将给你更多的选项,请看屏幕截图。你可以从这里将文件拖动到另一个应用程序中,如文本编辑器或是IDE。

在底部面板中显示的列是可定制的。如果你右击任何一列的头部,你就会看到一个上下文菜单,允许你选择哪一列要显示。还可以在鼠标移动到列边界时通过拖动手把来改变列的宽度。这些定制的内容都会被保留下来,下一次你会见到相同的列。

[提示] 拖放
你可以将文件从别的地方拖动到提交对话框,只要工作复本是由同一版本库中检出就可以了。比如,你有一个很大的工作复本,要开好几个资源管理器窗口来查看层次中不同的文件夹。如果你要避免从顶级文件夹提交(冗长而缓慢的文件夹改动检查),你可以打开一个文件夹的提交对话框,然后将别的窗口中的项拖进去,可样就可以一次提交它们了。
[提示] 修复外部改名
有时候文件不是用Subversion改名,于是它们在文件列表中作为丢失和未版本控制的文件出现。为了避免丢失历史,你需要通知Subversion。简单的选择老名称(丢失)和新名称(未版本控制),然后使用右键菜单 修复移动来指明这两个文件是改名关系。

确保输入描述你所提交的修改内容的日志信息。这可以帮你回顾做了什么,什么时候做的。信息的内容可长可短,许多项目规定了要包含的内容、使用的语言甚至是严格的格式。

你可以使用与电子邮件相似的约定,简单格式化日志消息。如果对文本采用这些样式,使用*文本*表示粗体,_文本_表示下划线,^文本^表示斜体。

图 5.9. 提交对话框的拼写检查器

提交对话框的拼写检查器

TortoiseSVN包含了一个拼写检查器帮助你正确地书写日志信息。对任何错误拼写的词都高亮显示。使用右键菜单可以获得修改建议。当然它不会知道所有的技术术语,所以有时一些拼写正确的词会被当作错误。但不用担心,你可以使用右键菜单将它们加入你的个人字典中。

日志信息窗口还包含一个文件名和函数自动完成的功能。这使用了正则表达式来从你提交的(文本)文件中提取类和函数名,当然包括文件名本身。如果你现在敲入的一个词与列表中的任意一个匹配(在你输入至少3个字符后),就会出现一个下拉列表,允许你选择完整的名字。与TortoiseSVN一起提供的正则表达式位于TortoiseSVN安装路径的bin文件夹中。你可以定义自己的正则式并将其存放在%APPDATA%\TortoiseSVN\autolist.txt。当然你自定义的自动列表不会在升级安装的时候被覆盖。如果你不熟悉正则表达式,请参考在线文件和教程:http://www.regular-expressions.info/.

在按下OK之后,会出现一个对话框显示提交的进度。

图 5.10. 显示提交进度的进度对话框

显示提交进度的进度对话框

进度对话框使用颜色代码来高亮显示不同的提交行为。

蓝色
提交一个修改。
紫色
提交一个新增项。
深红
提交一个删除或是替换。
黑色
所有其他项。

这是默认的配色方案,但你可以通过设置对话框来定制这些颜色。参考第 5.27.2.5 节 “TSVN颜色设置”获得详情。

[提示] 指定文件夹属性
有几个特殊的文件夹属性可用于帮助我们得到更多的对提交日志信息的格式以及拼写检查模块的控制。参考第 5.15 节 “项目设置”以了解详情。
[提示] 与缺陷跟踪工具整合
如果你激活了一个缺陷跟踪系统,你可以在Bug-ID / Issue-Nr:文本框中设置一个或多个问题。多个问题应该用逗号分割。另外,如果你使用基于正则表达式的缺陷跟踪支持,只要将你的问题引用作为日志信息的一部分加入就可以了。详情请见第 5.25 节 “与BUG跟踪系统/问题跟踪集成”。

5.5. 用来自别人的修改更新你的工作复本

图 5.11. 已经完成更新的进度对话框

已经完成更新的进度对话框

你应该定期地确保别人作的修改与你的工作复本可以整合。从服务器上获取改动到你本地复本的过程称为更新。更新可以针对一个文件、几个选中的文件或是递归整个目录层次。要进行更新操作,请选择要更新文件和/或路径,右击选择右键菜单中的TortoiseSVN 更新。会弹出一个窗口显示更新的进度。别人作的修改将合并到你的文件中,你所做的修改会被保留。版本库更新操作的影响。

进度对话框使用颜色代码来高亮不同的更新行为

紫色
新项已经增加到你的工作副本中。
深红
你的工作副本中删除了多余项,或是你的工作副本中丢失的项被替换。
绿色
版本库中的修改与你的本地修改成功合并。
亮红
来自版本库的修改在与本地修改合并时出现了冲突,需要你解决。
黑色
你WC中的没有改动的项被来自版本库中新版本所更新。

这是默认的配色方案,但你可以通过设置对话框来定制这些颜色。参考第 5.27.2.5 节 “TSVN颜色设置”获得详情。

如果你在更新中遇到了冲突(这是由于别人与你修改了同一个文件的同一行代码,并且两者的修改不匹配),对话框中将冲突显示为红色,你可以双击这些行启动外部合并工具来解决冲突。

当更新完成后,进度对话框在文件列表下面显示汇总信息,多少项更新,增加,删除,冲突等。汇总信息可以使用CTRL+C复制到剪贴板。

标准的更新命令没有选项,仅仅是把你的工作复本更新到版本库中的最新版本,这也是最常用的情况。如果你要对更新过程进行更多的控制,就要使用TortoiseSVN 更新到版本...。这个操作允许你更新工作复本到一个指定的版本,不仅仅是最新的。假设你的工作复本是在版本100,但你要回顾一下版本50是什么样的——那你只要简单地更新到版本50就可以了。在同一个对话框中你还可以选择不递归更新当前文件夹(就是不更新所有的子文件夹)并且可以选择是否在更新中忽略外部的项目(比如具有属性 svn:externals的被引用的项目).

[小心] 小心
如果你把一个文件或是文件夹更新到某个特定的版本,你不应该对这些文件做修改。你在提交的时候会得到一个已经过期的错误消息!如果你要取消修改,从一个早前的版本重新开始,你可以通过版本日志对话框回滚到之前的版本。请看第 B.4 节 “回滚版本库里的版本”以获得详情和其他方法。

更新到版本在你偶尔要看看你的项目在早前某时刻是什么样子的时候很有用。但通常,更新单个文件到之前的版本不是一个好主意,因为这会使你的工作复本处于不一致的状态。如果你要更新的文件已经改了名,你可能甚至发现该文件从你的工作复本中消失了,因为早期的版本中不存在这个名字的文件。如果你只是简单地想要一个旧版本文件的本地复本,最好是在该文件的日志对话框中使用右键菜单 另存版本为...命令。

[提示] 多文件/文件夹
如果你在资源管理器中选择了多文件和文件夹,然后选择更新,这些文件/文件夹一个接一个的被更新。TortoiseSVN确保所有的来自同一版本库的文件/文件夹被更新到同一个版本!即使在更新过程中发生了另一个提交。
[提示] 本地文件已经存在
有时在你试图更新的时候,更新失败,提示信息说已经有一个同名的本地文件。通常发生在Subversion试图检出一个新增的受控文件时,发现一个未受控的同名文件已经在工作路径中存在。Subversion绝不会覆盖一个未受控的文件——因为它有可能有你需要的东西,却碰匚与另一个开发者新提交的文件重名了。

如果你得到这个错误信息,解决的方法就是把本地的未受控文件重命名。在完成更新之后,你再检查被重命名的文件是不是还需要。

如果你一直得到错误,使用TortoiseSVN 检查修改来列出所有有问题的文件。这样你可以一次性解决它们。

5.6. 解决冲突

有时当你从版本库中更新你的文件时,会有冲突。冲突出现的原因是两个开发人员修改了文件中相同的几行。由于Subversion不知道你的项目的具体情况,它把解决冲突的工作留给了开发人员。一旦出现冲突,你就应该打开有问题的文件,查找以字符串<<<<<<<开头的行。有冲突的区域用如下的方式标记:

<<<<<<< filename 你的修改 ======= 来自版本库中的代码 >>>>>>> revision

对于每个冲突的文件Subversion在你的目录下放置了三个文件:

filename.ext.mine
这是你的文件,在你更新你的工作复本之前存在于你的的工作复本中——也就是说,没有冲突标志。这个文件除了你的最新修改外没有别的东西。
filename.ext.rOLDREV
这是在你更新你的工作复本之前的基础版本(BASE revision)文件。也就是说,它是在你做最后修改之前所检出的文件。
filename.ext.rNEWREV
这个文件是当你更新你的工作复本时,你的Subversion客户端从服务器接收到的。这个文件对应与版本库中的最新版本。

你可以通过TortoiseSVN 编辑冲突运行外部合并工具/冲突编辑器,或者你可以使用任何别的编辑器手动解决冲突。你需要冲定哪些代码是需要的,做一些必要的修改然后保存。

然后,执行命令TortoiseSVN 已解决并提交人的修改到版本库。需要注意的是已解决命令并不是真正的解决了冲突,它只是删除了filename.ext.minefilename.ext.r*两个文件,允许你提交修改。

如果你的二进制文件有冲突,Subversion不会试图合并文件。本地文件保持不变(完全是你最后修改时的样子),但你会看到filename.ext.r*文件。如果你要撤消你的修改,保留版本库中的版本,请使用还原(Revert)命令。如果你要保持你的版本覆盖版本库中的版本,使用已解决命令,然后提交你的版本。

你可以右击父文件夹,选择TortoiseSVN 已解决...,使用“已解决”命令来解决多个文件。这个操作会出现一个对话框,列出文件夹下所有有冲突的文件,你可以选择将哪些标记成已解决。

5.7. 获得状态信息

当你在你的工作复本上工作时,你时常需要知道哪些文件你已经修改/增加/删除或改名了,或者甚至是哪个文件已经被其他人修改并提交了。

5.7.1. 图标重载

 

图 5.12. 显示重载图标的资源管理器

显示重载图标的资源管理器

 

现在你已经从Subversion版本库中检出了一份工作复本,你可以在资源管理器中看一下这些文件的图标有什么变化。这也正是TortoiseSVN这么流行的原因之一。TortoiseSVN加入了被称为重载图标的功能重载了原始的文件图标。根据文件的Subversion状态的不同,重载的图标也不同。

一个新检出的工作复本使用绿色的对勾做重载。表示Subversion状态正常.

在你开始编辑一个文件后,状态就变成了已修改,而图标重载变成了红色感叹号。通过这种方式,你可以很容易地看出哪些文件从你上次更新工作复本后被修改过,需要被提交。

如果在提交的过程中出现了冲突图标变成黄色感叹号。

如果你给一个文件设置了svn:needs-lock属性,Subversion会让此文件只读,直到你获得文件锁。只读文件具有这个重载图标来表示你必须在编辑之前先得到一个锁。

如果你拥有了一个文件的锁,并且Subversion状态是正常,这个重载图标就提醒你如果不使用该文件的话应该释放锁,允许别人提交对该文件的修改。

这个图标表示当前文件夹下的某些文件或文件夹已经被计划从版本控制中删除,或是该文件夹下某个受控的文件丢失了。

加号告诉你有一个文件或是目录已经被计划加入版本控制。

与TortoiseCVS (一个集成的CVS shell)不同,对于未受控的文件没有图标重载。这么做是因为图标重载的数量受到系统的限制,应该要节约使用。

事实上,你会发现并不是所有的图标被使用在你的系统上。这是由于Windows限制图标重载不能超过15个。Windows自己用了4个,剩下11个可被别的应用程序使用。如果你同时使用了TortoiseCVS,就不有足够的空位了,所以TortoiseSVN希望成为一个“良好市民(TM)”,限制自身的使用,为别的应用留下机会。

正常, 已修改和冲突总是被载入,并可见。
 

已删除只要有可能的就载入,但如果没有足够的空位,就使用已修改来代替。

只读只要有可能就载入,但如果没有足够的空位就使用正常来代替。

已锁定只在少于13个重载已经载入的情况下才加载,如果不满足这个条件就使用正常来代替。

已增加只在少于14个重载已经载入的情况下才加载,如果不满足这个条件就使用已修改来代替
 

5.7.2. 在Windows资源管理器中的TortoiseSVN列

在Windows资源管理器的详细信息视图中,附加列中可以显示与图标重载所表达相同的信息(还可以显示更多其他信息)。

右键点击列头,从出现的右键菜单中选择其他...。出现一个对话框,你可以指定在“详细信息视图”中要显示的列及其顺序。滚动对话框中的条目直到SVN开头的条目出现。在你要显示的条目上打勾,然后点击OK按扭关闭对话框。你选择的列就会出现在当前显示的列的右边。你可以通过拖放它们来达到重新排序或是修改列宽度的目的。

[提示] 提示
如果你想要当前的布局对你所有的工作复本都有效,你可以考虑把它设成默认视图。

5.7.3. 本地与远程状态

图 5.13. 检查所作的修改

检查所作的修改

通常知道你修改了哪些文件以及哪些文件已经由另人修改并提交了是很有用的。这就是命令TortoiseSVN Check For Modifications... 的用武之地了。这个对话框显示了所有你的工作复本中进行了任何形式的修改的的文件,也包括了当前存在的未受控的文件。

如果你点击检查版本库,那你还可以看到版本库里的改动。这样,你就可以在提交之前检查是否有存在冲突的可能。你也可以从版本库中更新选中的文件而用不着更新整个文件夹。

对话框使用颜色代码来高亮显示状态。

这是默认的配色方案,但你可以通过设置对话框来定制这些颜色。参考第 5.27.2.5 节 “TSVN颜色设置”获得详情。

那些被切换(switched)到不同版本库路径的项也用(s)标记来表示。当工作在分支上的时候你可能切换到某处,然后忘记切换回主干。这是你的警告信号!

在对话框的上下文菜单中你可以显示改变的差异。使用 上下文菜单 与基础版本比较检查所作的本地修改。使用上下文菜单 使用标准差异格式显示差异检查版本库中别人作的修改。

你还可以对单个文件进行还原(revert)。如果你不小心删除了一个文件,在对话框中会显示为丢失你可以使用还原来恢复它。

可以使用邮件菜单 删除将未版本控制的或忽略的文件丢到垃圾箱。如果你向彻底删除(不使用垃圾箱),在点击删除时,请按着Shift键。

如果你要查询一个文件的详细情况,你可以把它从这里拖到另一个应用程序,比如一个文本编辑器或是IDE中。

这些列是可定制的。如果你右击任何一列的头部,你就会看到一个上下文菜单,允许你选择哪一列要显示。还可以在鼠标移动到列边界时通过拖动把手来改变列的宽度。这些定制的内容都会被保留下来,下一次你会见到相同的头部。

[提示] 提示
如果你需要工作目录的全面视图,也就是所有文件和文件夹都同时显示,以便方便的使用检查修改对话框。只要选择现实未修改文件检查栏,显示工作目录中的所有文件即可。
[提示] 修复外部改名
有时候文件不是用Subversion改名,于是它们在文件列表中作为丢失和未版本控制的文件出现。为了避免丢失历史,你需要通知Subversion。简单的选择老名称(丢失)和新名称(未版本控制),然后使用右键菜单 修复移动来指明这两个文件是改名关系。

5.7.4. 查看差别

通常你想要深入文件中了解你修改了什么。要达到这个目的,你可以选中这个文件,然后在TortoiseSVN的右键菜单中选择比较。这个操作会启动一个外部的差别检查程序,由它来比较当前文件与上一次检出或更新后的原始的复本(基础版本)。

[提示] 提示
即使你不是在一个工作复本中工作或者你有多个版本的文件,你都可以按以下方法来进行比较:

选择你要比较的两个文件(比如,你可以使用Ctrl 键加鼠标),然后从TortoiseSVN的右键菜单中选择比较。最后一个被鼠标点中的文件(具有焦点的文件,比如有虚线框的文件具有焦点),将作为被比较文件的后一个。

5.8. 版本日志对话框

对于每次进行修改和提交,你应该有针对性地留下日志信息。这样,你就可以在以后方便地看到你都做了什么,为什么这么做。当然这么做还是你拥有了开发过程的详细日志。

版本日志对话框可以获取所有的日志信息,并将其显示出来。对话框的视图分成3个面板。

  • 最上方的面板显示了版本的列表。这其中包含了日期和时间,以及提交的用户和日志信息开头的部分内容。

    以蓝色显示的行表示某些内容被复制到该开发版本中(可能是从一个分支中复制而来)。

  • 中间的面板显示了被选中的版本的完整的日志信息。
  • 最下面的面板显示了被选中版本中都对哪里文件和文件夹进行了修改。

当然,对话框的作用不止于此——它提供了右键菜单,通过它可以获取更多的项目历史信息。

5.8.1. 调用版本日志对话框

图 5.14. 版本日志对话框

版本日志对话框
 

有几种途径可以调出日志对话框:

  • 从右键菜单的TortoiseSVN子菜单中调用
  • 从属性页中调用
  • 在更新结束后,从进度对话框中调用。在这里,日志对话框只显示你上一次更新以来的版本变化。

5.8.2. 获得更多信息

图 5.15. 版本日志对话框的顶部面板的右键菜单

版本日志对话框的顶部面板的右键菜单

日志对话框的顶底面板右键菜单功能如下:

  • 将你的工作版本与选中的版本进行比较。默认的比较工具是与TortoiseSNV一同发布的TortoiseMerge,如果日志对话框是针对文件夹的,那么就会出现一个被修改的文件的列表,你可以单独地查看每个文件所做的修改。
  • 评审选中的版本,和你的工作基础文件,使用可视化差异工具显示结果。参阅 第 5.20.2 节 “追溯不同点” 以获得更多信息。
  • 将选中的版本作为单一差异文件(GNU补丁格式)查看。相对于可视化的文件比较器,它更难阅读,但它将所有的变化显示在一个格式更为紧凑的文件中。
  • 将选中的版本保存成文件,这样你就获得了该文件的一个旧的版本。这个选项只在你查看一个文件的日志时才可用,它只保存那一个文件的一个版本。
  • 打开版本库浏览器,可以查看选中的目录。这个选项只在你查看一个目录的日志时可用。
  • 从选中的版本建立一个分支/标记。这个选项很有用。比如:如果你提交了某些你不想使其进入发行版的修改,却忘记了为此建立标记。
  • 将你的工作复本更新到选中的版本。如果你想要你的工作复本折返到过去的某个时间,那这个功能就很好用。你最好是更新工作复本的整个目录而不是单一某个文件,因为如果只更新某个文件,你的工作复本就可能不一致,从而导致你无法提交任何修改。
  • 还原选中版本中所做的变更。还原的内容只在你的工作复本中,这个操作完全不会影响版本库!要注意的是,这个操作仅仅恢复该版本中的修改(译注:就是将你选中的那个版本中的修改还原,而在那之后的修改,包括你在工作复本中的新改动依然会被保留,如不正确请联系liuheqi@gmail.com)。不是将整个文件替换成选中的那个版本。(译注:本段对菜单中的“复原自此版本以来的变更(Revert changes from this revision)”,按实际操作的结果来看,中文菜单应翻译成“复原此版本的变更”比较合适,如不正确请联系liuheqi@gmail.com)
  • 还原到某个早前的版本。如果你进行了多个修改,然后决定要返回到版本N中的模样,你就可以使用这个命令。当然,返回的东西都只在你的工作复本中,在你提交之前,并不会影响版本库。注意,这将会还原从那个版本以来的所有变更,使用选中的版本来替换文件/文件夹。(译注:在实际使用中发现并不是简单的替换,如果你在当前工作复本中所做的修改不涉及到被选中版本以来的变更内容,那么你的修改会与版本N进行合并,否则这个操作会产生一个冲突。这段对应菜单中的“复原到此版本(Revert to this revision)”。如果不正确,请联系liuheqi@gmail.com)
  • 编辑之前提交时的日志信息或是作者。请阅读第 5.8.4 节 “修改日志消息和作者”,了解其工作原理。
  • 在日志信息中搜索你输入的的文字。这个操作搜索日志信息,也搜索由Subversion建立的提交行为总结(最底部的面板中的内容)。搜索大小写无关。

图 5.16. 选种两个版本的顶部面板的右键菜单

选种两个版本的顶部面板的右键菜单

如果你使用Ctrl组合键一次选中了两个版本,右键菜单有所改变:

  • 使用可视化差异比较工作比较两个选中的版本。默认的比较工作是与TortoiseSVN一起提供的TortoiseMerge。

    如果你是针对文件夹选中这个选项,则会弹出一个对话框列出修改过的文件,提供了更多的差异比较选项。请参考比较版本对话框获得详情:第 5.9.2 节 “比较文件夹”。

  • 评审两个版本,并使用差异比较工作比较结果。详情请参考第 5.20.2 节 “追溯不同点” 。
  • 使用单一差异文件显示差异。这对文件和文件夹都有效。
  • 如前所述可修改日志消息或作者
  • 如前所述可以搜索日志消息。

如果你用Ctrl或Shift组合键选择了多个连续的版本,右键菜单将有一个选项,可以让你还原这些版本中的修改。这是一次性还原多个版本中修改的最简方法。

图 5.17. 日志对话框的底部面板的右键菜单

日志对话框的底部面板的右键菜单

日志对话框的底部面板也有右键菜单,你可以:

  • 显示选中版本中的选中文件的差异。这个操作只对显示为已修改的文件有效。
  • 评审选中文件的选中版本与前一个版本,使用可视化差异工具显示差异。详情请参阅第 5.20.2 节 “追溯不同点” 。
  • 用默认查看器或你指定的程序打开选中文件的选中版本。
  • 还原选中文件的选中版本所作的变更。
  • 查看选中项的Subversion属性。
  • 显示选中的单个文件的版本日志。
  • 将选中的版本保存成文件,你可以得到一份该文件的旧版本。

5.8.3. 获取更多的日志信息

日志对话框并不总是显示所有曾经的修改,日志不显示的可能原因如下:

  • 对于一个大的库,可能存在几百上千个改动,全部得到它们可能要花上很久的时间。通常你只关心最近的修改。默认情况下,日志消息限制只获取100条,但你可以在TortoiseSVN设置中修改这个值 (第 5.27 节 “TortoiseSVN的设置”),
  • 复制/重命名时停止复选框被选中时, 如果选中的文件或文件夹是从版本库中的其他地方复制而来的,显示日志将停止在该点。这对于查看分支(或标记)时很有用,因为它会停在分支的根节点上,可以快速查看该分支的修改。

    一般情况下你可以不要勾选它。 TortoiseSVN会记住它的状态,以改进性能。

    如果你在从合并对话框中调用的显示日志对话框,那么这个复选框默认将总是选中的。这是由于合并通常都是查看分支中的修改, 获取分支的根之前的日志在这种情况下通常没有什么意义。

    注意,Subversion当前是用复制/删除来实现重命名的,所以重命名一个文件或文件夹也会造成日志显示停止(如果选择了复制/重命名时停止)在该点。

如果你要查看更多的日志信息,点击下100个,以获取下100个日志信息。如果有需要你可以多次重复这个操作。

这个按钮旁边的是一个多功能按钮,它可以记住上一次你要它进行的操作。点击它上面的箭头,可以看到更多的选项。

如果你要查询指定范围的版本,使用显示范围 ...。这会出现一个对话框,要求输入开始和结束的版本。

如果你要查询从最新版本直到版本1的所有的日志消息,使用显示所有

5.8.4. 修改日志消息和作者

有时你可能想要修改你曾经输入的日志消息,也许是因为有拼写错误或是你想改进消息内容,或是其他别的原因。偶尔你还想修改提交者,可能是你忘了设置认证等原因。

Subversion允许你在任何时候修改日志消息和作者。但这种改变不可还原(不在版本控制之列),正因如此,这些功能默认是不可用的,如果要开启它,必须设置一个pre-revprop-change钩子。具体如何做,请参考Subversion Book的相关章节Hook Scripts。在Windows机器上实现钩子的注意事项请阅读第 4.3 节 “钩子脚本”。


 

一旦你按需要为服务器设置了钩子,你就可以使用日志对话框顶部面板的右键菜单来修改任意版本的作者和日志信息了。

[警告] 警告
由于Subversion的版本属性不受版本控制,对于这种属性的修改(如 svn:log提交信息属性将永久覆盖该属性之前的值。

5.8.5. 过滤日志信息

如果你只想要显示上千条日志中你所感兴趣的日志,你可以使用日志对话框顶部的过滤器控件。开始和结束日期控件允许你查看指定日期范围内的输出。查找框帮你查出含有指定内容的信息。

要注意的是,这些过滤器只对已经获取的信息有效。它们并不从版本库中下载信息。

你还可以使用隐藏无关的修改路径 复选框来过滤底部面板中的路径名称。所谓相关路径,是指那些与日志相关的路径。对于一个文件夹的日志来说,相关路径就是该文件夹以其下的所有内容。对于一个文件的日志来说,相关路径就是与该文件的路径。该复选框是3态的:可以显示所有的路径,将无关的内容灰色显示,或是完全隐藏无关路径。

5.8.6. 统计信息

统计按扭,可以显示一些你感兴趣的关于日志对话框中版本的信息。可以显示已经有几个作者做了工作,他们各提交了几次,按周的统计,等等。现在,你可以发现一个大概情况:谁最勤快,谁偷懒。;-)

5.8.6.1. 统计页

此页可以提供所有你可以想到的数据,特别是周期和包括的版本数,还有一些最大/最小/平均值。

5.8.6.2. 作者提交次数统计页

图 5.18. 作者提交次数统计柱状图

作者提交次数统计柱状图

此图用简单柱状图、叠加柱状图或饼图显示了哪些作者已经在项目中活跃了。

其中有几个主要作者和许多辅助的作者。由于太小的部分会导致图形难于阅读,所以在底部有个滑动条,可以设置一个范围(占所有提交的百分比),在这个范围下的所有行为都整合成其他类。

5.8.6.3. 按周提交次数统计页

图 5.19. 按周提交次数统计

按周提交次数统计

本页图示了以提交次数作者作为条件的项目行为统计。这里可以看出项目什么时候有人在工作,以及什么人在什么时候进行了工作。

如果有多个作者,你就会在图中看到多行。有两种视图可用正常,在这里,每个作者的行为都相对于基线;叠加,在这里每个作者的行为是相对于他的下面那条线。后一种视图避免了线的交叉,对于图来说更明了,但对查看一个作者的输出比较不直观。

默认统计是区别大小写的,也就是说用户PeterEganPeteRegan被认为是两个不同的作者。但在多数时候用户名并不区别大小写,有时会存在不一致,所以你可能希望PeterEganPeteRegan能被当成是同一个作者。使用作者不区分大小写复选框来控制。

注意,统计只包括了日志对话框中的那段时期。如果日志对话框中只显示一个版本,那么统计就没有什么意义了。

5.9. 查看差异

在项目开发中,有一个很常用的要求就是查看更改。可能是你要求查看同一文件的两个版本之间的差异,或者是查看两个独立的文件的差异。TortoiseSVN自带了一个工具叫TortoiseMerge用来查看文本文件的差异。也有一个叫TortoiseIDiff的工具来比较图像文件的差异。当然,你可以根据你自己的喜好来选择比较差异的工具。

5.9.1. 文件差异

本地更改
如果你想看到你的本地副本有哪些更加,只用在资源管理器中右键菜单下选TortoiseSVN比较差异
与另外一个分支/标签之间的差异
如果你想查看主干程序(假如你在分支上开发)有哪些修改或者是某一分支(假如你在主干上开发)有哪些修改,你可以使用右键菜单。在你点击文件的同时按住Shift键,然后选择TortoiseSVNURL比较。在弹出的对话框中,将特别显示将与你本地版本做比较的版本的URL地址。

你还可以使用版本库浏览器,选择两个目录树比较,也许是两个标记,或者是分支/标记和最新版本。邮件菜单允许你使用比较版本来比较它们。阅读第 5.9.2 节 “比较文件夹”以便获得更多信息。

与历史版本的比较差异
如果你想查看某一特定版本与本地拷贝之间的差异,使用显示日志对话框,选择要比较的版本,然后选择在右键菜单中选与本地拷贝比较差异
两个历史版本的比较
如果你要查看任意已提交的两个历史版本之间的差异,在版本日志对话框中选择你要比较的两个版本(一般使用 Ctrl-更改),然后在右键菜单中选比较版本差异

如果你在文件夹的版本日志中这样做,就会出现一个比较版本对话框,显示此文件夹的文件修改列表。阅读第 5.9.2 节 “比较文件夹”以便获得更多信息。

提交所有修改
如果你要在一个视窗中查看某一版本的所有更改,你可以使用统一显示所有比较 (GNU 片段整理)。它将显示所有修改中的部分内容。它很难显示一个全面清晰的比较,但是会将所有更改都集中显示出来。在版本日志对话框中选择某一版本,然后在右键菜单中选择统一显示所有比较
文件差异
如果你要查看两个不同文件之间的差异,你可以直接在资源管理器中选择这两个文件(一般使用 Ctrl-modifier),然后右键菜单中选TortoiseSVN比较差异
WC文件/文件夹与URL之间的比较差异
如果你要查看你本地拷贝中的任一文件与版本库中任一文件之间差异,
谴责信息之间的比较差异
如果你要查看的不仅是比较差异而且包括修改该版本的作者,版本号和日期,你可以在版本日志对话框中综合比较差异和谴责信息。这里有更多详细介绍第 5.20.2 节 “追溯不同点”。
比较文件夹差异
TortoiseSVN 自带的内置工具不支持查看多级目录之间的差异,但你可以使用支持该功能的外置工具来替代。在这里 第 5.9.4 节 “其他的比较/合并工具”我们可以介绍一些我们使用过的工具。

5.9.2. 比较文件夹

图 5.20. 修订版本版本比较对话框

修订版本版本比较对话框

当你在版本库浏览器中选择了两个树,或者在日志对话框中选择了一个文件夹的两个版本,就可以使用上下文菜单 比较版本
 

这个对话框显示一个所有已经修改的文件列表,允许你使用邮件菜单单独的比较或回溯它们。

你也可以将已经修改的文件列表导出到一个文本文件中,或者将修改的文件导出到一个目录。这个操作只在选择的文件上工作,所以你需要选择感兴趣的文件 - 通常是所有文件。

如果你需要导出文件列表和动作(修改,增加,删除),你可以使用快捷键Ctrl-A选择所有项,用Ctrl-C将详细列表复制到剪贴板。

顶部的按钮允许你改变比较的方向。你可以显示从A到B的修改,或者如果你喜欢,显示从B到A的修改。

5.9.3. 使用TortoiseIDiff进行比较的图像

我们有许多有用的比较文本文件的工具,包括我们自带的TortoiseMerge,但是我们也需要查看图像文件的更改。这就是我们设计TortoiseIDiff的原因。

图 5.21. 差异察看器截图

差异察看器截图

TortoiseSVN 比较差异TortoiseIDiff可以显示同种格式的图像差异。一般情况下是左右对称地显示两个图像,但你也可以通过调整视图滑动条转变为上下显示的模式,如果你愿意,这里支持使用透明框进行图像覆盖的方式,在顶端的滑动条可以调整图像之间的吻合程度(alpha blend),你也可以使用Ctrl-Shift-Wheel来调整这种程度。

当然你也可以围绕在图像周围上上下下灵活变动地比较。如果你选择联合图像项,则被选择(滑动条,鼠标)的两个图像就被关联起来。

在图像信息框中显示了图像的基本信息,比如像素的大小,颜色的深度。如果觉得这个框碍眼可以选择视图 图像信息来隐藏它

5.9.4. 其他的比较/合并工具

如果我们提供的这些工具不是你所需要的,可以尝试使用一些其他开源的或者商业的软件。每个人都有不同喜好,下面列表虽不完全,或许有些你也会认可的:

WinMerge
WinMergeWinMerge也是一款很好的能处理目录的开源软件。
Perforce Merge
Perforce 是一款商业 RCS,但是你也可以免费下载到。可以从Perforce获得更多信息。
KDiff3
KDiff3也是一款能处理目录的免费比较工具。你可以从here下载。
ExamDiff
ExamDiff Standard是免费软件。它能处理文件但不能处理目录。ExamDiff Pro是共享软件,拥有一系列的功能包括目录比较和编辑的能力。对于以上体验,3.2及以上版本能处理二进制。你可以从PrestoSoft下载它们。
Beyond Compare
和ExamDiff Pro一样,这也是一款很不错的共享软件,同样也能进行目录比较和二进制处理。下载地址Scooter Software
Araxis Merge
Araxis Merge是一款能对文件和文件夹进行比较和合并的商业软件。它从三条比较路径进行合并,而且在你修改的同时进行及时有效的链接。可以从这里下载Araxis
SciTE
这款文本编译器在统一比较时提供语法显示,读起来更加容易。可以从这里下载Scintilla
Notepad2
Notepad2的设计旨在替代 Windows自带的记事本的功能,它以开源编译控制为基础。在查看统一比较时,它能实现比Windows自带的记事本更多功能。免费下载here

第 5.27.4 节 “外部程序设置”这里可以了解到怎样起用TortoiseSVN来使用这些工具。

5.10. 添加新文件和目录

图 5.22. 未受版本控制的文件之资源管理器上下文菜单

未受版本控制的文件之资源管理器上下文菜单

如果在你的开发过程中你创建了新的文件或目录,那么你需要把他们加入你的版本控制中。选择那个文件或目录并使用TortoiseSVN 添加(Add).

当你添加了指定的文件/目录到版本控制系统之后,这个文件上会出现一个added标志,这意味着你得先提交你的工作副本使该文件/目录对其他开发者来说成为有效的。添加一个文件/目录不会not影响版本库

[提示] 更多
你也可以在已经版本化的目录上使用Add命令。那样的话,添加对话框会显示该版本化目录下所有未版本化的文件。如果你有许多新文件需要一起添加的话,这是很有帮助的。

你可以使用鼠标拖拽的方式从你的工作副本外部添加进文件。

  1. 选择你要添加的文件
  2. 拖拽(right-drag)他们到新的工作副本下,
  3. 松开鼠标右键
  4. 选择上下文菜单 SVN 增加文件到工作副本。这些文件会被复制到工作副本,加入版本控制

5.11. 忽略文件和目录

图 5.23. 未受版本控制的文件之资源管理器上下文菜单

未受版本控制的文件之资源管理器上下文菜单

在多数项目中你总会有文件和目录不需要进行版本控制。这可能包括一些由编译器生成的文件,*.obj,*.lst。或许是一个外部的用于存放可执行程序的目录。只要你提交变更,TSVN就会在提交对话框的文件列表中列表显示出你的未版本化文件。当然你可以关闭这个显示,不过你可能会忘记添加新的版本文件。

最好的避免类似问题的方法是添加参考文件到该项目的忽略列表。这样他们就永远不会出现在提交对话框中,而真正的未版本化文件则仍然列出。

如果你右键一个单独的未版本化文件,并从菜单栏选择TortoiseSVN (加入忽略列表)Add to Ignore List,会出现一个子菜单允许你仅选择该文件,或者所有具有相同后缀的文件。如果你选择多种文件,那么就没有子菜单了,你仅能添加这些特定的文件/目录。

如果你想从忽略列表中移除一个或多个条目,right click 右键该条目并选择TortoiseSVN Remove from Ignore List你也可以直接通过目录的svn:ignore特性。他允许你指定多个文件名段的通用样式,来部分的描述。阅读第 5.15 节 “项目设置”立即获得更多关于设置道具的信息。

[提示] 全局忽略列表
另一个忽略文件的方法是添加这些文件到global ignore list .他们最大的不同是全局忽略列表是一个客户端特性。它会作用到 所有的(all subversion 项目。但只能在pc客户端使用。在全局尽可能更好的使用svn:ignore特性,因为他能够应用到特殊的项目区域,并却他作用于所有检出该项目的人。阅读第 5.27.1 节 “常规设置”获得更多信息。
[提示] 忽略已版本化的条目
已版本化的文件或目录不能够忽略,这是subversion的一个特性。如果你错误的版本化了一个文件,阅读第 B.8 节 “忽略已经版本控制的文件”介绍怎样“反版本化(unversion)”他

5.11.1. 忽略(Ignore)列表中的文件簇

Subversion 的忽略模式使用了文件簇,一种起初在Unix系统中使用meta字符作为通配符的技术。下面的字符有着特殊的意思:

星号
匹配任何字符串,包括空串(没有字符)
问号(?)
匹配任何单字符
[...]
匹配任何单在方括号[]内的单字符,在方括号内,一对字符被“-”分隔,匹配任何词汇表(lexically)上在他们中间的字符。例如[AGm-p]匹配任何但个的A,G,m,n,o或者p

Subversion执行这样的簇,那么定界符一直为/,而不是windows下的反斜线。

模式匹配是大小写敏感的,这在windows平台下会出问题。你可以要比较的字符硬性的强制忽略大小写。例如,忽略不记*.tmp的大小写。那么你可以使用像*.[Tt][Mm][Pp]这样的模式。

如果当前路径的目录名作为模式出现在匹配中,这个模式Fred.*将匹配Fred.c但不匹配subdir/Fred.c。这对于你添加了一个包含许多文件而又想忽略的目录来说是非常有意义的,因为这个目录名的优先级高于这些文件名。

你应该指定一个*CVS或者更好的CVS */CVS模式中的任意一个来忽略所有的CVS目录。执行第一个选择也将会排斥一些像ThisIsNotCVS这样的命令。而单独使用*/CVS又不能作用在一个紧跟着CVS的子目录上,而且单独的CVS 不能作用在子目录上。

如果你想要定义一个特殊的忽略规则。你可以在关于shell命令行语言的IEEE规范中找到Pattern Matching Notation

5.12. 删除、重命名和移动

不像CVS,Subversion允许重命名和移动文件和目录。因此在TortoiseSVN 的子菜单中有删除和重命名的菜单项。

图 5.24. 版本控制文件的菜单浏览

版本控制文件的菜单浏览

如果你通过TSVN删除了一个文件/目录,吗呢这个文件被移出你的工作副本并标记为删除。该文件的父目录会覆盖上一个"删除"标记。你随时可以通过在父目录调用TortoiseSVN Revert命令来恢复该文件。

如果你想在工作副本中移动文件,那么可以这样使用鼠标拖拽:

  1. 选择你要移动的文件或目录
  2. 拖拽(right-drag)他们到新的工作副本下,
  3. 松开鼠标右键
  4. 在弹出菜单选择上下文菜单 SVN 移动文件
[小心] 不要SVN Move Externals
不应该用TortoiseSVN的移动重命名命令作用在一个已经用svn:externals创建的目录上。因为这个动作可能会导致外部的元素(item)被从他的父版本库中删除,这可能会使其他很多人烦恼。如果你必须移动洋外部的目录,你应该使用一个普通的shell移动,然后调整源文件和目的文件的父目录的svn:externals道具。

如果一个 文件 是通过浏览器而不是使用TortoiseSVN 快捷菜单被删除,提交对话框也会显示这些文件并让你在提交前把他们从版本控制中移除。可是,如果你更新你的工作副本, Subversion 将会混淆这个丢失文件并替换他为版本库中的最新版本。因此,如果你需要删除一个版本控制下的文件,请始终使用TortoiseSVN Delete保证 Subversion不去猜测你到底想干什么。

如果一个 目录 是通过浏览器而不是使用TortoiseSVN 快捷菜单被删除,你的工作副本将回被损坏,并且你将不能提交。如果你更新你的工作副本,如果你更新你的工作副本, Subversion 将用版本库中的最新版本替换已丢失目录。接下来你就可以使用TortoiseSVN Delete这种正确的方法来删除它了。

[小心] 提交父目录
既然重命名和移动都可以像添加之后又删除一样被执行,你必需提交该重命名/移动文件的父目录,所以重命名/移动的删除部分将出现在提交对话框中。如果你不提交重命名/移动的已删除部分,他将保留在仓库中并且你的同组人将更新该未移除的旧文件。例如,他们将有两个一老一新的副本。

必须在重命名目录后而在更改目录下的任何文件前进行提交,不然你的工作副本就回真的混淆。

[提示] 找回已删除的文件或目录
如果你删除了洋文件或目录并已经提交该删除操作到版本库,那么 一个常规的TortoiseSVN Revert已不能再将其找回。但是该文件或目录并没有完全丢失。如果你知道该被删除文件或目录的版本(如果不能,使用日志对话框来查找出来),打开数据仓库的浏览器,并选择那个版本。然后选择你删除的文件或目录,右键并选择Context Menu Copy to...作为目标执行复制操作,然后选择你的工作副本的路径。

5.12.1. 仅在单一实例中重命名文件

万一在你的版本库中有两个名字相同但大小拼写不同(例如:TEST.TXT和test.txt)的文件,你是不能更新或者检出该包含该文件的目录的。

如果是那样的话,你得决定在这个版本库里的哪一个文件是你想保留的,哪一个是要删除(或重命名)的

这里(至少)有两种可能的解决方案来重命名文件而不丢失他的日志记录。在subversion里重命名它是很重要的。仅在浏览器中重命名将会损坏你的工作副本。

解决方案 A)(推荐)

  1. 提交你工作副本中的改变到版本库
  2. 使用版本库的浏览器立即重命名该文件的大写(小写)为小写(大写)
  3. 更新你的工作副本

解决方案 B)

  1. 使用TortoiseSVN子菜单中的重命名命令将UPPERcase重命名为UPPERcase_ 格式
  2. 提交该更改
  3. 将UPPERcase_重命名为upperCASE格式
  4. 提交该更改
[提示] 防止两个文件名字相同
这有一个有用的服务器端脚本在http://svn.collab.net/repos/svn/trunk/contrib/hook-scripts/将会防止检入拼写(大小写)冲突文件。

5.12.2. 修复文件改名

有时候你的IDE会因为执行反射操作,改名文件,当然它不能告诉Subversion。如果你尝试提交修改,Subversion会发现丢失了老文件,新增了未版本控制的新文件。你可以简单的增加新文件,但是你将丢失历史记录,因为Subversion不知道这些文件的关系。

更好的方法是通知Subversion这实际上是改名,你可以在提交检查修改对话框中做此操作。简单选择老文件(丢失的)和新文件(未版本控制的),使用右键菜单 修复移动设置这两个文件是改名关系。

5.13. 撤消更改

如果你想要撤消一个文件自上次更新后的所有的变更,你需要选择该文件, 右击弹出快捷菜单,然后选择TortoiseSVN Revert命令,将会弹出一个显示这个你已经变更并能恢复的文件。选择那些你想要恢复的然后按OK.

图 5.25. 恢复对话框

恢复对话框

在这一对话框中,纵列和在 检查修改对话框中的纵列同样是可以定制的。更多细节请阅读第 5.7.3 节 “本地与远程状态”

[提示] 取消已经提交的改变
Revert仅能撤消你本地的变更。他能撤消已经提交的的变更。如果你想撤消所有的包括已经提交到一个特定版本的变更,请阅读 第 5.8 节 “版本日志对话框” 获得更多信息。

5.14. 清除

也许由于服务器问题,一个Subversion指令不能成功地完成,你的工作副本因此被滞留在一个不一致的状态。 那样的话,你需要在该目录上使用TortoiseSVN Cleanup命令。在工作副本的全局使用它是一个好主意。

Cleanup 有另外的一个有用的副作用。如果一个文件日期变化了但是它的内容没变,Subversion除了采用byte-by-byte将该文件和原副本进行对照,不能分清它是否真的变更。 如果你有很多这种状态下的文件,将会使获得状态非常慢,还会导致许多会话响应变慢。在你的工作副本上执行一个 Cleanup(清除)命令将会修正这些 " 坏掉的 " 时间戳并全速核对他们的状态。

[提示] 提交时间戳
Subversion的一些早期发布中存在一个bug,当你使用Use commit timestamps检查选项check out(检出)的时候会造成时间戳混乱。使用Cleanup命令加速这些工作副本更新。

5.15. 项目设置

图 5.26. 资源管理器属性页,Subversion 页面

资源管理器属性页,Subversion 页面

有时你可能想得到关于一个文件/目录的更多的细节信息而不仅是一个覆盖的标志。 你能得到Subversion的属性对话框中浏览到的所有信息。只需选择指定文件或目录,然后在文件菜单中选择Windows Menu properties(注意:这是浏览器提供的标准属性菜单,而不是TortoiseSVN 子菜单的其中之一)。在TortoiseSVN 属性对话框中已经为在Subversion控制下的文件/目录增加新的属性页。在这里你能看到所有的关于选择文件/目录的相关信息。

5.15.1. Subversion 属性

图 5.27. Subversion 属性页

Subversion 属性页

你可以在 Windows 属性对话框读写 Subversion 属性。也可以从TortoiseSVN 属性,或者 上下文菜单 属性,来读写 Subversion 属性。

从版本库里删除数据的唯一方法就是使用svnadmin这个Subversion命令行工具。具体如何实现请参考Subversion手册

图 5.28. 增加属性

增加属性

为了增加新属性,先单击增加...,从组合框中选择需要的属性名称,或者输入你自定义的名称,然后在下面的编辑框内输入取值。有多个取值的属性,例如忽略列表,肯呢个输入多行。单极确认将属性增加到属性列表。

如果你想一次性设置许多文件的属性,在资源管理器中选择文件/文件夹,然后选择上下文菜单 属性

如果你想设置当前文件夹内的全部文件和文件夹,选中递归检查框。

一些属性,例如svn:needs-lock只能用于文件,所以它们在文件夹的属性下拉列表内不会出现。你仍旧可以递归的设置目录树中所有文件的属性,但是需要你自己输入属性名称。

如果你想编辑一个已有属性,在已有属性列表中选择它,然后单击编辑...即可。

如果你想删除已有属性,在已有属性列表中选择它,然后单击删除即可。

属性svn:externals可以用来下载位于同一版本库或不同版本库的其它工程。阅读第 5.2.4 节 “引用的工程”以获得更多信息。


火龙果软件/UML软件工程组织致力于提高您的软件工程实践能力,我们不断地吸取业界的宝贵经验,向您提供经过数百家企业验证的有效的工程技术实践经验,同时关注最新的理论进展,帮助您“领跑您所在行业的软件世界”。
资源网站: UML软件工程组织