TortoiseSVN Logo

日志缓存和仓库 UUID

发布于 2008 年 8 月 17 日

获取缓慢或非常大的仓库的日志可能需要相当长的时间。当然,这需要您连接到仓库。如果您不在线,则无法显示日志消息 - 如果网络断开或您身处没有网络访问权限的地方,这非常令人讨厌。

为了至少部分解决这个问题,TortoiseSVN 1.5 可以缓存来自 Subversion 仓库的日志消息。该功能是透明实现的,这意味着您无需执行任何操作即可使其工作。您可能注意到的唯一一点是,一旦您显示了仓库的所有日志消息,下次打开日志对话框时速度会快很多。

如果您想测试一下,可以显示 TortoiseSVN 仓库 的日志。在日志对话框中点击“显示全部”按钮以获取所有日志消息。您会注意到获取所有消息需要一段时间。如果您随后关闭日志对话框并再次为同一个 URL 启动它,您可以点击“显示全部”按钮,所有消息都将从日志缓存中获取。

如果您无法连接到仓库,日志对话框将显示一个对话框,您可以在其中选择“离线工作”,即它不再尝试连接到仓库,而只使用缓存。
logoffline

但是,存在一个问题:日志缓存依赖于所有存储库都分配了不同的 UUID。
如果您拥有存储库的工作副本,则可以在属性对话框(资源管理器上下文菜单“属性”)中查看存储库的 UUID。
repouuid
日志缓存需要 UUID 来区分不同的存储库,因为它们当然具有不同的日志消息。日志缓存无法仅使用 URL 来区分存储库的原因是,URL 无法提供此信息。

例如,https://example.com/svn/trunk 这样的 URL 清楚地表明存储库位于 https://example.com/svn。因为我们可以假设“svn”不是项目名称。

但是,https://example.com/svn/project/trunk 这样的 URL 可能意味着它指向“project”的存储库,但也可能意味着“svn”处只有一个存储库,而“project”只是该存储库中的一个文件夹。因此,https://example.com/svn/project/trunkhttps://example.com/svn/otherproject/trunk 这两个 URL 可能指向同一个存储库,也可能指向两个不同的存储库。

这就是日志缓存必须依赖于每个存储库的存储库 UUID 不同的原因。

现在,有些人犯了一个错误,即通过简单地复制默认(空)存储库来创建新的存储库。这样做会导致所有存储库都具有相同的 UUID!是的,这是一个大错误:它被称为 UUID 是有原因的:“U”代表“唯一”。这会完全混淆日志缓存,您会经常看到崩溃报告对话框。
要解决此问题,您必须为每个存储库设置唯一的 UUID。从官方 Subversion 包中获取 svnadmin 工具,并在每个存储库上运行 svnadmin setuuid REPOS_PATH

如果您无法直接访问存储库,或者由于其他原因无法更改 UUID,则可以在 TortoiseSVN 设置对话框中禁用日志缓存:logcachesettings

在上面的屏幕截图中,您可能会注意到“允许模糊 URL”选项。既然我已经告诉您缓存依赖于 UUID 不同,那么它为什么还要依赖于 URL 呢?
比较 URL(即简单字符串)比向存储库或工作副本询问存储库 UUID 快得多。因此,如果可能,缓存也会使用 URL。例如,如果缓存知道 URL https://example.com/svn/project/trunk 指向特定存储库,它也知道 URL https://example.com/svn/project/trunk/subfolder 指向同一个存储库,因为在存储库中不可能存在存储库。

“允许模糊 URL”选项适用于同一 URL 用于不同存储库的情况,当然这种情况非常罕见。我们遇到的一个问题是与 svnbrigde 相关的。这是一个很好的工具,允许您使用 SVN 客户端访问 Microsoft Team System 存储库。但该工具的旧版本使所有存储库都可以在同一 URL 下供 SVN 客户端访问。
在我们与 svnbridge 开发人员讨论了这个问题后,他们几乎立即就提供了一个版本,该版本为不同的 Team System 存储库提供了不同的 URL。因此,使用最新版本的 svnbridge,您应该不会遇到此问题。但是,如果您由于某种原因无法更新您的 svnbridge 版本,则必须激活“允许模糊 URL”选项。