手册

项目设置

Subversion 属性

图 4.37. Subversion 属性页

Subversion property page


您可以从 Windows 属性对话框、TortoiseSVN属性 以及 TortoiseSVN 状态列表中的 右键菜单属性 读取和设置 Subversion 属性。

您可以添加自己的属性,或者一些在 Subversion 中具有特殊含义的属性。这些属性以 svn: 开头。 svn:externals 就是这样的属性;请参阅 “外部项目”一节 中关于如何处理外部项目的说明。

svn:keywords

Subversion 支持类似 CVS 的关键字扩展,可用于将文件名和修订版信息嵌入到文件本身中。当前支持的关键字包括

$Date$

上次已知提交的日期。这基于您更新工作副本时获取的信息。它不会检查仓库以查找更近期的更改。

$Revision$

上次已知提交的修订版。

$Author$

进行上次已知提交的作者。

$HeadURL$

此文件在仓库中的完整 URL。

$Id$

前四个关键字的压缩组合。

要了解如何使用这些关键字,请参阅 Subversion 手册中的 svn:keywords 部分 ,其中详细介绍了这些关键字以及如何启用和使用它们。

有关 Subversion 中属性的更多信息,请参阅 特殊属性

添加和编辑属性

图 4.38. 添加属性

Adding properties


要添加新属性,请先单击 新建...。从菜单中选择所需的属性名称,然后在特定属性对话框中填写所需的信息。这些特定属性对话框将在 “属性编辑器”一节 中详细介绍。

要添加没有自己对话框的属性,请从 新建... 菜单中选择 高级。然后,在组合框中选择现有属性或输入自定义属性名称。

如果您想一次性将属性应用于多个项目,请在资源管理器中选择文件/文件夹,然后选择 上下文菜单属性

如果您想将属性应用于当前文件夹下层次结构中的 所有 文件和文件夹,请选中 递归 复选框。

如果您想编辑现有属性,请从现有属性列表中选择该属性,然后单击 编辑...

如果您想删除现有属性,请从现有属性列表中选择该属性,然后单击 删除

可以使用 svn:externals 属性从同一个存储库或完全不同的存储库中拉取其他项目。有关更多信息,请阅读 名为“外部项目”的部分

在 HEAD 版本中编辑属性

由于属性是版本化的,因此您无法编辑先前版本的属性。如果您在日志对话框或存储库浏览器中的非 HEAD 版本中查看属性,您将看到属性和值的列表,但没有编辑控件。

导出和导入属性

您经常会发现自己多次应用相同的属性集,例如 bugtraq:logregex。为了简化将属性从一个项目复制到另一个项目的流程,您可以使用导出/导入功能。

在属性已设置的文件或文件夹中,使用 TortoiseSVN属性,选择要导出的属性,然后单击 导出...。系统将提示您输入要保存属性名称和值的文件名。

在您要应用这些属性的文件夹中,使用 TortoiseSVN属性 并单击 导入...。系统将提示您输入要导入的文件名,因此请导航到您之前保存导出文件的位置并选择它。属性将非递归地添加到文件夹中。

如果您想递归地将属性添加到树中,请按照上述步骤操作,然后在属性对话框中依次选择每个属性,单击 编辑...,选中 递归应用属性 框,然后单击 确定

导入文件格式是二进制的,并且是 TortoiseSVN 专有的。它的唯一目的是使用导入和导出传输属性,因此无需编辑这些文件。

二进制属性

TortoiseSVN 可以使用文件处理二进制属性值。要读取二进制属性值,请使用 保存... 到文件。要设置二进制值,请使用十六进制编辑器或其他合适的工具创建包含所需内容的文件,然后使用 加载... 从该文件加载。

虽然二进制属性并不常用,但在某些应用程序中它们可能很有用。例如,如果您存储了巨大的图形文件,或者用于加载文件的应用程序很大,您可能希望将缩略图存储为属性,以便您可以快速获得预览。

