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

TortoiseSVN可以处理文件的二进制属性。使用保存...到文件读取二进制属性值。使用十六进制编辑器或其它适当的工具创建文件,然后用从文件加载...设置二进制值为此文件的内容。

尽管二进制文件不经常使用,它们在一些程序中是有用的。举例来说,如果你存储了巨大的图形文件,或者用程序加载的文件巨大,你可能想将缩略图作为属性存储,于是你可以快速的预览。

[重要] 提交属性
Subversion 属性是受版本控制的。在你改变或增加属性后必须提交。
[提示] 属性冲突
如果因为其他用户已经提交了同样的属性,提交时出现冲突,Subversion 会产生一个 .prej 文件。在你解决冲突后,请删除此文件。
[提示] 自动属性设置
你可以设置当文件和文件夹加入版本库时,自动设置属性。阅读第 5.27 节 “TortoiseSVN的设置”以获得更多信息。

5.15.2. TortoiseSVN 属性

TortoiseSVN 有自己专用的几个属性,它们都有tsvn:前缀。

  • tsvn:logminsize设置提交日志的最小长度。如果你输入的日志短于预设值,提交会被禁止。这个属性对于提醒你为每次提交提供一个适当的描述信息非常有用。如果不设置这个属性,或者设置为0,那么就允许空提交信息。

    tsvn:lockmsgminsize设置锁定日志的最小长度。如果你输入的日志短于预设值,加锁会被禁止。这个属性对于提醒你为每次加锁提供一个适当的描述信息非常有用。如果不设置这个属性,或者设置为0,那么就允许空加锁信息。

  • tsvn:logwidthmarker用在要求日志信息被格式化为在最大宽度(典型是80字符)处换行非常有用。设置此属性为大于0的值会在日志消息对话框中做两件事:放置一个标记指示最大宽度,和禁止自动换行,于是你可以看到输入的信息是否太长。注意:这个特性仅在你选择的消息使用固定宽度字体时才能正确工作。
  • tsvn:logtemplate在需要定义日志消息格式化规则的工程中使用。在你开始提交时,这个属性的多行消息会被插入日志消息编辑框。你可以编辑它以便包含需要的信息。注意:如果你使用了tsvn:logminsize属性,请确认这个长度大于模版的长度,不然就会失去其保护作用。
  • 在提交对话框,你可以复制修改的文件列表,包含每个文件的状态(增加,修改等)。tsvn:logfilelistenglish定义了文件状态用英文插入,还是用本地消息插入。此属性的默认值是
  • TortoiseSVN可以使用OpenOffice和Mozilla使用的拼写检查模块。如果你安装了这些模块,那么这个属性将检测使用哪个拼写检查模块。也就是,你的工程的日志信息用的语言。tsvn:projectlanguage设置拼写检查引擎应该使用什么语言模块来检查日志信息。你可以在这个叶面找到你的语言的取值:MSDN: 语言标示符

    你可以用十进制输入取值,如果用0x前缀的话,也可以用十六进制。例如英语(美国英语)可以输入0x0409或者1033

一些 tsvn: 属性需要 true/false 值。它也理解 yes true 的同义词,no false的同义词。

[重要] 设置文件夹的 tsvn: 属性
属性tsvn:只能在文件夹设置。当你提交文件或文件夹时,这些属性从文件夹读取。如果没有发现这些属性,TortoiseSVN会向上级目录搜索,直到未版本控制的文件夹,或到达根目录(例如 C:\) 。如果你确认每个用户都是从同一个目录检出,例如 trunk/,而不是其它子目录,那么只在 trunk/设置属性就足够了。如果你不能确定,那么应当递归的设置每个子目录。深层的设置覆盖高层的设置 (靠近 trunk/)。

对于tsvn:属性,你只能对于所有子目录使用递归检查框设置属性,不能设置文件的属性。

TortoiseSVN可以与一些问题跟踪工具集成。它使用bugtraq:开始的属性。阅读第 5.25 节 “与BUG跟踪系统/问题跟踪集成”以便获得更多信息。

它也与一些基于WEB的版本库浏览器集成。阅读第 5.26 节 “与基于WEB的版本库浏览器集成”以获得更多信息。

5.16. 分支/标记

版本控制系统的一个特性是能够把各种修改分离出来放在开发品的一个分割线上。这条线被称为分支。分支经常被用来试验新的特性,而不会对开发有编译错误的干扰。当新的特性足够稳定之后,开发品的分支就可以混合回主分支里(主干线).

版本控制系统的另一个特性是能够标记特殊的版本(例如某个发布版本),所以你可以在任何时候重新建立一个特定的构件和环境。这个过程被称作标记

Subversion 没有用于建立分支和标记的特殊命令,但是使用所谓的便宜拷贝来代替。便宜拷贝类似于Unix里的硬连接,它意思是代替一个版本库里的完整的拷贝,创建一个内部的连接,指向一个具体的版本树。结果分支和标记就迅速被创建,并且没有在版本库里占据任何额外的空间。

5.16.1. 创建一个分支或标记

如果你用推荐的目录结构导入了一个工程,那么创建分支或标记就非常简单:

图 5.29. 分支/标记对话框

分支/标记对话框

在你当前的工作拷贝中给你你想要拷贝的分支或标记选择一个目录,然后选择命令TortoiseSVN 分支/标记...

默认的目标URL将会是你当前工作拷贝所处的源URL。你必须给你的分支/标记编辑一个新路径。来取代

http://svn.collab.net/repos/ProjectName/trunk

你可以使用这样的设置

http://svn.collab.net/repos/ProjectName/tags/Release_1.10

如果你忘记了你上一次使用的命名约定,可以用鼠标右键打开版本库浏览器来察看已经存在的版本库结构。

现在你必须选择要拷贝的源位置。在这里你有三个设置选项:

版本库中的最新版本
新分支直接从仓库中的最新版本里拷贝出来。不需要从你的工作副本中传输任何数据,这个分支的建立是非常快的。
在版本库中指定具体的版本
在仓库中直接拷贝建立一个新分支同时你也可以选择一个旧版本。假如在你上周发布了项目时忘记了做标记,这将非常有用。如果你记不起来版本号,通过点击鼠标右键来显示版本日志,同时从这里选取版本号。和上次一样不需要从你的工作副本中传输任何数据,这个分支建立起来是非常快的。
工作副本
新的分支是一个完全等同于你的本地工作副本的一个拷贝。如果你更新了一些文件到你的工作副本的某个旧版本里,或者你在本地做出了修改,这些改变将准确无误的进入拷贝中。自然而然地这种综合的标记会包含正在从工作副本传输到版本库的数据,如果这些数据还不存在的话。

如果你想把你的工作副本自动切换到最新创建的分支,使用转换工作拷贝至新分支/标记 选择框.但是如果你打算这么做,首先要确认你的工作副本没有被修改。如果有修改的话,当你转换后这些修改将会混合进你的工作副本分支里。

按下确认提交新副本到版本库中。别忘了提供一条日志信息。需要注意的是这个副本是在版本库内部创建的。

需要注意建立一个分支或标记不会影响你的工作副本。即使你拷贝了你的工作副本,这些修改也会提交到新分支里,而不是到主干里,所以你的工作拷贝可能仍然标记为已修改状态。

5.16.2. 检出或者切换

...这是个小问题。当你想从预期的分支检出所有数据到你的工作副本目录时TortoiseSVN 切换... 仅仅传输已经被修改的数据到你的工作副本中。这样能减轻你的网络负担,也能减少你的耐心。

为了能够使用你最新产生的副本你有采用下面几种方法。你可以:

  • TortoiseSVN 检出一个最新的项目在一个空目录下。你可以在你的本地磁盘上的任意位置进行检出操作,同时你可以从版本库中按照你的意愿建立出任意数量的副本。
  • 在版本库中从你当前的工作副本切换到最新建立的副本。再一次选择你的项目所处的顶级文件夹然后在菜单中使用TortoiseSVN 切换...

    在接下来的对话框中蠕蠕你刚才建立的分支的URL。选择最新版本单选按钮然后确认。你的工作副本就切换到了最新的分支/标记。

    切换操作起来就象更新,因为它没有丢弃你在本地做的修改。在工作副本里当你进行切换的时候任何没有提交过的修改都会被混合。如果你不想看到这样的结果,那么你可以有两种选择,要么在切换前提交修改,要么把工作副本恢复到一个已经提交过的版本(比如最新版本)。

图 5.30. 切换对话框

切换对话框

