手册

附录 F. 实现细节

目录

图标覆盖层

本附录包含对 TortoiseSVN 某些功能实现的更详细讨论。

图标覆盖层

每个文件和文件夹都有一个 Subversion 状态值,由 Subversion 库报告。在命令行客户端中,这些状态值用单个字母代码表示,但在 TortoiseSVN 中,它们以图形方式使用图标覆盖层显示。由于覆盖层的数量非常有限,因此每个覆盖层可能代表多个状态值之一。

冲突(Conflicted)覆盖层用于表示 conflicted 状态,即更新或切换操作导致本地更改与从仓库下载的更改之间发生冲突。它也用于指示 obstructed 状态,当操作无法完成时可能会发生这种情况。

已修改(Modified)覆盖层表示 modified 状态,即您已进行本地修改;merged 状态,即来自仓库的更改已与本地更改合并;以及 replaced 状态,即文件已被删除并替换为另一个同名但不同的文件。

已删除(Deleted)覆盖层表示 deleted 状态,即项目已计划删除;或 missing 状态,即项目不存在。当然,丢失的项目本身不能有覆盖层,但如果其子项目之一丢失,则可以标记父文件夹。

已添加(Added)覆盖层仅用于表示 added 状态,当项目已添加到版本控制时。

在 Subversion 中(In Subversion)覆盖层用于表示处于 normal 状态的项目,或状态未知的受版本控制的项目。由于 TortoiseSVN 使用后台缓存进程来收集状态,因此可能需要几秒钟才能更新覆盖层。

需要锁定(Needs Lock)覆盖层用于指示文件何时设置了 svn:needs-lock 属性。

已锁定(Locked)覆盖层在本地工作副本持有该文件的锁时使用。

已忽略(Ignored)覆盖层用于表示处于 ignored 状态的项目,这可能是由于全局忽略模式或父文件夹的 svn:ignore 属性导致的。此覆盖层是可选的。

未版本化(Unversioned)覆盖层用于表示处于 unversioned 状态的项目。这是版本化文件夹中的项目,但本身不受版本控制。此覆盖层是可选的。

如果项目具有 Subversion 状态 none(项目不在工作副本中),则不显示任何覆盖层。如果您选择禁用已忽略(Ignored)未版本化(Unversioned)覆盖层,那么这些文件也不会显示覆盖层。

一个项目只能有一个 Subversion 状态值。例如,一个文件可能在本地被修改,并且同时被标记为删除。Subversion 返回一个单一状态值 - 在这种情况下是 deleted。这些优先级在 Subversion 本身中定义。

当 TortoiseSVN 递归显示状态时(默认设置),每个文件夹都会显示一个覆盖层,反映其自身状态及其所有子项的状态。为了显示单个摘要(summary)覆盖层,我们使用上面显示的优先级顺序来确定要使用的覆盖层,其中冲突(Conflicted)覆盖层具有最高优先级。

实际上,您可能会发现并非所有这些图标都在您的系统上使用。这是因为 Windows 允许的覆盖层数量限制为 15 个。Windows 使用了其中的 4 个,其余 11 个可以供其他应用程序使用。如果可用的覆盖层插槽不足,TortoiseSVN 会尝试做一个 “好公民 (TM)”(Good Citizen (TM)),并限制其覆盖层的使用,以便给其他应用程序一个机会。

由于有适用于其他版本控制系统的 Tortoise 客户端,我们创建了一个共享组件,负责显示覆盖图标。技术细节在这里并不重要,您只需要知道这个共享组件允许所有 Tortoise 客户端使用相同的覆盖层,因此安装多个 Tortoise 客户端不会用完 11 个可用插槽的限制。当然,有一个小小的缺点:所有 Tortoise 客户端都使用相同的覆盖图标,因此您无法通过覆盖图标判断工作副本正在使用哪个版本控制系统。

  • 正常(Normal)已修改(Modified)冲突(Conflicted)始终加载并可见。

  • 已删除(Deleted)在可能的情况下加载,但如果插槽不足,则回退到 已修改(Modified)

  • 只读(Read-Only)在可能的情况下加载,但如果插槽不足,则回退到 正常(Normal)

  • 已锁定(Locked)在可能的情况下加载,但如果插槽不足,则回退到 正常(Normal)

  • 已添加(Added)在可能的情况下加载,但如果插槽不足,则回退到 已修改(Modified)

TortoiseSVN 主页