自动设置属性

您可以配置 Subversion 和 TortoiseSVN,以便在将文件和文件夹添加到存储库时自动设置属性。有两种方法可以做到这一点。

您可以编辑 Subversion 配置文件以在您的客户端上启用此功能。TortoiseSVN 设置对话框的 常规 页面有一个编辑按钮,可以将您直接带到那里。配置文件是一个简单的文本文件,它控制 Subversion 的一些工作方式。您需要更改两件事:首先,在标题为 miscellany 的部分中,取消注释行 enable-auto-props = yes。其次,您需要编辑下面的部分以定义要添加到哪些文件类型的属性。此方法是标准的 Subversion 功能,适用于任何 Subversion 客户端。但是,它必须在每个客户端上单独定义 - 无法从存储库传播这些设置。

另一种方法是在文件夹上设置 tsvn:autoprops 属性,如下一节所述。此方法仅适用于 TortoiseSVN 客户端,但它确实会传播到更新后的所有工作副本。

从 Subversion 1.8 开始,您还可以设置根文件夹上的 svn:auto-props 属性。属性值会自动继承到所有子项。

无论您选择哪种方法,您都应该注意,自动属性仅在将文件添加到工作副本时应用。自动属性永远不会更改已版本控制文件的属性。

如果您想绝对确保新文件应用了正确的属性,您应该设置一个仓库 pre-commit 钩子,以拒绝未设置所需属性的提交。

提交属性

Subversion 属性是版本化的。更改或添加属性后,您必须提交更改。

属性冲突

如果提交更改时发生冲突,因为另一个用户更改了相同的属性,Subversion 会生成一个 .prej 文件。解决冲突后,删除此文件。

TortoiseSVN 项目属性