尽管Subversion本身不区分标记和分支,它们的使用方法还是有些不同。

  • 在某个特殊的阶段标记被用来建立一个项目的静态映像。同样地标记和分支应该被独特地应用于开发品。这就是我们首选推荐 /trunk /branches /tags这样的版本库结构的原因。使用标记的版本并不是一个好想法,因为你的本地文件没有写保护,你这样做容易犯错误。不管怎样如果你试着提交(修改)到一个包含 /标记/的版本库路径下,TortoiseSVN 会给你警告。
  • 如果你想要在一个已经标记的发布版上做更多的修改。正确的操作方法是先从标记处建立一个新分支然后提交这个分支。在这个分支的基础上进行修改后再从这个新分支上建立一个新标记,例如 Version_1.0.1
  • 如果你修改了一个从分支建立的工作副本然后又提交了这个副本,那么所有的修改会转到一个新分支里而不是 主干。仅仅是存储了修改的数据。其余的数据还是便宜拷贝。

5.17. 正在合并

分支用来维护独立的开发支线,在一些阶段,你可能需要将分支上的修改合并到最新版本,或者将最新版本的修改合并到分支。

在你开始使用之前,请先理解分支与合并是怎么工作的,因为它很复杂。强烈建议你阅读Subversion Book分支与合并章节,它给出了全面的描述,和许多使用举例。

十分关键之处是Subversion的合并与差异关系很密切。合并工作的基础是在版本库对两个分支产生一个差异列表,然后对你的工作副本应用这些差异。举例说明,如果你需要合并版本N的修改,那么你要与版本N-1比较。新手经常问“为什么我需要从开始版本减一”。考虑底层的差异处理,这个问题就会清楚了。为了容易操作,当你使用显示日志选择一个版本范围合并的时候,TortoiseSVN 自动为你做这个调整。

通常来说,在没有修改的工作副本上执行合并是一个好想法。如果你在工作副本上做了修改,请先提交。如果合并没有按照你的想法执行,你可能需要撤销这些修改,命令恢复 会丢弃包含你执行合并之前的所有修改。

这里有两个处理稍微不同的用例,如下所述。

5.17.1. 合并指定版本范围

这个方法覆盖了你已经在分支(或者最新版本)上做出了一个或多个修改,并且你想将这些修改应用到不同分支的情况。

图 5.31. 合并对话框

合并对话框

为了合并版本,你需要进入接收修改的分支的工作副本,经常是trunk。选择右键菜单TortoiseSVN 合并...

  1. 从:域输入文件夹在分支或标记中的完整URL,它包含了你想应用到工作副本的修改。你也可以点击...浏览版本库,找到渴望的分支。如果你以前已经从这个分支合并过,可以直接从包含历史的下拉列表选择以前使用的URL。
  2. 因为你要将同一分支的版本范围合并到工作副本,所以要确保使用 "从:" URL 检查框选中。
  3. 从版本域输入开始版本号。它是在你要执行合并的修改之前的版本号。切记为了合并,Subversion将会创建一个差异,所以开始点务必准确。 例如,你的日志象这样:

    版本 注释 39. Working on MyBranch 38. Working on trunk 37. Working on MyBranch 36. Create branch MyBranch 35. Working on trunk 34. Working on trunk ...

    如果你要将 MyBranch 的修改合并到 trunk,应该选择36作为开始版本,而不是象你想的是37。如果你选择37作为开始点,那么差异引擎将会比较结束点与版本37比较,这就丢失了版本37做的修改。如果这听起来很复杂,不要担心,在TortoiseSVN中有更简单的方法 ...

    选择版本范围最简单的方法是,点击显示日志,列出最近的修改和日志。如果你要合并单个版本的修改,直接选取那个版本。如果你要合并多个版本,就选择范围(使用通常的Shift-键)。点击确认,就会为你填写合并对话框的全部域,开始版本结束版本

    当选择了检查框 使用 "开始:" URL,只有按钮显示日志可用。这是因为显示日志对话框设置了全部开始:结束:版本。所以你只用上面说的多项选择方法即可。

    如果你已经从这个分支合并了一些修改,希望你在提交日志中注明最后一个合并的版本号。这时,你可以在工作服本上使用显示日志对话框跟踪日志。使用最后合并的版本号作为本次合并的开始版本。例如,你已经合并了版本37到39,那么本次合并你应该从版本39开始。

  4. 如果你没有使用显示日志对话框显示版本范围,那么你需要手工设置结束版本。在范围中输入你想合并的最后一个版本号。这经常是最新版本,尽管它不必是 - 你只想合并单个版本。

如果其他用户可能提交,那么要小心使用最新版本。如果有人在你最近更新之后提交了,它指代的版本可能就不是你想的那样了。 点击合并按钮完成合并。

现在合并结束。察看合并,看看它是否如预期那样工作,是个好想法。合并通常很复杂,如果分支与最新版本差别很大,合并经常会出现冲突。

当你已经测试了修改,准备提交时,日志信息应当总是包含这次合并的版本信息。如果你以后需要执行合并,就需要知道已经合并了什么,因为你不想多次合并同一修改。不幸的是,合并信息不会存储在Subversion版本库中。阅读Subversion Book中的手工跟踪合并以获得更多信息。

分支管理很重要。如果你要保持这个分支与最新版本同步,你应当经常合并,这样分支和最新版本的差别就不会太大。当然,你仍旧应该遵循上面的说明,避免重复合并修改。

[重要] 重要
Subversion不能进行文件与文件夹的合并,反之亦然 - 只能文件夹对文件夹,文件对文件。如果选择了文件,打开合并对话框,那么你必须在对话框中给出文件的路径。如果你选择了文件夹,打开合并对话框,那么你必须给出文件夹的对话框。

5.17.2. 合并两个不同的目录树

这个用例覆盖了这种情况,当你象Subversion手册里讨论的那样,创建了一个新特性分支。所有最新版本的修改都要每周一次合并到新特性分支,等新特性完成后,你向将它合并到最新版本。因为你已经保持了新特性分支和最新版本同步,所以除了你在分支做的修改,其它部分在分支和最新版本应该是相同的。于是在这种情况下,你应当用比较分支和最新版本的方法来合并。

为了将新特性从分支合并到最新版本,你需要进入最新版本的工作副本。在右键菜单选择 TortoiseSVN 合并...

  1. 开始:域输入trunk文件夹的全路径。这听起来好象是错误的,但是切记 trunk 是你想增加分支修改的开始点。也可以点击 ...浏览版本库。
  2. 因为你在比较两个不同的树,确认没有选择使用 "开始:" 路径检查框。
  3. 结束:域输入关注的分支中文件夹的全路径。
  4. 开始版本结束版本 域,输入两个树被同步的最后一个版本号。如果你确信没有其他人提交,两个都可是输入 HEAD。如果在同步时可能有人提交的话,使用清楚的版本号以便面丢失最新提交。

    你也可以使用显示日志选择版本。注意这种情况下,你不能选择版本范围,所以此时你选择的版本会实际出现在版本域。

  5. 点击合并按钮完成合并。

这种情况下,因为新特性已经集成到最新版本,你不再需要这个新特性分支。新特性分支变成多余的,如果需要可以从版本库删除它。

5.17.3. 预览合并结果

如果你不信任合并操作,可以在允许它修改你的工作副本之前预览效果。有三个额外的按钮可以帮着你预览。

统一差异创建差异文件(切记合并基于差异),显示你的工作目录哪些行将要被修改。因为这是统一差异(补丁)文件,所以离开上下文,它经常很难读。但是对于小的修改,由于它将所有修改在一起显示,因此很有用。

差异显示修改文件列表。双击任一文件启动差异察看器。不像统一差异,它显示具有前后关系的详细修改信息。象统一差异那样,你看到的是开始版本: 结束版本:之间的差异。它不显示应用此改变之后,你的工作版本如何改变。

演习运行执行合并操作,但是根本 修改工作副本。它显示在真实的合并中要修改的文件列表,还告诉你哪里会出现冲突。

5.17.4. 忽略祖先

大部分时候,你要合并文件的历史,于是相对于公共祖先合并。有时你需要合并或许是有关系的文件,但是不在你的版本库中。例如,你已经将一个第三方库的版本1和2导入到两个单独目录。尽管它们逻辑相关,因为Subversion只看到你导入的文件,所以它不知道这些关系。如果你试图合并这两个树的修改,将会看但完全的删除和增加。让Subversion只使用路径差异,不关心历史差异,选中忽略祖先检查框。你可以在 Subversion 手册的关心或忽略祖先中阅读此主题的更多信息。

5.18. 锁

使用之前在第 2.2.3 节 “拷贝-修改-合并 方案”中描述的“复制-修改-合并” 的方法,Subversion通常不需要锁就可以很好的工作。但是,在某些情况下你可能需要制定某种锁定策略。

  • 例如,你使用图形文件等“不能合并”的文件。如果两个人修改同一个这样的文件,合并是不可能的,所以你丢失其中一个的修改。
  • 你的公司过去经常使用VCS锁定,这是个管理决定,“锁定是最好的”。

首先,你需要确保你的Subversion服务器更新到至少1.2版本。早期的版本不支持锁定。如果你使用 file:///进行访问,那么当然只要更新你的客户端就可以了。

5.18.1. 锁定在Subverion中是如何工作的

