手册

附录 F. 实现细节

目录

图标覆盖

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

图标覆盖

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

冲突 覆盖用于表示 冲突 状态,在这种状态下,更新或切换会导致本地更改与从存储库下载的更改之间发生冲突。它也用于表示 阻塞 状态,这种情况可能发生在操作无法完成时。

已修改 覆盖表示 已修改 状态,在这种状态下,您已进行本地修改,已合并 状态,在这种状态下,存储库中的更改已与本地更改合并,以及 已替换 状态,在这种状态下,文件已被删除并替换为另一个具有相同名称的不同文件。

已删除 覆盖表示 已删除 状态,在这种状态下,项目已计划删除,或 丢失 状态,在这种状态下,项目不存在。自然地,丢失的项目本身不能有覆盖,但如果其子项目之一丢失,则父文件夹可以被标记。

已添加 覆盖仅用于表示 已添加 状态,在这种状态下,项目已添加到版本控制中。

在 Subversion 中 覆盖用于表示处于 正常 状态的项目,或状态尚未知的版本化项目。由于 TortoiseSVN 使用后台缓存进程来收集状态,因此覆盖更新可能需要几秒钟。

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

当本地工作副本持有该文件的锁定状态时,将使用 锁定 覆盖。

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

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

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

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

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

事实上,您可能会发现并非所有这些图标都在您的系统上使用。这是因为 Windows 允许的覆盖数量限制为 15 个。Windows 使用了其中的 4 个,剩下的 11 个可以被其他应用程序使用。如果没有足够的覆盖插槽可用,TortoiseSVN 会尽力成为一个 良好公民 (TM),并限制其对覆盖的使用,以便为其他应用程序提供机会。

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

  • 正常已修改冲突 始终加载并可见。

  • 已删除 如果可能,将被加载,但如果插槽不足,则会回退到 已修改

  • 只读 尽可能加载,但如果插槽不足,则回退到 普通

  • 锁定 尽可能加载,但如果插槽不足,则回退到 普通

  • 添加 尽可能加载,但如果插槽不足,则回退到 修改

TortoiseSVN 主页