TortoiseSVN 有几个自己的特殊属性,这些属性以 tsvn: 开头。

  • tsvn:logminsize 设置提交日志消息的最小长度。如果您输入的长度小于此处指定的长度,则提交将被禁用。此功能非常有用,可以提醒您为每次提交提供适当的描述性消息。如果未设置此属性,或值为零,则允许空日志消息。

    tsvn:lockmsgminsize 设置锁定消息的最小长度。如果您输入的长度小于此处指定的长度,则锁定将被禁用。此功能非常有用,可以提醒您为每次获取的锁定提供适当的描述性消息。如果未设置此属性,或值为零,则允许空锁定消息。

  • tsvn:logwidthmarker 用于需要将日志消息格式化为某个最大宽度(通常为 80 个字符)的项目,然后换行。将此属性设置为非零值将在日志消息条目对话框中执行两件事:它放置一个标记来指示最大宽度,并且它禁用显示中的自动换行,以便您可以查看您输入的文本是否太长。注意:此功能仅在您为日志消息选择了等宽字体时才能正常工作。

  • tsvn:logtemplate 用于对日志消息格式有规则的项目。该属性包含一个多行文本字符串,该字符串将在您开始提交时插入提交消息框中。然后,您可以对其进行编辑以包含所需信息。注意:如果您也使用 tsvn:logminsize,请确保将长度设置为大于模板,否则您将失去保护机制。

    您还可以使用特定于操作的模板,而不是 tsvn:logtemplate。如果设置了特定于操作的模板,则使用它们,但如果未设置特定于操作的模板,则使用 tsvn:logtemplate

    特定于操作的模板是

    • tsvn:logtemplatecommit 用于从工作副本进行的所有提交。

    • tsvn:logtemplatebranch 用于创建分支/标签时,或在存储库浏览器中直接复制文件或文件夹时。

    • tsvn:logtemplateimport 用于导入。

    • tsvn:logtemplatedelete 用于在仓库浏览器中直接删除项目。

    • tsvn:logtemplatemove 用于在仓库浏览器中重命名或移动项目。

    • tsvn:logtemplatemkdir 用于在仓库浏览器中创建目录。

    • tsvn:logtemplatepropset 用于在仓库浏览器中修改属性。

    • tsvn:logtemplatelock 用于获取锁。

  • Subversion 允许您设置 autoprops,它将根据文件扩展名应用于新添加或导入的文件。这取决于每个客户端是否在其 Subversion 配置文件中设置了适当的 autoprops。 tsvn:autoprops 可以设置在文件夹上,这些设置将在导入或添加文件时与用户的本地 autoprops 合并。格式与 Subversion autoprops 相同,例如 *.sh = svn:eol-style=native;svn:executable 在具有 .sh 扩展名的文件上设置两个属性。

    如果本地 autoprops 与 tsvn:autoprops 之间存在冲突,则项目设置优先,因为它们特定于该项目。

    从 Subversion 1.8 开始,您应该使用属性 svn:auto-props 而不是 tsvn:autoprops,因为它具有完全相同的功能,但适用于所有 svn 客户端,并且不是特定于 TortoiseSVN 的。

  • 在提交对话框中,您可以选择粘贴更改的文件列表,包括每个文件的状态(添加、修改等)。 tsvn:logfilelistenglish 定义是否以英语或本地化语言插入文件状态。如果未设置该属性,则默认值为 true

  • TortoiseSVN 可以使用拼写检查器。在 Windows 10 上,使用操作系统的拼写检查器。在早期版本的 Windows 上,它可以使用 OpenOffice 和 Mozilla 也使用的拼写检查器模块。如果您安装了这些模块,此属性将确定使用哪个拼写检查器,即您的项目日志消息应使用哪种语言编写。 tsvn:projectlanguage 设置拼写检查引擎在您输入日志消息时应使用的语言模块。您可以在此页面上找到您语言的值: MSDN:语言标识符 .

    您可以以十进制或十六进制形式输入此值,如果以 0x 为前缀,则为十六进制。例如,英语(美国)可以输入为 0x04091033

  • 属性 tsvn:logsummary 用于提取日志消息的一部分,然后在日志对话框中显示为日志消息摘要。

    属性 tsvn:logsummary 的值必须设置为包含一个正则表达式组的一行正则表达式字符串。与该组匹配的任何内容都将用作摘要。

    例如:\[SUMMARY\]:\s+(.*) 将捕获日志消息中 [SUMMARY] 之后的所有内容,并将其用作摘要。

  • 属性 tsvn:logrevregex 定义一个正则表达式,该表达式匹配日志消息中对修订版的引用。这在日志对话框中用于将此类引用转换为链接,单击这些链接将滚动到该修订版(如果该修订版已显示在日志对话框中,或者如果它可从日志缓存中获得),或打开一个显示该修订版的新的日志对话框。

    正则表达式必须匹配整个引用,而不仅仅是修订版号。修订版号会自动从匹配的引用字符串中提取。

    如果未设置此属性,则将使用默认正则表达式来链接修订版引用。

  • 有几个属性可用于配置客户端挂钩脚本。每个属性对应一个特定的挂钩脚本类型。

    可用的属性/挂钩脚本是

    • tsvn:startcommithook
    • tsvn:precommithook
    • tsvn:postcommithook
    • tsvn:startupdatehook
    • tsvn:preupdatehook
    • tsvn:postupdatehook
    • tsvn:prelockhook
    • tsvn:postlockhook

    参数与您在设置对话框中配置挂钩脚本时相同。有关详细信息,请参阅 名为“客户端挂钩脚本”的部分

    由于并非每个用户都将工作副本检出到同一位置并使用相同的名称,因此您可以配置一个在工作副本中执行的脚本/工具,方法是在存储库中指定 URL,使用 %REPOROOT% 作为指向存储库根目录的 URL 部分。例如,如果您的挂钩脚本位于工作副本中的 contrib/hook-scripts/client-side/checkyear.js 下,则应将脚本的路径指定为 %REPOROOT%/trunk/contrib/hook-scripts/client-side/checkyear.js。这样,即使您将存储库移动到另一个服务器,也不必调整挂钩脚本属性。

    除了 %REPOROOT% 之外,您还可以指定 %REPOROOT+%+ 用于插入查找脚本所需的任何数量的文件夹路径。如果您想指定脚本,以便在创建分支时即使工作副本的 URL 不同,也能找到脚本,这将很有用。使用上面的示例,您应将脚本的路径指定为 %REPOROOT+%/contrib/hook-scripts/client-side/checkyear.js

    以下屏幕截图显示了如何为 TortoiseSVN 配置用于检查源文件头中当前版权年份的脚本。

    图 4.39. 钩子脚本的属性对话框

    Property dialog for hook scripts


  • 当您想要添加新属性时,您可以从组合框中的列表中选择一个,也可以输入您喜欢的任何属性名称。如果您的项目使用一些自定义属性,并且您希望这些属性出现在组合框中的列表中(以避免在输入属性名称时出现拼写错误),您可以使用 tsvn:userfilepropertiestsvn:userdirproperties 创建自定义属性列表。将这些属性应用于文件夹。当您转到编辑任何子项的属性时,您的自定义属性将出现在预定义属性名称列表中。

    您还可以指定是否使用自定义对话框来添加/编辑您的属性。TortoiseSVN 提供四种不同的对话框,具体取决于您的属性类型。

    bool

    如果您的属性只能具有两种状态,例如 true 和 false,那么您可以将属性配置为 bool 类型。

    图 4.40. 属性对话框布尔用户类型

    Property dialog boolean user types


    像这样指定您的属性

    propertyname=bool;labeltext(YESVALUE;NOVALUE;Checkboxtext)

    labeltext 是在复选框上方显示在对话框中的文本,您可以在其中解释属性的用途和使用方式。其他参数应该是不言自明的。

    state

    如果您的属性表示许多可能状态之一,例如 yes, no, maybe,那么您可以将属性配置为 state

    图 4.41. 属性对话框状态用户类型

    Property dialog state user types
    Property dialog state user types
    Property dialog state user types


    像这样指定您的属性

    propertyname=state;labeltext(DEFVAL;VAL1;TEXT1;VAL2;TEXT2;VAL3;TEXT3;...)

    参数与 bool 属性相同,DEFVAL 是如果属性尚未设置或具有未配置的值时要使用的默认值。

    对于最多三个不同的值,对话框最多显示三个单选按钮。如果配置了更多值,它将使用一个组合框,用户可以从中选择所需的状态。

    singleline

    对于由一行文本组成的属性,请使用 singleline 属性类型

    图 4.42. 属性对话框单行用户类型

    Property dialog single-line user types


    propertyname=singleline;labeltext(regex)

    regex 指定一个正则表达式,用于验证(匹配)用户输入的文本。如果文本不匹配正则表达式,则会向用户显示错误,并且属性不会被设置。

    multiline

    对于包含多行文本的属性,使用 multiline 属性类型

    图 4.43. 属性对话框多行用户类型

    Property dialog multi-line user types


    propertyname=multiline;labeltext(regex)

    regex 指定一个正则表达式,用于验证(匹配)用户输入的文本。不要忘记在正则表达式中包含换行符(\n)!

    上面的截图使用以下 tsvn:userdirproperties 制作

    my:boolprop=bool;This is a bool type property. Either check or uncheck it.(true;false;my bool prop)
    my:stateprop1=state;This is a state property. Select one of the two states.(true;true;true value;false;false value)
    my:stateprop2=state;This is a state property. Select one of the three states.(maybe;true;answer is correct;false;answer is wrong;maybe;not answered)
    my:stateprop3=state;Specify the day to set this property.(1;1;Monday;2;Tuesday;3;Wednesday;4;Thursday;5;Friday;6;Saturday;7;Sunday)
    my:singlelineprop=singleline;enter a small comment(.*)
    my:multilineprop=multiline;copy and paste a full chapter here(.*)
                