默认情况下,所有的东西都没有锁定,只要有提交权限的人都可以在任何时候提交任何的文件。其他人会定时更新他们的工作复本,在库中的改变的东西都会与本地合并。

如果你对一个文件 取得锁定,那么只有你可以提交这个文件。其他用户的提交都会被拒绝,直到你释放了这个锁。一个被锁定的文件不能在库中进行任何形式的合并。所以它不能除锁的拥用者之外的人删除或更名。

但是,其他用户不必知道你已经增加了锁定,除非他们定期地检查锁定的状态。这其实没什么意义,因为他们发现提交失败的时候就可以知道锁定了。为了更容易管理锁,而设置了一个新的Subversion属性 svn:needs-lock。当一个文件的这个属性被设置(成任意值)的时候,每当该文件检出或更新时,本地的复本都被设成只读,除非该工作复本就是拥有锁的那个用户的。这么做是为了能警告你,你不应该修改这个文件,除非你申请到了锁定。受控只读的文件在TortoiseSVN中用一个特殊的图标来表示你需要在编辑前取得锁定。

锁除了按所有者记录外,还在工作复本中记录。如果你有多个工作复本(在家,在单位),那么在这些工作复本中,只允许对其中一份拥有锁。

如果你的合作者之一请求一个锁,但却外出旅游去了,你怎么办?Subversion提供了一种强制锁。释放别人拥有的锁被称为破坏锁定,强制获得别人拥有的锁称为窃取锁定。当然,如果你想要与你的合作者保持良好的关系,轻易不要这么做。

锁在库中进行记录,一个锁定令牌建立在你的本地工作复本中。如果有矛盾,比如某人破坏了锁下,那么本地的锁定令牌将不可用。库中的记录将是最权威的参考。

5.18.2. 取得锁定

选择工作复本中你想要获取锁定的文件,然后选择命令TortoiseSVN 取得锁定....

图 5.32. 锁定对话框

锁定对话框

出现一个对话框,允许你输入注释,这样别人可以知道你为什么锁定这个文件。注释是可选的,并且只用于基于Svnserve的库。当(且当)你需要窃取别人的锁的时候,勾选偷取此锁定复选框,然后点击确定

如果你选择一个文件夹,使用TortoiseSVN 获取锁定...锁定对话框将显示所有子文件夹中的所有文件 。如果你真的要锁定整个目录,就这么做,但如果你这么做,可能会很不受你的合作者的欢迎。小心使用...

5.18.3. 释放锁定

为了确保你不会忘记释放锁,你不需要做别的事,在提交对话框中,总是会显示锁定的文件,并总是默认被选中。如果你继续提交,选中的文件中的锁就被移除了,就算你从没有修改过。如果你不希望释放某文件的锁,你可以取消选中它(如果你没有修改过)。如果你希望保持一个修改过的文件的锁,你需要在提交之前选中保持锁定复选框。

要手动释放锁定,选中工作复本中要释放的文件,选择命令TortoiseSVN 释放锁定。不需要输入什么 TortoiseSVN会联系版本库并释放锁。你可以对一个文件夹来使用这个命令释放其中的所有锁定项。

5.18.4. 检查锁定状态

图 5.33. 检查修改对话框

检查修改对话框

要查看你和他人所拥有的锁,你可以使用TortoiseSVN 检查更新...命令。本地的锁定令牌会立即显示出来,要查看别人拥用的锁定(或是检查你的锁是否被破坏或窃取)你需要点击检查版本库

从此处的右键菜单中,你可以获取锁或是释放锁,也可以破坏或是窃取别人的锁。

[小心] 避免破坏和窃取锁定
如果你在破坏或是窃取某人的锁的时候没有告诉他,你可能会丢掉工作。如果你正在写一个不可合并的文件类型,并且你窃取了某人的锁,一旦你释放了锁,他们就可以随意检入他们的修改以覆盖你的。Subversion并不会丢弃数据,但你却失去了锁带来的对团队工作的保护。

5.18.5. 让非锁定的文件变成只读

正如上面提到的,最有效的使用锁的方式是对一个文件设置svn:needs-lock属性。参考第 5.15 节 “项目设置”如何设置属性。带有此属性的文件将总被按只读的方式检出和更新(除非你的工作复本拥有锁定)。

作为提醒的方式之一,TortoiseSVN使用一个特殊的图标表示。

如果你管理的策略要求每个文件都必须被锁定,那么你会发现使用Subversion的auto-props功能,在你每次加入新文件的时候,自动设置属性是很方便的。请阅读第 5.27 节 “TortoiseSVN的设置”。

5.18.6. 锁定钩子脚本

当你使用Suversion1.2或更新的版本建立新的版本库的时候,建立了四个钩子模板在版本库中的 hooks目录下。这些钩子模板在取得/释放一个锁定之前和之后会被分别调用。

安装一个 post-lockpost-unlock钩子,在钩子中为锁定和解锁事件发送邮件,是个好主意 。有了这种脚本,你的所有用户都会在一个文件被锁定/解锁的时候被通知。在你的版本库文件夹下,你可以找到一个示例钩子脚本 hooks/post-lock.tmpl

你可能也使用hooks来拒绝破坏或是窃取锁定,或是限制只有管理员可以,或是当一个用户破坏或窃取锁定时通知原来的锁定拥有者。

更多内容请参考 第 4.3 节 “钩子脚本”

5.19. 创建并应用补丁

对开源工程(比如本工程)来说,每个人对仓库都有读访问权,并且任何人都可以对该工程做出修改。那么如何控制这些修改呢?如果任何人都可以提交自己的修改,那么这个工程可能永远都会处于不稳定状态,而且很有可能永远的瘫痪下去。在这种情况下,修改需要以补丁文件的形式先递交到有写访问权限的开发组。开发组可以先对该补丁文件进行审查,然后决定将其提交到仓库里或者是退还给作者。

补丁文件只是简单地用统一的差异描述文件显示出你的工作拷贝和基础版本的不同点。

5.19.1. 创建一个补丁文件

首先你需要做出修改并测试这个修改的内容。然后在父目录上使用TortoiseSVN 创建补丁...代替TortoiseSVN 提交...

图 5.34. 创建补丁的对话框

创建补丁的对话框

现在你可以选择要包含在补丁中的文件了,就像你要做一个完整的提交一样。这样会产生一个单一的文件,该文件包括一份自从最后一次从仓库更新后你对所选择文件做的全部修改的摘要。

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

你可以创建包含对不同文件集合修改的相互独立的补丁。当然如果你创建了一个补丁文件,对于同一份文件的更多修改会创建另外一个补丁文件,第二份补丁文件包含了全部的修改。

你可以用一个自己选择的文件名来保存这个补丁文件,补丁文件可以有任意的扩展名,但是按人一般习惯,人们都是用 .patch或者 .diff作扩展名,你现在已经做好提交你的补丁文件的准备了。

5.19.2. 应用一个补丁文件

当你对你的工作拷贝打补丁的时候,你应当在与创建补丁文件时相同的目录层次上。如果你不能确定在那个目录层次上,就看一下补丁文件的第一行。例如,如果补丁第一个要处理的文件是 doc/source/english/chapter1.xml 并且补丁文件的第一行是 Index: english/chapter1.xml说明你必须要对 english目录应用这个补丁文件。尽管如此,倘若你在正确的工作拷贝上工作,如果你选择了一个错误的目录层次,TSVN会察觉到这个错误,并给出正确的建议。

为了给你的工作拷贝打补丁,你至少需要对代码库的读权限。因为合并程序必须要参考修订版本中其他开发人员做的修改。

从那个目录的上下文菜单,点击TortoiseSVN 应用补丁... 系统会弹出一个打开文件的对话框,让你选择要应用的补丁文件。默认情况下只显示 .patch或者 .diff文件,但是你可以选择"所有文件"。

如果补丁文件以 .patch 或者 .diff 为扩展名的话,你可以选择直接右键点击该补丁文件,选择TortoiseSVN 应用补丁... 在这种情况下,系统会提示你输入工作拷贝的位置。

这两种方法只是提供了做同一件事的不同方式。第一种方法,你先选择工作拷贝,然后浏览补丁文件。第二种方法,你先选择补丁文件,然后浏览工作拷贝。

一旦你选定了补丁文件和工作拷贝的位置,TortoiseMerge就会把布丁文件合并到你的工作拷贝中。系统会弹出一个小窗口列出所有被更改了的文件。依次双击每一个文件,检查所做的改变,然后保存合并后的文件。远程开发者的补丁现在已经应用到了你的工作拷贝上,你需要提交它以使每一个人都可以从代码库访问到这些修改。

远程开发者的补丁现在已经应用到了你的工作拷贝上,你需要提交它以使每一个人都可以从代码库访问到这些修改。

5.20. 谁修改了哪一行?

