日志缓存和版本库标识符

Filed Under (TortoiseSVNBlog) by racoonwise on 18-07-2008

从慢的或者是大的版本库读取日志要花费很长时间。当然,你首先要能连接到版本库。你不能在离线的状态下得到日志,如果你的网络断了或者你在的地方根本就没有网络,那就郁闷了。

为了部分的解决这个问题,TortoiseSVN 1.5可以从Subversion版本库缓存日志。这个功能的实现是透明的,就是说不用你做任何事。你所要注意的一旦你查看过版本库所有的日志信息,下一次再看到时候就会快很多。

如果你想试一下,你可以查看TortoiseSVN repository的日志(用户名:guest,密码为空)。点击"Show all" 按钮去看所有的日志信息。你会注意到花了一会时间。如果你关联这个对话框,然后再进行同样的操作,所有的日志信息就会从日志缓存里面得到。

在你不能连接到版本库的时候,日志对话框会提示你选择"work offline",它就不会去链接版本库而只会去用缓存:

然而,有一个问题:日志缓存依赖于分配给所有版本库的不用标识符。

如果你有一个版本库的工作拷贝,在属性对话框,你可以看见版本库的标识符:

日志缓存需要标识符来区分不同的版本库。因为日志缓存不能只用URL来区别,URL不能提供足够的信息。

比如,一个这样的URL

http://example.com/svn/trunk

可以清晰的指出版本库是位于http://example.com/svn因为我们假设’svn’不是项目名字。

但是像这样的URL

http://example.com/svn/project/trunk

可以表示它的版本库是’project’,但是它也可以表示版本库是’svn’而’project’只是里面的一个文件夹而已。所以两个URL

http://example.com/svn/project/trunk

http://example.com/svn/otherproject/trunk

可以指向同一个版本库,也可以是不同的版本库。

这就是为什么日志缓存必须依赖版本库的标识符来区别不同的版本库了。

现在,一些人犯了个错误,简单复制默认的(空的)版本库来创建新的版本库。这样,所有的版本库就会有相同的标识符!这样就会使日志缓存完全混淆,并且会崩溃。

为了解决这个问题,你必须为每一个版本库设置唯一的标识符。用svnadmin命令:

svnadmin setuuid REPOS_PATH

如果你不能直接访问你的版本库或是因为什么原因不能修改标识符,你可以在TortoiseSVN设置里把日志缓存设成禁用。

在上面的截图里,你可能注意到"Allow ambiguous URLs"选项。我已经告诉过你日志缓存依赖于不同的标识符,为什么它还要URL呢?

相比之下,URL比问版本库或工作拷贝的标识符更快。所以缓存在可能的情况下也用URL。例如,如果缓存知道URL

http://example.com/svn/project/trunk

指向的是具体哪个版本库,它也知道URL

http://example.com/svn/project/trunk/subfolder

指向的是同一个版本库,因为在一个版本库里不可能还有一个版本库。

"Allow ambiguous URLs"选项是为了相同的URL指向不同的版本库设计的-这种情况非常少见,用svnbrigde的时候遇见过。svnbrigde是个很酷的工具,它可以通过一个svn的客户端访问MS Team System版本库,但是老版本会使所有的版本库通过同一个URL访问。

我们曾经和svnbrigde的开发者讨论过这个问题,他们已经有了可以为不同版本库提供不同URL的新版本。用最新版本的svnbrigde,你就不会发现上面的问题了。但是如果你不升级,你就得选上"Allow ambiguous URLs".

About the author

Stefan Küng is the lead developer of TortoiseSVN. He joined the project in the very early stages when it wouldn’t even compile yet, and he has been working on it ever since.

原文链接:http://tortoisesvn.net/node/333

Make a comment