TortoiseSVN 可以与一些缺陷跟踪工具集成。这使用以 bugtraq: 开头的项目属性。阅读 名为“与缺陷跟踪系统/问题跟踪器集成”的部分 以获取更多信息。

它还可以与一些基于 Web 的存储库浏览器集成,使用以 webviewer: 开头的项目属性。阅读 名为“与基于 Web 的存储库查看器集成”的部分 以获取更多信息。

在文件夹上设置项目属性

这些特殊的项目属性必须设置在 文件夹 上,系统才能正常工作。当您使用使用这些属性的 TortoiseSVN 命令时,属性将从您单击的文件夹中读取。如果在那里找不到属性,TortoiseSVN 将向上搜索文件夹树以找到它们,直到找到一个未版本化的文件夹或树根(例如 C:\)。如果您能确定每个用户只从例如 trunk/ 检出,而不是从某个子文件夹检出,那么在 trunk/ 上设置属性就足够了。如果您不能确定,您应该在每个子文件夹上递归地设置属性。如果您设置了相同的属性,但在项目层次结构的不同深度使用不同的值,那么您将根据您在文件夹结构中的单击位置获得不同的结果。

对于 项目属性,即 tsvn:bugtraq:webviewer:,您可以使用 递归 复选框将属性设置为层次结构中的所有子文件夹,而不会将其设置在所有文件上。