有时你不仅要知道哪一行做了修改,还要精确地知道谁修改了一个文件中的哪一行。这就是TortoiseSVN追溯...命令,有时候也叫做 评注 命令派上用场的时候了。

对一个文件中的每一行,这个命令列出了作者和该行修改时的版本。

5.20.1. 追溯文件

图 5.35. 评注/追溯对话框

评注/追溯对话框

如果对早期版本的修改不感兴趣,你可以设置从哪个版本开始追溯。如果你想追溯每一个版本,你可以把那个数值设置为1

默认情况下,追溯文件使用TortoiseBlame,这个工具可以高亮显示不同版本从而使阅读更加容易。如果想打印或者编辑追溯文件,复选使用文字编辑器查看追溯信息

一旦你按了 OK 按钮,TortoiseSVN就开始从版本库获取数据创建追溯文件。注意:视修改的文件的多少和你的网络连接情况,可能会花掉几分钟到几十分钟不等。追溯过程完成后,其结果将会写到一个临时文件中,你可以读到这个结果文件。

图 5.36. TortoiseBlame

TortoiseBlame

TortoiseBlame,包含在TortoiseSVN中,使得追溯文件更加容易阅读。当你的鼠标在追溯信息列的某一行上盘旋时,所有和该列具有相同版本号的行都会用一个比较暗的背景色显示。同一作者修改的其他版本的行会用一个亮一些的背景色显示。如果你的显示设置为256色模式,那么颜色显示的可能不会很清楚。

如果在某一行上左击,具有同一版本号的所有行都会高亮显示,同一作者的其他版本的行会用一个更亮的颜色高亮显示。这个高亮具有粘性,也就是说允许你移动鼠标但原先高亮的地方仍然保持高亮。再次点击该版本将关闭高亮显示。

只要鼠标逗留在追溯信息列,版本注释(日志信息)就会作为提示出现。如果你想复制此版本的日志信息,使用在追溯信息列显示的右键菜单。

你可以在追溯报告里用编辑查找...来搜索想要的内容。它允许你搜索版本号,作者还有文件的内容。这个搜索不包含日志信息-你可以在日志对话框里搜索日志信息。

你也可以使用 编辑转到行 ... 来跳到指定行。

5.20.2. 追溯不同点

追溯报告的一个局限性就是它仅仅象显示一个特殊版本一样显示文件,并显示出修改每一行的最后一个人。有时候你想知道谁做了什么修改。你所需要的就是把差异和追溯报告结合起来。

在版本日志对话框里包含了以下几个选项支持你做这样的操作。

追溯版本
在顶部窗口,选择两个版本,然后选择上下文菜单追溯版本。它将取出两个版本的追溯数据,然后使用差异察看器比较这两个追溯文件。
追溯不同点
在上面的面板里选择一个版本,然后在下面的面板选择一个文件然后选择上下文菜单追溯差异。这会为选定版本及其上一个版本获取追溯数据,然后用差异阅读器比较两份追溯文件。
与工作拷贝比较并追溯
为一个单一文件显示日志,在上面的面板选择一个版本,然后选择上下文菜单与工作拷贝比较并追溯。这会为文件的选择版本和工作拷贝获取追溯数据,然后使用差异阅读器比较两份追溯文件。

5.21. 版本库浏览器

有时候我们需要在版本库中直接进行操作,而不是在工作拷贝中。这就是我们的版本库浏览器可以做到的。正如资源管理器和能浏览你的工作拷贝一样,版本库浏览器允许你浏览版本库的结构和状态。

图 5.37. 版本库浏览器

版本库浏览器

在版本库浏览器中你可以执行比如拷贝,转移,重命名、、、直接操作在版本库上。

在版本库浏览器窗口的顶端输入版本库的URL地址和你要浏览的版本号。浏览一个历史版本对一些操作比如覆盖以前删除的文件是很有用的。用右键菜单拷贝到...输入你要覆盖的被删除文件的工作地址就能做到。

主浏览窗和其他任意目录树浏览器一样。你可以点击顶部的列表头来调整排列顺序。如果你右击文件 置前转换按数字顺序排序可以实现。这个要比无格式二进制处理数字排序要智能多了,对在队列中获得版本标签也很有用。这种默认状态在设置对话框中可以设置。

如果你选择两个版本,你可以以单一差异文件显示修改,或者可以使用自带的比较工具清晰地显示整个列表的差异。这个对比较两个日志信息的修改很适用。

如果你选择两个拥有相同历史的标签(特别是/主干/),你可以使用右键菜单显示日志...来查看

你也可以在版本库浏览器中使用拖拽的操作。如果你把一个文件夹从资源管理器中拖拽到版本库浏览器中,那就实现该文件夹的导入功能。有一点要注意,在导入多个文件时,必须分开一个一个地拖进去。

如果要在版本库浏览器中移动一个文件,只用左键拖到它要去的位置。如果你更愿意去拷贝该文件的话,使用这个按住左键拖 。操作就像在资源管理器中一样,拷贝时指针“” 来标记。

如果你要拷贝/移动一个文件或文件夹到一个新的位置并重命名,你可以右键拖 或者 按住右键拖这个文件,而不用左键拖。这样,就会显示对话框来为该文件或文件夹重命名。

无论什么时候对版本库的任意操作,都要求加入它的操作日志。这为你操作失误提供了返回的机会。

有时候当你访问一个路径时,会跳出一个错误信息。也许是不可用的URL,也许是你没有访问权限,或者其他的一些原因,如果你要把这些信息发送出去,只用点击它然后右键复制错误信息到剪贴板,或者简单地用CTRL+C

5.22. 版本分支图

图 5.38. 一个版本分支

一个版本分支

有时候,我们需要知道从哪开始有了分支和标签,同时想知道这条支路是单独的分支还是树型结构。如果需要你可以使用TortoiseSVN版本分支图...

这个版本历史分析图能够显示分支/标签从什么地方开始创建,以及什么时候删除。

[重要] 重要
要实现版本分支图,TortoiseSVN必须从版本库中获取所有的日志信息。一个有上千版本号的版本库会需要几分钟的时间,这个主要有服务器速度,网络带宽等因素决定。如果你使用的是Apache的方式而且版本号超过300,000的话估计要等上比较长的时间了。

版本分支图将显示以下内容:

增加文件/文件夹
已增加或通过拷贝生成的文件/文件夹以圆圈的方式标记。
已删除文件/文件夹
已删除文件,比如说一个不在需要的分支,将显示octagon(rectangle with corners cut off)。
分支最新版本
当一个分支(或者主干或者标签)从最新的节点开始以来有了新的更改,将有一个插件显示出来。也就是说,任意分支的最新版本都会显示在分支图上。
一般的文件/文件夹
其他一般的文件用plain rectangle标示。

默认的分支信息只会显示那些有增加或删除文件的节点。要显示一个项目的所有版本将会产生一个庞大的毫无价值的版本图。如果你呀看到所有的版本,在视图工具栏里可以找到实现该功能的选项。

这也有一个功能来排列版本分支旁支。它根据日志来对分支排序。如果分支从拷贝创建后都没有修改过一般被认为是一个标签而独立保存起来。每个分支(创建后有过修改的)会有它们自己的列,所以你可以看到分支延展到什么情况了。

任何时候只要鼠标在版本框上滑过,都会显示该版本的日期、作者和备注信息。

选择两个版本(用ctrl+左击),你可以在右键菜单下查看这两个版本的差异。你可以在分支的起始点查看差异,但一般你会在一个分支的结束点来查看,比如,在最新版本。

你可以用查看单一差异文件的方式来查看差异,它在单一的文件中显示差异。如果你选右键菜单比较版本所有修改过的文件都会呈现在列表中。双击一个文件名可以返回文件版本号和他们差异。

如果右击一个版本你可以使用右键菜单显示日志 来查看它的历史。

[小心] 小心
因为Subversion不能支持提供所有请求的信息,在有大量请求信息时,有时它能提供强大的返回信息。但无论如何,主干都会产生有用的输出。

5.23. 导出一个Subversion工作拷贝

有时候你需要拷贝出一个没有.svn的工作目录树,例如,创建一份源代码的压缩文件,或者导出一份用作WEB服务器。不用像一般的先把所有源文件拷贝出来然后将所有.svn文件删除。TortoiseSVN提供这样的功能TortoiseSVN导出...。如果你要用这个功能操作拥有一份工作拷贝,将会在要求你保存一份干净的文件。一般,要导出被版本控制了的文件,但你可以使用同时导出未受版本控制的文件来将版本库中没有但在你的本地拷贝中存在的文件导出来。另外可以使用svn:externals来忽略请求。

另外一个导出的方法是 右键拖工作拷贝到另外的保存位置,然后选择右键菜单SVN导出到这或者右键菜单SVN 全导出到这。后者可以把未受控制的文件也导出。

如果目标目录包含了和你导出的名称相同的目录,你需要使用此选项重写已经存在的内容,或者使用自动生成的名称,例如目标 (1)

