您可以从 Windows 属性对话框中读取和设置 Subversion 属性,也可以从 → 以及 TortoiseSVN 的状态列表中,从 → 中读取和设置。
您可以添加您自己的属性,或者一些在 Subversion 中具有特殊含义的属性。这些属性以 svn:
开头。svn:externals
就是这样一个属性;请参阅 “外部项” 章节,了解如何处理外部项。
Subversion 支持类似 CVS 的关键字扩展,可用于在文件本身中嵌入文件名和修订版本信息。当前支持的关键字有
上次已知提交的日期。这基于您更新工作副本时获得的信息。它 不 检查存储库以查找更新的更改。
上次已知提交的修订版本。
上次已知提交的作者。
此文件在存储库中的完整 URL。
前四个关键字的压缩组合。
要了解如何使用这些关键字,请查看 Subversion 书籍中的 svn:keywords 章节 ,其中详细描述了这些关键字以及如何启用和使用它们。
有关 Subversion 中属性的更多信息,请参阅 特殊属性 。
要添加新属性,首先单击 新建...。从菜单中选择所需的属性名称,然后在特定的属性对话框中填写所需的信息。这些特定的属性对话框在 “属性编辑器” 章节中进行了更详细的描述。
要添加没有自己对话框的属性,请从 新建... 菜单中选择 。然后,在组合框中选择现有属性或输入自定义属性名称。
如果您想一次将属性应用于多个项目,请在资源管理器中选择文件/文件夹,然后选择
→ 。如果您想将属性应用于当前文件夹下层级结构中的 每个 文件和文件夹,请选中 递归 复选框。
如果您想编辑现有属性,请从现有属性列表中选择该属性,然后单击
。如果您想删除现有属性,请从现有属性列表中选择该属性,然后单击
。svn:externals
属性可用于从同一存储库或完全不同的存储库中拉取其他项目。有关更多信息,请阅读 “外部项” 章节。
由于属性是版本化的,因此您无法编辑先前修订版本的属性。如果您从日志对话框或存储库浏览器中的非 HEAD 修订版本查看属性,您将看到属性和值的列表,但没有编辑控件。
通常,您会发现自己多次应用同一组属性,例如 bugtraq:logregex
。为了简化从一个项目到另一个项目复制属性的过程,您可以使用导出/导入功能。
从已设置属性的文件或文件夹中,使用
→ ,选择您要导出的属性,然后单击 。系统将提示您输入文件名,属性名称和值将保存在该文件中。从您希望应用这些属性的文件夹中,使用
→ 并单击 。系统将提示您输入要从中导入的文件名,因此导航到您先前保存导出文件的位置并选择它。属性将被非递归地添加到文件夹中。如果您想递归地向树添加属性,请按照上述步骤操作,然后在属性对话框中依次选择每个属性,单击 递归应用属性 复选框,然后单击 。
,选中导入文件格式是二进制的,并且是 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 hook,以拒绝未设置所需属性的提交。
Subversion 属性是版本化的。在您更改或添加属性后,您必须提交您的更改。
如果在提交更改时发生冲突,因为另一个用户更改了相同的属性,Subversion 会生成一个 .prej
文件。在您解决冲突后删除此文件。
TortoiseSVN 拥有一些自己的特殊属性,这些属性以 tsvn:
开头。
tsvn:logminsize
设置提交日志消息的最小长度。如果您输入的日志消息短于此处指定的长度,则禁用提交。此功能对于提醒您为每次提交提供适当的描述性消息非常有用。如果未设置此属性或值为零,则允许空日志消息。
tsvn:lockmsgminsize
设置锁定消息的最小长度。如果您输入的锁定消息短于此处指定的长度,则禁用锁定。此功能对于提醒您为每次获取锁提供适当的描述性消息非常有用。如果未设置此属性或值为零,则允许空锁定消息。
tsvn:logwidthmarker
用于需要日志消息以某个最大宽度(通常为 80 个字符)格式化,然后在换行符之前的项目。将此属性设置为非零将在日志消息输入对话框中执行 2 项操作:它放置一个标记以指示最大宽度,并且它禁用显示中的自动换行,以便您可以查看您输入的文本是否太长。注意:只有当您为日志消息选择了等宽字体时,此功能才能正常工作。
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
为前缀。例如,英语(美国)可以输入为 0x0409
或 1033
。
tsvn:logsummary
属性用于提取日志消息的一部分,然后在日志对话框中显示为日志消息摘要。
tsvn:logsummary
属性的值必须设置为包含一个正则表达式组的单行正则表达式字符串。与该组匹配的任何内容都将用作摘要。
示例:\[SUMMARY\]:\s+(.*)
将捕获日志消息中 “[SUMMARY]” 之后的所有内容,并将其用作摘要。
tsvn:logrevregex
属性定义一个正则表达式,该表达式与日志消息中对修订版本的引用相匹配。这在日志对话框中用于将此类引用转换为链接,当单击这些链接时,将滚动到该修订版本(如果该修订版本已在日志对话框中显示,或者如果可以从日志缓存中获得),或者打开一个新的日志对话框以显示该修订版本。
正则表达式必须匹配整个引用,而不仅仅是修订版本号。修订版本号会自动从匹配的引用字符串中提取。
如果未设置此属性,则使用默认的正则表达式来链接修订版本引用。
有几个属性可用于配置客户端 hook 脚本。每个属性都用于一种特定的 hook 脚本类型。
可用的属性/hook 脚本有
这些参数与您在设置对话框中配置 hook 脚本时的参数相同。有关详细信息,请参阅 “客户端 Hook 脚本” 章节。
由于并非每个用户都以相同的位置和相同的名称检出其工作副本,因此您可以通过指定存储库中的 URL 来配置要执行的工作副本中的脚本/工具,使用 %REPOROOT%
作为 URL 中存储库根目录的部分。例如,如果您的 hook 脚本位于工作副本中的 contrib/hook-scripts/client-side/checkyear.js
下,您应该将脚本的路径指定为 %REPOROOT%/trunk/contrib/hook-scripts/client-side/checkyear.js
。这样,即使您将存储库移动到另一台服务器,您也不必调整 hook 脚本属性。
除了 %REPOROOT%
之外,您还可以指定 %REPOROOT+%
。+
用于插入查找脚本所需的任意数量的文件夹路径。如果您想指定您的脚本,以便在您创建分支时,即使工作副本的 url 现在不同,仍然可以找到该脚本,这将非常有用。使用上面的示例,您应该将脚本的路径指定为 %REPOROOT+%/contrib/hook-scripts/client-side/checkyear.js
。
以下屏幕截图显示了如何为 TortoiseSVN 配置用于检查源文件头中当前版权年份的脚本。
当您想添加新属性时,您可以从组合框的列表中选择一个,也可以输入您喜欢的任何属性名称。如果您的项目使用了一些自定义属性,并且您希望这些属性出现在组合框的列表中(以避免在输入属性名称时出现拼写错误),您可以使用 tsvn:userfileproperties
和 tsvn:userdirproperties
创建自定义属性列表。将这些属性应用于文件夹。当您转到编辑任何子项的属性时,您的自定义属性将出现在预定义的属性名称列表中。
您还可以指定是否使用自定义对话框来添加/编辑您的属性。TortoiseSVN 提供四个不同的对话框,具体取决于您的属性类型。
如果您的属性只能有两种状态,例如 true 和 false,那么您可以将您的属性配置为 bool
类型。
像这样指定您的属性
propertyname=bool;labeltext(YESVALUE;NOVALUE;Checkboxtext)
labeltext
是对话框中复选框上方显示的文本,您可以在其中解释属性的用途和用法。其他参数应该是自我解释的。
如果您的属性表示多个可能的状态之一,例如 yes, no, maybe
,那么您可以将您的属性配置为 state
像这样的属性
propertyname=state;labeltext(DEFVAL;VAL1;TEXT1;VAL2;TEXT2;VAL3;TEXT3;...)
参数与 bool
属性的参数相同,DEFVAL
是属性尚未设置或具有未配置的值时要使用的默认值。
对于最多三个不同的值,对话框最多显示三个单选按钮。如果配置了更多值,它将使用一个组合框,用户可以从中选择所需的状态。
对于由单行文本组成的属性,请使用 singleline
属性类型
propertyname=singleline;labeltext(regex)
regex
指定一个正则表达式,该正则表达式用于验证(匹配)用户输入的文本。如果文本与正则表达式不匹配,则会向用户显示错误,并且不会设置属性。
对于由多行文本组成的属性,请使用 multiline
属性类型
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,您可能需要使用存储库 hook 来强制执行项目策略。项目属性只能帮助实施策略,而不能强制执行策略。
某些属性必须使用特定的值,或以特定的方式格式化,才能用于自动化。为了帮助获得正确的格式,TortoiseSVN 为某些特定属性提供了编辑对话框,这些对话框显示了可能的值或将属性分解为各个组件。
如 “外部项” 章节中所述,svn:externals
属性可用于从同一存储库或完全不同的存储库中拉取其他项目。
您需要定义外部文件夹检出为的子文件夹名称,以及外部项的 Subversion URL。您可以检出 HEAD 修订版本中的外部项,因此当存储库中的外部项发生更改时,您的工作副本将在更新时接收这些更改。但是,如果您希望外部项引用特定的稳定点,则可以指定要使用的特定修订版本。在这种情况下,您可能还希望将相同的修订版本指定为 peg 修订版本。如果外部项在将来的某个时间点被重命名,则 Subversion 将无法更新您的工作副本中的此项。通过指定 peg 修订版本,您告诉 Subversion 在 peg 修订版本而不是 HEAD 修订版本中查找具有该名称的项目。
按钮获取每个外部 URL 的 HEAD 修订版本,并在最右边的列中显示该 HEAD 修订版本。在 HEAD 修订版本已知后,只需右键单击外部项,即可获得将其显式 peg 到其 HEAD 修订版本的命令。如果 HEAD 修订版本尚不为人所知,则右键单击命令将首先获取 HEAD 修订版本。
这 3 个属性控制日志消息的格式。前 2 个属性禁用提交或锁定对话框中的 按钮,直到消息达到最小长度。边框位置在给定的列宽处显示一个标记,作为对其日志消息有宽度限制的项目的指南。将值设置为零将删除该属性。
选择在提交对话框中用于日志消息拼写检查的语言。当您在日志消息窗格中右键单击并选择 粘贴文件列表 时,文件列表复选框生效。默认情况下,Subversion 状态将以您的本地语言显示。选中此框后,状态始终以英语给出,适用于需要仅限英语日志消息的项目。
每当修订版本合并到工作副本中时,TortoiseSVN 都会从所有合并的修订版本生成日志消息。这些日志消息可以从提交对话框中的
按钮获得。您可以使用以下属性自定义生成的消息
此属性指定生成的日志消息的第一部分。可以使用以下关键字
合并的修订版本的逗号分隔列表,例如 3, 5, 6, 7
与 {revisions}
类似,但每个修订版本前面都有一个 r
,例如 r3, r5, r6, r7
逗号分隔的合并版本列表,尽可能地组合成范围。例如,3, 5-7
合并的源 URL,即版本合并的来源。
此字符串的默认值为 合并版本 {revrange} 来自 {mergeurl}:
,末尾带有一个换行符。
此属性指定每个合并版本的文本应如何显示。可以使用以下关键字
合并版本的日志消息,如同输入的内容。
类似于 {msg}
,但所有换行符都替换为空格,以便整个日志消息显示在单行上。
合并版本的作者。
合并的版本本身。
合并版本的错误 ID,如果有。
此属性指定使用 tsvn:mergelogtemplatetitle
或 tsvn:mergelogtemplatereversetitle
指定的标题字符串的位置。 如果此属性设置为 yes
或 true
,则标题字符串将附加在底部而不是顶部。
这仅在合并的版本已在日志缓存中的情况下有效。 如果您禁用了日志缓存或在合并之前未先显示日志,则生成的消息将不包含有关合并版本的任何信息。