当您使用 TortoiseSVN 将新的子文件夹添加到工作副本时,父文件夹中存在的任何项目属性也会自动添加到新的子文件夹中。

使用仓库浏览器时的限制

远程获取属性是一个缓慢的操作,因此上面描述的一些功能在仓库浏览器中无法像在工作副本中那样工作。

  • 当您使用仓库浏览器添加属性时,预定义列表中只提供标准的 svn: 属性。任何其他属性名称都必须手动输入。

  • 无法使用仓库浏览器递归设置或删除属性。

  • 使用仓库浏览器添加子文件夹时,项目属性 不会 自动传播。

  • tsvn:autoprops 不会 在使用仓库浏览器添加的文件上设置属性。

注意

虽然 TortoiseSVN 的项目属性非常有用,但它们只适用于 TortoiseSVN,而且有些只适用于较新版本的 TortoiseSVN。如果您的项目中的人员使用各种 Subversion 客户端,或者可能使用旧版本的 TortoiseSVN,您可能需要使用仓库钩子来强制执行项目策略。项目属性只能帮助实施策略,不能强制执行策略。

属性编辑器

某些属性必须使用特定值,或者以特定方式格式化才能用于自动化。为了帮助您正确格式化,TortoiseSVN 为某些特定属性提供了编辑对话框,这些对话框显示了可能的值或将属性分解为其各个组件。

外部内容

图 4.44. svn:externals 属性页

svn:externals property page


svn:externals 属性可用于从同一仓库或完全不同的仓库中拉取其他项目,如 名为“外部项目”的部分 中所述。

您需要定义外部文件夹签出的子文件夹的名称以及外部项目的 Subversion URL。您可以签出外部项目的 HEAD 修订版,因此当外部项目在仓库中发生更改时,您的工作副本将接收这些更改以进行更新。但是,如果您希望外部项目引用特定稳定点,那么您可以指定要使用的特定修订版。在这种情况下,您可能还想将相同的修订版指定为挂钩修订版。如果外部项目在将来某个时间点被重命名,那么 Subversion 将无法在您的工作副本中更新该项目。通过指定挂钩修订版,您可以告诉 Subversion 在挂钩修订版而不是 HEAD 修订版处查找具有该名称的项目。