当然,你也可以直接从版本库导出。使用版本库浏览器浏览有关子树,然后使用上下文菜单导出

5.24. 重新定位工作拷贝

图 5.39. 重定位对话框

重定位对话框

如果你的版本库因为某些原因而重定位了(IP/URL).也许你不能进行操作,不能提交,不能从新的定位检出拷贝,也不能将修改的数据提交到新位置的版本库中,TortoiseSVN重新定位也许正是你需要的。它的做法很简单: 查找所有 .svn 文件的接口然后把URL值改为新的版本库地址。

[警告] 警告
这是一个极少使用的操作.重定位只能 在版本库路径更改时使用。可能的原因是:
  • 服务器的IP地址已更改。
  • 协议已更改(比如从http://改为 https://)。
  • 版本库在服务器的路径已更改。

换种说法,如果你要重定位,只有当你的工作拷贝仍然还在同一个版本库中定位,但版本库本身已经没有了。

以下情况不支持:

  • 你要移到一个完全不同的版本库。这种情况下,你必须从新的版本库里执行一次干净的检出。
  • 你要在同一个版本库中切换一个分支或目录。这么做你可以用TortoiseSVN切换....

如果你使用以上任意一种重定位方式,它将破坏你的工作拷贝,在你更新、提交等操作时会提示一些令人费解的错误信息。一旦发生这种情况,唯一的办法就是检出最新版本。

5.25. 与BUG跟踪系统/问题跟踪集成

在软件开发中,修改依赖于一个bug或问题编号是很常见的。bug跟踪系统的用户(问题跟踪者)喜欢在问题跟踪中将Subversion的修改与一个指定编号联系起来。因此很多问题跟踪者提供了一个预提交钩子脚本,分析日志,查找提交相关的bug编号。这稍微有些不可靠,因为它依赖于用户写完全的日志,预提交钩子才能正确分析。

TortoiseSVN可以在两个方面帮助用户:

  1. 当用户输入日志信息时,一个定义良好,包含问题编号,与此提交相关的的行,会自动增加。这样减少了用户输入的问题编号不能比bug跟踪系统正确分析的风险。

    或者TortoiseSVN高亮显示日志消息中能被问题跟踪者识别的部分。这样,用户就知道日志消息能被正确解析。

  2. 当用户浏览日志信息,TortoiseSVN在日志信息中创建指向每个bug标示的链接,它可以用浏览器打开。

你可以在TortoiseSVN中集成bug跟踪工具。为了使用这个特性,你要定义一些以bugtraq:开始的属性,它们只能在文件夹上设置 (第 5.15 节 “项目设置”)。

有两个方法集成TortoiseSVN 和问题跟踪。一个基于简单字符串,另一个基于正则表达式。它们的用法是:

bugtraq:url
将这个属性设置为你的bug跟踪工具的地址。它必须编码并且包含%BUGID%%BUGID%用你输入的问题编号替换。它允许TortoiseSVN 在日志对话框中显示链接,于是你可以在察看版本日志时直接进入bug跟踪工具。你可以不提供这个属性,但是这样TortoiseSVN就不能显示链接了,只能显示问题编号。例如TortoiseSVN 使用http://issues.tortoisesvn.net/?do=details&id=%BUGID%
bugtraq:warnifnoissue
如果你想TortoiseSVN给出空问题编号的警告,就设置为 。有效取值是 真/假如果没有定义,那么假定为

在最简单的方法里,TortoiseSVN为用户显示了一个单独的bug ID输入字段,然后后面预计会追加一个用户输入日志信息的行。

bugtraq:message
这个属性将问题追踪系统激活为输入框模式。 如果设置了这个属性,在拟提交时,TortoiseSVN会提示你输入问题单号码。它通常会在日志信息后面添加一行。必须包含%BUGID%,在提交时会被替换为问题单号。这确保了你的提交日志包含了问题单号,保证了单号可以被问题追踪工具解析,从而与提交关联。例如TortoiseSVN项目使用Issue : %BUGID%,但是这依赖于你的工具。
bugtraq:append
这个属性定义了bug-ID。是追加到(true)日志信息的末尾,还是插入到(false)日志信息的开始。有效的值包括true/false如果没有定义,默认是true ,所以现存的项目不会被打破。
bugtraq:label
是TortoiseSVN的提交对话框中用来输入问题单号码的输入项,如果没有设置,将会显示Bug-ID / Issue-Nr:,要记住窗口不会为适应标签而改变大小,所以请保持标签的小于20-25个字符。
bugtraq:number
如果设置为true,问题单号文本框只能输入数字,一个例外是逗号,所以你可以使用逗号分割输入的多个号码。合法的值包括true/false 如果没有设置,默认是true

在使用正则表达式的方法中,TortoiseSVN不会显示一个单独的输入框,而是标记用户输入的日志信息,认为这些标志可以被问题追踪工具识别。这是在用户编写日志信息的时候完成的,这也意味着bug ID可以出现在日志信息的任何位置!这种方法非常灵活,也是TortoiseSVN项目本身使用的方法。

如果同时设置了bugtraq:messagebugtraq:logregex属性,日志正则表达式会优先使用。

[提示] 提示
即使你的问题追踪工具没有pre-commit钩子来解析日志信息,你仍然可以使用这个功能将日志信息中的问题单转化为链接!

一些 tsvn: 属性需要 true/false 值。它也理解 yestrue 的同义词,nofalse的同义词。

[重要] 设置文件夹的属性
为了系统能够工作,这个属性必须设置到文件夹上。当你提交文件或文件夹,属性会从文件夹上读取。如果没有发现属性,TortoiseSVN会向上级查找,直到发现一个没有版本化的文件夹或根目录(例如C:\)才会停止,如果你能够确定每个用户只从trunk/检出,而不是其他目录,你可以直接在trunk/上使用这个属性,而不必每个子目录都设置。如果你不能确定,你必须为每个子目录设置这些属性。一个深级目录的设置会覆盖高级目录(离trunk/更近的)。

对于tsvn:属性,你只能对于所有子目录使用递归检查框设置属性,不能设置文件的属性。

问题追踪集成并没有限制在TortoiseSVN,可以用于所有的Subversion客户端,更多信息可以看Issuetracker Integration Specification

5.26. 与基于WEB的版本库浏览器集成

有许多web为基础的版本库浏览器,例如ViewVC and WebSVN,TortoiseSVN提供了链接这些浏览器的方法。

你可以通过TortoiseSVN选择集成一种版本库浏览器,为此,你需要定义一些链接的属性,必须设置在文件夹:(第 5.15 节 “项目设置”)

webviewer:revision
将这个属性设置为版本库浏览器显示所有本版本修改内容的url,它必须是URI编码的,也必须包含%REVISION%。在问题单中%REVISION%将会被替换成版本号。这允许TortoiseSVN在日志对话框的增加这样的条目右键菜单在版浏览器中查看此修订
webviewer:pathrevision
设置
[重要] 设置文件夹的属性
为了系统能够工作,这个属性必须设置到文件夹上。当你提交文件或文件夹,属性会从文件夹上读取。如果没有发现属性,TortoiseSVN会向上级查找,直到发现一个没有版本化的文件夹或根目录(例如C:\)才会停止,如果你能够确定每个用户只从trunk/检出,而不是其他目录,你可以直接在trunk/上使用这个属性,而不必每个子目录都设置。如果你不能确定,你必须为每个子目录设置这些属性。一个深级目录的设置会覆盖高级目录(离trunk/更近的)。

对于tsvn:属性,你只能对于所有子目录使用递归检查框设置属性,不能设置文件的属性。

5.27. TortoiseSVN的设置

想知道不同的设置是干什么用的,你只需将鼠标指针在编辑框/选项框上停留一秒钟...一个帮助提示气泡就会弹出来。

5.27.1. 常规设置

图 5.40. 设置对话框,常规设置页面

设置对话框,常规设置页面

这个对话框允许你指定自己喜欢的语言,同时也可做那些与Subversion相关的特殊设置。

语言
选择你TSVN的用户界面语言。不然你还期望从这里得到啥别的?
每周自动检查新版本
如果检查过,TSVN将每周联系它的下载站点一次,来看看程序是否有个可用的新版本。若你想马上得到结果,使用 立即检查 按钮。无论如何,新版本不会被自动下载,而只是你将收到一条提示信息对话框,告诉你有新版本可用。
系统声音
TSVN已经默认安装了三个自定义声音。
  • 错误
  • 提示
  • 警告

你可以使用Windows控制面板中的声音属性,来选择不同的声音(或是把这些声音完全关掉)。配置 按钮是一个打开控制面板声音属性的快捷方式。

全局忽略样式
全局忽略样式被用来防止非版本控制的文件在例如提交时的对话框中被列出来。那些符合样式的文件,在执行导入操作时将同样被忽略掉。通过在样式框中输入文件名或扩展名来忽略文件或文件夹。不同的样式之间将以空格分隔,例如 */bin */obj *.bak *.~?? *.jar *.[Tt]mp。例子中前两个条目表示文件夹,其他四个表示文件。这些样式将采用文件名模糊匹配的方式来匹配要忽略的文件。阅读 第 5.11.1 节 “忽略(Ignore)列表中的文件簇” 以获得更多信息。

值得注意的是,你在这里指定的忽略样式将同样作用于你本机上的其他Subversion客户端,包括命令行客户端。

[小心] 小心
如果你象下面段落那样使用Subversion配置文件来设置一个 全局-忽略 样式,那么它将覆盖你在这里做的设置。该Subversion配置文件可以象下面段落描述的那样,通过 编辑 按钮来访问。

忽略样式将作用于你所有的项目工程。因为它是非版本控制的,所以它将不会对其他的用户起作用。相对而言,你也可以使用可版本控制的 svn:ignore 属性来把要忽略的文件或文件夹排斥在版本控制之外。阅读 第 5.11 节 “忽略文件和目录” 以获得更多信息。

将文件日期设置为“最后提交时间”
该选项通知TSVN在做检出或更新操作时,把文件日期设置为最后提交的时间。否则TSVN将使用当前日期。如果你在做软件开发的话,使用当前日期是总体上最好的选择,因为那些软件构建器通常通过查看时间戳来决定需要编译哪些文件。如果你使用了“最后提交时间”并把代码文件还原到了一个旧版本,你的工程可能就不会像你期望的那样被编译了。
Subversion配置文件
使用 编辑 按钮来直接编译Subversion配置文件。有些设置不能被TSVN直接修改,就需要在这里完成。可以阅读 Subversion Manual 来获得有关Subversion 配置 文件的更多信息。在 Automatic Property Setting 中的章节介绍了可以在这里配置的特殊偏好部分。值得注意的是,Subversion可以从许多不同的位置读取配置信息,因此你也就需要了解哪一个将优先起作用。阅读 Configuration and the Windows Registry 来获取更多信息。
使用“_svn”目录替代“.svn”目录
在使用VS.NET环境做web工程时,将无法处理 .svn 文件夹,但Subversion是要用这些文件夹来储存自己的内部信息的。这可不是Subversion的bug,这bug是VS.NET和它使用的frontpage扩展带来的。阅读 第 5.27.7 节 “Subversion的工作文件夹” 来获得有关此问题的更多信息。

若你想改变Subversion和TSVN的这些行为,就可以使用这个选项框来设置控制这些的环境变量。

你应该注意到:改变该选项将不会使已存在的工作拷贝中的管理文件夹从“_svn”自动转换到“.svn”。你需要使用一个脚本(查看我们的FAQ)来自行完成这项工作,或是简单地重新检出一个新的工作拷贝。

5.27.2. 外观与样式设置

图 5.41. 设置对话框,外观与样式页面

设置对话框,外观与样式页面

该页面允许你指定:在TortoiseSVN的主上下文菜单中哪些条目可以直接在鼠标右键菜单显示,哪些在TortoiseSVN子菜单显示。默认情况下很多项未被勾选,只在子菜单显示。

获得锁会有一个特别的情况,你可以将其提升到顶级带但,但是大多数文件不需要锁定,这样做只是添加了混乱。然而,一个标记为svn:needs-lock属性的文件每次编辑前都需要那个操作,所以这个菜单会进入顶级菜单会比较方便。选定这个选项,会使设置svn:needs-lock属性的文件的Get Lock出现在顶级菜单中。

如果在你的工作拷贝下有大量的文件,那么你 右键点击 该文件夹的时候将花费较长的时间使上下文菜单显示出来。这是因为在你查询文件夹状态的时候,Subversion要去获取其下所有文件的状态。你可以在这里取消对 为右键菜单获取SVN状态 选项的勾选以避免这种延迟。要注意的是,文件夹的上下文菜单有时不太正确,可能会包含一些本来不该在那儿的条目。举个例子,右键点击一个新 添加 的文件夹,你可能会看到 TortoiseSVN 显示日志 的操作选项,但那个是不会起作用的,因为该文件夹还没真正提交到版本库里。

选项 使用顶级菜单的快捷键 有三种状态:

未勾选(默认)
这种状态下,菜单项全部是由TSVN画出的,不会显示任何快捷键。
已勾选
这种状态激活了TSVN命令的快捷键,但这些与浏览器右键菜单中的其他快捷键显然存在起冲突的可能。多次按下快捷键将循环匹配右键菜单中共享同个快捷键的条目。这种状态下,菜单项是被Windows画出来的,而且看上去丑的要命。
半勾选(灰色)
这种模式下快捷键被激活,同时菜单项将以纯文本的形式被画出,不显示任何图标。

5.27.2.1. 图标叠加设置

图 5.42. 设置对话框,外观与样式页面

设置对话框,外观与样式页面

此页面允许你选择TSVN为哪些条目显示图标覆盖。选择网络磁盘可能会非常慢,所以默认情况下不为定位于网络共享中的工作拷贝显示图标覆盖。你甚至可以取消所有的图标覆盖,但那样做还剩下什么好玩儿的呢?

USB闪存看上去是个特殊情况,因为驱动类型是设备自主标识的。于是有些显示为固定驱动器,而有些显示为可移动磁盘。

默认情况下,图标覆盖将不止显示在Windows资源浏览器下,同样会显示在所有的打开/保存对话框里。如果你想让它们 仅仅 显示在Windows资源浏览器下,勾选 仅在资源管理器中显示图标覆盖 选项。

因为它要花费一段时间来获取工作拷贝的状态,TSVN将使用一个缓存来存储这些状态,从而使浏览器在显示图标覆盖时,资源占用的不太厉害。你可以根据你的系统和工作拷贝的大小来在这里选择让TSVN使用哪种类型的缓存: 默认

把所有状态信息缓存在一个独立进程中(TSVNCache.exe)。该进程监视所有驱动器的更改,并在工作拷贝中的文件被修改时重新获取其状态。该进程以最低优先级运行,所以其他程序不会被它挤兑。这同样意味着状态信息并不是 实时 的,因为它需要几秒钟时间处理图标覆盖的变化。

优点:图标覆盖递归地显示状态,就是说,如果一个处在工作拷贝深处的文件被修改了,所有途径的文件夹包括工作拷贝的根目录都会显示出修改的图标覆盖。也因为该进程可以向Windows外壳发送通知,资源管理器左面的树形图通常也会更改。

缺点:即使你已经不在项目下工作了,该进程仍然持续运行。取决于你工作拷贝的数量和大小,它将占用10-50 MB的RAM内存空间。

Windows外壳
缓存在外壳扩展dll中直接完成,但仅仅是为那些当前可见的文件夹。每次你浏览到其他文件夹,状态信息就会被重新获取。

优点:仅仅需要很少的内存(大约1 MB),并且可以 实时 显示状态。

缺点:因为仅有一个文件夹被缓存,图标覆盖不会递归地显示状态。在大一些的工作拷贝下,它在浏览器中显示一个文件夹将比默认缓存模式花费更多时间。而且 mime-type 列将无效。

在这种设置下,TSVN在浏览器里就完全不去获取状态了。因此,版本控制下的文件将不会获得任何图标覆盖。文件夹也仅仅有个“正常”状态的图标覆盖,其他的不会显示,也不会有其他额外的列可用。

优点:绝对不会占用任何额外的内存,也完全不会减慢浏览器的浏览速度。

缺点:文件、文件夹的状态信息不会显示在浏览器中。要获知你的工作拷贝是否被修改了,你需要使用“检查更新”对话框。

若你选择了默认选项,将同样决定如下选择:在文件夹包含非版本控制的项目时,把文件夹图标覆盖标记为已修改。这个有用的设置可以提醒你已经创建了非版本控制的新文件。

排除路径 是被用来告诉TSVN 不用 在哪些路径下显示图标覆盖和状态列。如果你有些很大的工作拷贝,而这些工作拷贝仅仅包含你完全不想改变的库文件,从而你也不需要显示图标覆盖,这时该功能将会很有用。举个例子:

填写 f:\development\SVN\Subversion 仅仅 在这个特殊文件夹上取消图标覆盖。 你仍然可以在该路径下的所有文件、文件夹上看到图标覆盖。

填写 f:\development\SVN\Subversion* 将在路径以 f:\development\SVN\Subversion 开始的 所有 文件和文件夹上取消图标覆盖。这意味着你在该路径下的任何文件/文件夹上都将看不到图标覆盖了。

包含路径 也使用同样的语法。除了有些反例:即使该路径处在某个取消图标覆盖显示的特定驱动类型下,或是处在上面的排除路径之下, 也依然会显示图标覆盖。

TSVNCache.exe 同样使用这些路径来限制它的扫描。如果你想让它仅仅在某些特定文件夹里监视,就取消所有的驱动器类型,并仅仅包含你允许被扫描的文件夹。

5.27.2.2. 图标集选择

图 5.43. 设置对话框,图标集页面

设置对话框,图标集页面

你可以选择你最喜欢的覆盖图标集。要注意的是,倘若改变了覆盖图标集,你可能需要重启计算机使更改生效。

5.27.2.3. TSVN对话框设置一

图 5.44. 设置对话框,对话框一页面

设置对话框,对话框一页面

此对话框允许你按照喜欢的方式去配置一些TSVN的对话框。

默认的日志信息数
限制你第一次选择 TortoiseSVN 显示日志 时,TSVN向服务器获取的日志信息数。在服务器连接缓慢时很有用。你可以使用 全部显示 下100(条) 来获得更多信息。
日志信息字体
选择日志信息显示的字体样式和大小,作用域为版本日志对话框的中间窗格,以及提交对话框时填写日志信息的窗格。
日志信息使用短日期/时间格式
如果标准长度的日期/时间信息占在用了过多的屏幕空间,可以使用短格式。
进程对话框
当一个动作正确无误地完成时,TSVN可以自动关闭所有的进程对话框。这项设置允许你选择在何种情况下关闭对话框。默认(推荐)的设置是 手动关闭 ,允许你重新浏览所有信息并检查发生了什么。当然,你可能会决定忽略某些类型的信息并在你的操作没做出什么重大改变的情况下让对话框自动关闭。

如无合并、添加、删除操作,自动关闭 意味着如果有简单更新的话,进程对话框将关闭。但如果版本库的更改和你的内容进行了合并,或若有任何文件被添加或删除,对话框将保持打开。若操作中发生什么冲突和错误这些对话框也将同样保持打开。

对本地操作自动关闭(如无合并、添加或删除操作,自动关闭) 意味着进程对话框当 如无合并、添加或删除操作 时自动关闭,但仅限于那些如添加文件、还原等本地的操作。在做远程操作时对话框将保持打开。

无冲突时自动关闭 更放宽了标准,即使在无合并、添加、删除操作时也同样关闭对话框。当然,如果操作发生了任何冲突或错误,对话框将保持打开。

如无错误,自动关闭 即使在有冲突发生时也会关闭。维持对话框打开的唯一条件是发生了错误,使得Subversion无法完成任务。举个例子,一个更新操作由于服务器不可达而失败了,或是一个提交操作因为工作拷贝已经过期而失败。

使用工作拷贝的URL作为默认的来源URL
在合并对话框里,默认行为是在每次合并中记忆 起始: 的URL。无论如何,都有某些人喜欢在他们的版本进化树中从很多不同的位置执行合并操作,他们发现从当前工作拷贝的URL开始更方便些。该URL可以随后被编辑来指向一个同级路径或另一个分支。

5.27.2.4. TSVN对话框设置二

 

图 5.45. 设置对话框,对话框二页面

设置对话框,对话框二页面

 

递归处理未进行版本控制的文件夹
若这个选项框被选中(默认状态),那么一个非版本控制的文件夹,不论在 添加提交 检查更新 时显示的是什么状态,它的每个子文件和子文件夹都要同样显示。取消选择将减少这些对话框中的混乱程度。这样一来如果你选择添加一个非版本控制的文件夹,将会非递归地添加。
自动完成文件路径和关键词
提交对话框包含了一个功能模块,可以解析被提交的一系列文件名。当你输入一个提交列表中某个文件的前三个字母时,自动完成对话框就会弹出来,使你随后可以点击回车来直接完成这个文件名。选择该选项来使用这个功能特性。
对自动完成进行多长时间的分析(秒)
如果有大量文件需要程序检查,自动完成解析器可能会非常慢。该超时时间设置可以防止提交对话框被长时间挂起。若你错过了某些重要的自动完成信息,你可以延长该超时时间。
仅在保留了 tsvn:projectlanguage 时才进行拼写检查
若你不愿意在所有提交操作时都进行拼写检查,就选择该选项。而后拼写检查功能将在项目属性做出明确要求时才生效。
日志中保留的最大条目数量
TSVN可以为每个版本库保存你访问时所输入的最后25条日志信息。你可以自定义该数目。若你有很多不同的版本库,你可能会希望减少该数目以防止向注册表中填入过多信息。
如果提交失败,自动重新打开提交对话框
当一个提交操作由于某些原因(工作拷贝需要更新、pre-commit钩子程序拒绝了提交、网络错误等等)失败了,你可以选择该选项来使提交对话框保持打开,以便重新操作。当然,你应该注意到这可能会导致一些问题。若发生的错误意味着你需要更新你的工作拷贝,而此更新操作将导致冲突,那么你必须先解决这些事情再说。
启动时连接版本库
“检查更新”对话框将默认检查工作拷贝,但仅当你点击 检查版本库 时才连接你的版本库做检查。若你想总是去检查版本库,就可以使用该设置来使版本库检查的动作每次都自动启动。
按数字顺序排序
版本库浏览器可以使用一个更智能的排序算法,该算法处理包含数字的路径的效果比纯按ASCII排序效果要好。这在某些时候会变得很有用,比如用来使版本号标签排成正确的顺序。该选项可以控制你所使用的默认排序类型。

5.27.2.5. TSVN颜色设置 图 5.46. 设置对话框,颜色页面

设置对话框,颜色页面

此对话框允许你按照你喜欢的方式来配置TSVN对话框使用的文本颜色。

可能或确实有冲突/有问题
当更新时或合并时发生了冲突。如果对应于版本控制下的文件/文件夹,存在一个同名的非版本控制的文件/文件夹,此时做更新将被阻碍。

此颜色同样被用在进程对话框的错误信息中。

添加文件
向版本库添加的条目。
丢失/已删除/已替换
已从工作拷贝中遗失的条目;已从版本库中删除;或已经从工作拷贝删除并且被另一个同名文件替换。
合并
从版本库所做的更改被成功地合并到工作拷贝,并无任何冲突产生。
已修改/已复制
已经增加(现在只是修改),或者在版本库中复制。也在包含复制条目的日志对话框中使用。
删除的节点
一个已经从版本库中删除了的条目。
添加的节点
一个通过添加、拷贝或移动操作,已经被添加到版本库的条目。
重命名的节点
一个在版本库中已经被重命名的条目。
替换的节点
该原始条目已经被删除,且有同名条目替换了的条目。

5.27.3. 网络设置

<placeholder-1> 如果需要穿透你公司的防火墙,在这里可以配置你的代理服务器。</placeholder-1>

如果你需要对每个版本库建立一套代理设置,你必须使用Subversion服务器文件来配置。使用编辑来直接访问该配置文件(servers.txt)。该文件的细节和使用方法可以参考Subversion Manual

你同样可以在此指定SSH客户端程序,用来支持TortoiseSVN同使用svn+ssh协议的版本库建立安全连接。我们推荐您使用TortoisePlink.exe。这是著名的Plink程序的一个定制版本, 并且业已包含在TortoiseSVN之中,但它被编译成了一个无窗口的应用,因此当你每次认证的时候将不会看到弹出的DOS窗口。

这里有个不弹出窗口的副作用:将没有什么错误信息可供你追踪。因此倘若认证失败你将得到一个信息说:“Unable to write to standard output”。这样一来,我们就推荐你第一次设置时使用原始的Plink程序;而当一切工作正常之时,再使用定制版的TortoisePlink,并且重复利用那些相同的参数。

5.27.4. 外部程序设置

图 5.47. 设置对话框,差异查看页面

设置对话框,差异查看页面

在这里你可以定义你自己的差异查看/合并工具. 默认设置是使用与TortoiseSVN一同安装的TortoiseMerge。

阅读 第 5.9.4 节 “其他的比较/合并工具” 来了解人们为配合TortoiseSVN工作而使用的外部差异查看/合并程序列表。

5.27.4.1. 差异查看器

有时你可能需要一个外部的差异查看程序来比较不同版本的文件。在为你的命令行填写各种可选参数的同时,要确保这些外部程序从中获得文件名。在TortoiseSVN编辑命令行时,使用以 % 开头的替代参数。当外部程序执行至遇到这些替代参数,它将从TortoiseSVN那里获取那些实际的值。参数的填写顺序将依赖于你使用的差异查看程序。

%base
没更改的原始文件
%bname
原始文件的窗口标题
%mine
你更改过的新文件
%yname
你新文件的窗口标题

窗口标题并不一定代表真正的文件名。TortoiseSVN把它伪装成一个名字用来创建和显示。因此,倘若你在对比一个版本为123的文件和你当前工作拷贝中的文件,名字将显示为 文件名 : 版本 123文件名 : 工作拷贝

例如,使用 ExamDiff Pro:

C:\Path-To\ExamDiff.exe %base %mine

或者使用 KDiff3:

C:\Path-To\kdiff3.exe %base %mine --L1 %bname --L2 %yname

或者使用 WinMerge:

C:\Path-To\WinMerge.exe -e -ub -dl %bname -dr %yname %base %mine

或者使用 Araxis:

C:\Path-To\compare.exe /max /wait /title1:%bname /title2:%yname %base %mine

如果你使用了 svn:keywords 属性来扩展关键词,特别是那些 revision 版本关键词,那么在那些纯粹在关键词上取值不同的文件之间对比将有一些不同。同样如果你使用 svn:eol-style = native,那么在工作基础版本文件只有纯粹的 LF (换行)结束符的地方,你的文件将有完整的 CR-LF (回车-换行)结束符。TSVN在做差异对比操作之前,通常会先行对那些扩展关键词和结束符等格式进行解析转换,从而自动隐藏这些差异。无论如何,在遇到大文件时这样做无疑会经过一个很长的处理时间。如果取消对 与基础版本比较时转换文件 的勾选,那么TSVN将忽略这些对文件的预处理。

5.27.4.2. 合并工具

外部合并程序被用来解决文件冲突。像差异查看程序那样,替代参数同样被用在命令行中。

%base
没有被你或他人更改的原始文件
%bname
原始文件的窗口标题
%mine
你更改过的新文件
%yname
你新文件的窗口标题
%theirs
档案库中存放的文件
%tname
档案库中文件的窗口标题
%merged
发生冲突的文件,同时将被合并后的文件替换
%mname
合并文件的窗口标题

例如,使用 Perforce Merge:

C:\Path-To\P4Merge.exe %base %theirs %mine %merged

或者使用 KDiff3:

C:\Path-To\kdiff3.exe %base %mine %theirs -o %merged --L1 %bname --L2 %yname --L3 %tname

或者使用 Araxis:

C:\Path-To\compare.exe /max /wait /3 /title1:%tname /title2:%bname /title3:%yname %theirs %base %mine %merged /a2

5.27.4.3. 差异查看/合并工具的高级设置

图 5.48. 高级差异比较设置/高级合并设置的对话框

高级差异比较设置/高级合并设置的对话框

在高级设置中,你可以为每种文件类型都定义一个不同的差异比较/合并程序。例如,你可以指定Photoshop作为.jpg文件的 “比较” 程序 :-) 也可以按照 svn:mime-type 属性指定差异/合并程序。

无需任何通配符,你仅需指定文件的扩展名,包含开始的点,但是没有任何通配符。使用 .BMP 来描述Windows位图文件,而 不是*.BMP。如果使用svn:mime-type属性,要指定多媒体文件类型,包含斜线,例如text/xml

5.27.4.4. 统一的差异查看器

一个统一差异文件(补丁文件)的查看程序。不需要任何参数。默认 选项遵循先检查 .diff 文件,再检查 .txt 文件的顺序。如果你没有 .diff 文件的查看器,就需要用记事本来查看了。

原始Windows记事本程序对未使用标准“回车-换行”结束符的文件支持的并不好。而很多统一差异文件都仅仅使用“换行”结束符,因此他们的格式在记事本中显示的并不好。无论如何,你可以下载一个免费的记事本2 Notepad2,它不但可以正确地显示结束符,更可以为差异文件中添加和删除的那些行做颜色标记。

5.27.5. 已保存数据的设置

图 5.49. 设置对话框,已保存数据设置页面

设置对话框,已保存数据设置页面

为您方便着想,TortoiseSVN保存了很多你用过的设置,并记录你最近浏览过的地址。如果你想清空这些数据缓存,就在这里操作。

URL历史记录
每次你检出一个工作拷贝,合并那些更改的文件,或仅仅是在使用版本库浏览器时,TortoiseSVN都将保存一个记录,记录那些最近使用过的URL,并在一个下拉列表框中显示出来。有时列表会被逐渐增多的过期URL弄得乱糟糟的,所以有定期清理一下的必要。