查找 HEAD 修订版 按钮会获取每个外部 URL 的 HEAD 修订版,并在最右侧的列中显示该 HEAD 修订版。在知道 HEAD 修订版之后,右键单击外部项目,即可获得将所选外部项目挂钩到其显式 HEAD 修订版的命令。如果尚未知道 HEAD 修订版,则右键单击命令将首先获取 HEAD 修订版。

SVN 关键字

图 4.45. svn:keywords 属性页

svn:keywords property page


选择您希望在文件中展开的关键字。

EOL 样式

图 4.46. svn:eol-style 属性页

svn:eol-style property page


选择您希望使用的行尾样式,TortoiseSVN 将使用正确的属性值。

问题跟踪器集成

图 4.47. tsvn:bugtraq 属性页

tsvn:bugtraq property page


日志消息大小

图 4.48. 日志消息大小属性页

Size of log messages property page


这 3 个属性控制日志消息的格式。前两个在提交或锁定对话框中禁用 确定,直到消息满足最小长度。边框位置在给定列宽处显示一个标记,作为对日志消息有宽度限制的项目的指南。将值设置为零将删除属性。

项目语言

图 4.49. 语言属性页

Language property page


选择用于在提交对话框中拼写检查日志消息的语言。文件列表复选框在您右键单击日志消息窗格并选择 粘贴文件列表 时生效。默认情况下,Subversion 状态将以您的本地语言显示。选中此框后,状态始终以英语显示,适用于需要仅使用英语日志消息的项目。

MIME 类型

图 4.50. svn:mime-type 属性页

svn:mime-type property page


svn:needs-lock

图 4.51. svn:needs-lock 属性页

svn:needs-lock property page


此属性仅控制如果工作副本中没有为文件持有锁定,则文件是否将以只读方式检出。

svn:executable

图 4.52. svn:executable 属性页

svn:executable property page


此属性控制在 Unix/Linux 系统上检出时文件是否将被赋予可执行状态。它对 Windows 检出没有影响。

合并日志消息模板

每当将修订版合并到工作副本时,TortoiseSVN 都会从所有已合并的修订版生成日志消息。然后,这些消息可从提交对话框中的 最近消息 按钮获得。

您可以使用以下属性自定义生成的邮件

图 4.53. 属性对话框合并日志消息模板

Property dialog merge log message templates


tsvn:mergelogtemplatetitle, tsvn:mergelogtemplatereversetitle

此属性指定生成的日志消息的第一部分。可以使用以下关键字

{revisions}

已合并修订版的逗号分隔列表,例如 3, 5, 6, 7

{revisionsr}

{revisions} 相似,但每个修订版前面都有一个 r,例如 r3, r5, r6, r7

{revrange}

合并修订版本的逗号分隔列表,如果可能,将它们分组到范围内,例如,3, 5-7

{mergeurl}

合并的源 URL,即修订版本从中合并的位置。

此字符串的默认值为 Merged revision(s) {revrange} from {mergeurl}:,末尾带换行符。

tsvn:mergelogtemplatemsg

此属性指定每个合并修订版本的文本应如何显示。可以使用以下关键字

{msg}

合并修订版本的日志消息,如输入时所示。

{msgoneline}

{msg} 相似,但所有换行符都替换为空格,因此整个日志消息显示在一行上。

{author}

合并修订版本的作者。

{rev}

合并的修订版本本身。

{bugids}

合并修订版本的错误 ID(如果有)。

tsvn:mergelogtemplatemsgtitlebottom

此属性指定使用 tsvn:mergelogtemplatetitletsvn:mergelogtemplatereversetitle 指定的标题字符串的位置。如果该属性设置为 yestrue,则标题字符串将附加到底部而不是顶部。

重要

这仅在合并的修订版本已在日志缓存中时有效。如果您已禁用日志缓存或在合并之前没有先显示日志,则生成的邮件将不包含有关合并的修订版本的信息。

TortoiseSVN 主页