如果你希望从列表中删除单独的条目,可以点击下拉列表,移动鼠标到你要删除的项上,然后按组合键SHIFT+DELETE

日志信息
TortoiseSVN同时也储存你最近提交时填写的日志信息。对应每个版本库都要储存这些信息,所以如果你访问过很多版本库,这个列表将变得非常大。
窗口大小及位置
许多对话框都可以记录你最后一次使用时的窗口大小和位置。
认证数据
当你在登陆某个Subversion服务器,填写认证信息时,用户名和密码也可以被保存在本地,你也就不用每次都输入了。但考虑到一些安全因素,你可能会有清除这些认证信息的愿望,或者你仅仅是想换个不同的用户名登陆...John知道你正在用他的机器么?(规范点儿,用你自己的用户名登陆版本库吧,伙计 *by Jax)

如果你仅想清除某个特定版本库的认证数据,读一下 第 5.1.5 节 “认证” 有关怎样寻找缓存数据的说明。

5.27.6. 注册表设置

一些极不常用的设置只有通过直接修改注册表的方式才能生效。

配置
通过编辑注册表 HKCU\Software\TortoiseSVN\ConfigDir,你可以为Subversion的配置文件指定一个不同位置。这将影响到TSVN的所有操作。
缓存托盘图标
要为TSVNCache程序添加一个缓存托盘图标,先在 HKCU\Software\TortoiseSVN\CacheTrayIcon 的位置,创建一个 DWORD 值,取值为1。这确实只对开发者才有点用处,因为它允许你来优雅地关闭TSVNCache,而不是在进程列表里kill掉它。(托盘图标可以显示当前已缓存了的文件夹数目 *by Jax)

5.27.7. Subversion的工作文件夹

在使用VS.NET环境做web工程时,遇到.svn文件夹会出问题,但Subversion是要用这些文件夹来储存自己的内部信息的。这可不是Subversion的bug,这bug是VS.NET和它使用的frontpage扩展带来的。

在Subversion 1.3.0和TSVN 1.3.0里,你可以设置环境变量 SVN_ASP_DOT_NET_HACK,来通知Subversion用 _svn 文件夹替代 .svn 文件夹。你必须重启你系统的外壳程序来使环境变量生效,一般意味着你要重启PC。在1.4.0里这项替代工作就变得非常简单,你只需从常规设置页面选择一个单选框:使用“_svn”目录替代“.svn”目录。——参考 第 5.27.1 节 “常规设置”

若想获得更多信息,了解避免该问题的其他方法,请读读我们 FAQ 里的文章。

5.27.8. 钩子脚本

图 5.50. 设置对话框,钩子脚本页

设置对话框,钩子脚本页

这个对话框允许你指定当特定 Subversion 动作执行时,自动执行的钩子脚本。

应用程序,例如钩子,可能调用如SubWCRev.exe这样的程序,来更新提交后的版本号,可能还会出发重新构建。

由于各种安全理由和实现问题,钩子脚本在本地机器定义,而不是象工程属性那样。不管是谁提交,都可以定义它做什么事情。当然,你也可以选择调用一个受版本控制的脚本。

图 5.51. 设置对话框,配置钩子脚本页面

设置对话框,配置钩子脚本页面

要增加钩子脚本,直接点击 增加 ,然后输入脚本即可。

现在有六种钩子脚本类型可用

开始提交
在提交对话框之前调用。当钩子修改受版本控制的文件,影响了提交的文件列表的时候适用。
提交之前
在提交对话框点击确认之后,实际提交之前调用。
提交之后
在提交结束后调用(无论成功或失败)
开始更新
在更新到版本对话框显示之前调用
更新之前
在 Subversion 更新实际开始之前调用
更新之后
在更新之后调用(无论成功或失败)

为特定工作目录定义的钩子。你只要指定顶级路径;如果在子目录内执行提交,TortoiseSVN 会自动向上搜索匹配路径。

然后你要指定要执行的命令行,以钩子脚本或可执行文件的路径开始。它可以是批处理文件,可执行文件,或者有效的windows关联的其它文件类型,例如perl文件。

命令行可以包含被TortoiseSVN填写的几个参数。这些参数依赖于调用了什么脚本。

开始提交
%PATHS%
提交之前
%PATHS%%SELECTEDPATHS%
提交之后
%SELECTEDPATHS%%REVISION%%ERROR%
开始更新
%PATHS%
更新之前
%PATHS%
更新之后
%PATHS%%REVISION%%ERROR%

每个变量的含义如下:

%PATHS%
当操作开始时选择的路径。例如当启动提交对话框是在资源管理器中选择的路径。如果选择了多个路径,它们用*自负隔开。
%SELECTEDPATHS%
我们在提交对话框内选择的路径。如果选择了多个路径,那么它们用*字符分割。
%REVISION%
在提交完成后的版本库的版本
%ERROR%
如果操作成功,它是空的,否则操作失败时就显示错误信息。

如果你想Subversion 操作直到钩子完成才结束,就选择等待脚本结束

通常脚本运行时,你会想隐藏丑陋的控制台窗口,所以默认选择运行时隐藏脚本。为了调试,你可能想观察控制台窗口的输出。

5.28. 最后步骤

愿望表


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