TortoiseSVN Logo

TortoiseSVN FAQ

感谢Subversion中文站的中文化翻译小组翻译本页。

目录

安装 & 升级

覆盖图标:

一般问题:

怎样才能……

错误信息


安装与升级:

在升级TortoiseSVN之前, 是否需要卸载已安装的版本?

不,你只需要用新的版本覆盖旧的版本即可,安装程序会自动卸载旧的版本。 但是,你必须在安装完成以后重启计算机!或者注销以后重新登录操作系统。

安装TortoiseSVN是否需要管理员权限?

是,你不得不使用管理员账号去安装 TortoiseSVN,或者你 具有 管理员的安装权限。

但当TortoiseSVN安装完成以后,就不再需要管理员权限了。

在使用TortoiseSVN之前,是否需要安装Subversion?

不,TortoiseSVN 具有所有访问版本库的能力。仅当你需要创建版本库的时候才需要安装Subversion。

怎样卸载 TortoiseSVN?

在控制面板中的添加或删除程序里选择删除即可。这个操作完全不会影响到你的版本库或者工作拷贝。

我的电脑上关闭了 MSI 安装模式。 是否存在 .exe 安装文件?

exe的安装文件对此也无能为力。如果你的机器已经禁止了msi安装,那么你也应该是没有管理员权限,这是安装TortoiseSVN的必要条件(安装的shell扩展需要管理员权限)。你首先要做的就是确保msi安装是否已经被关闭 - 这只能是你的域管理员屏蔽了这个能力。

为什么使用 MSI 代替其他安装方式?

我们使用 MSI 代替其他安装方式有如下一些原因:

  • 它是开放的。所有人都可以通过 MSI 工具(比如Orca)看到我们做了些什么.
  • 可以根据你的需求非常简单的调整已经存在MSI文件,有很多工具可以让你手工修改MSI文件,但你不能对exe安装文件做同样的事。
  • 它需要系统管理员权限才能运行,并不仅是系统管理员账号。这是非常重要的,因为TortoiseSVN是一个shell扩展,它需要我们去创建或者修改注册表的键值, 普通用户并没有权限做到这一点(特别是在打开UAC的Vista上)。
  • 可以非常简单的通过GPO分发MSI给同一个域上的不同用户或主机。所有的其他安装方式都需要系统管理员先进行‘打包’操作,而MSI自己已经做好了这一切。
  • MSI 是一个安装 Windows 应用程序的标准和推荐的方法。它现在更是从Microsoft取得 "Vista认证"。
  • WiX 是一个非常强大的创建MSI文件的开源软件工具,这也是我们正在使用的。
  • MSI 非常小心的处理安装模块的引用计数以避免所谓的 dll hell
  • 我们不得不通过安装包注册包括shell扩展的TortoiseSVN。一个简单的exe文件根本不可能做到这一点。

安装终止的错误信息

有许多原因可能导致安装不成功:

  • "This installation package is not supported by this processor type. Contact your product vendor." 这是说你试图将64位的TortoiseSVN安装到32位的操作系统上。你需要下载和使用正确的MSI文件。对于32位的操作系统,请确定MSI文件名里没有x64
  • "The installer was interrupted beforeTortoiseSVNcould be installed. You need to restart the installer to try again"然后用户在 MSI 文件的位置就丢掉正确的读和运行的权限。也不能把 MSI 文件移动到其他的地方或者给用户SYSTEM 读和运行的权限
  • "The Windows installer service could not be accessed" 这个可能在你运行 Windows 安全模式的时候出现,或者说 Windows installer 没有被正确的安装。对于这种类型的错误信息,请核实 Microsoft Knowledgebase 的文章 Q315346 (基本上确定 MSI 文件夹没有加密或者被压缩即可)
  • "The system can not open the device of file specified", 紧接着通常是 "The installer has encountered an unexpected error installing this package. This may indicate a problem with this package. The error code is 2755". 出现这种错误信息需要:
    • 安装程序没有权限访问临时文件夹,或者系统设定的临时文件夹没有清理,或者说没有足够的空间来完成安装。
    • 安装程序映射网络驱动器的时候溢出终端服务器
    • 安装程序没有对 Windows 环境变量设置的安装目录创建和写的权限。
    要解决这个问题,清空临时文件夹,将 MSI 文件移动到有完整权限的系统硬盘上。下面的这些文档可能会有些帮助:
    • 220780 OFF2000: Setup Error 2755 with Earlier Office Version Installed
    • 217714 OFF2000: Setup Appears to Stop Responding, Followed by Internal Error 2336 or 2755
    • 254841 OFF2000: Internal Error 2755, When You Try to Install from a Remote Windows Terminal Server Client
    • 305640 PRJ2000: Internal Error 2381 or Internal Error 2755 When You Install Microsoft Project
  • "This installation package cannot be installed by the Windows Installer service. You must install a Windows service pack that contains a newer version of the Windows Installer service. 你至少需要的版本3的msi安装程序

安装完成后,TortoiseSVN不能显示,没有可以使用的菜单

如果你使用64位的 XP 或者 Vista,请确定你已经安装了x64版本的 TortoiseSVN。因为这些操作系统上的资源管理器是64位的应用程序,它不能加载32位的TortoiseSVN.

虽然你可以在这些64位操作系统上安装32位的 TortoiseSVN,但是它将显示32位应用的 file-open/save 会话。

覆盖图标

为什么没有覆盖图标?

  • 你是否在安装之后重启电脑?你竟然现在都还没重启。TortoiseSVN是windows资源管理器的Shell扩展, 他将会和资源管理器一起启动。
  • 去TSVN的设置界面然后至少要激活图标覆盖的修改驱动功能,安装程序会自动为当前用户激活图标覆盖功能(不会自动为其他用户激活……) 但是由于你不是通过安装用户来使用 TSVN,所以你需要手工激活图标覆盖功能。

不是所有的图标都被覆盖!

你或许会发现在你的系统上不是所有的图标都被使用,这是因为Windows只允许最多15个图标被覆盖。Windows使用了其中4个,剩下的11则被其他的应用程序所使用。如果你同事在使用 TortoiseCVS,那么就不会有足够的位置,那么TortoiseSVN设法做一个“好公民(TM)”?限制了图标的使用把更多的机会留给其他的应用。

  • 一般来说,修改和冲突总是被加载和可看见的。
  • 如果可能,删除会被加载,但如果没有足够的位置会使用修改状态。
  • 如果可能,只读会被加载,但如果没有足够的位置会使用一般状态。
  • 只有少于加载13个图标覆盖,锁定才会被加载。否则会使用一般状态.
  • 只有少于加载14个图标覆盖,添加才会被加载。否则会使用修改状态

为什么图标只在本地磁盘上显示,而不能在网络磁盘上显示?

Go to the Settings -> Look and Feel -> Icon Overlays 为你想看到的覆盖图标检查驱动器类型。要注意到,使用图标覆盖会使整个系统都慢下来,不仅仅是TortoiseSVN。

为什么图标覆盖会在SUBSTed驱动器上被弄乱?

如果你的工作拷贝在SUBST驱动器上,图标可能会被弄乱。

出现这个错误是因为缓存会设法在同一时间在两个不同位置读取状态。但是这些位置事实上却是相同的,所以在同一时间的相同工作拷贝读取了两个状态。

有一个简单的办法解决这一问题:只需要在显示覆盖图标的位置排除掉原始目录(settings->icon overlays->exclude paths).

比如说,如果你映射\\station\folder\wc到g: ,将位置"\\station\folder\wc*"加入到排除模式中。

为什么图标覆盖显示错误状态?

有些时候你发现图标覆盖并不能反映文件或者文件夹的正确状态。通常,敲 F5 就可以使图标回到正确的状态(你可能需要等上几秒,直到缓存重新找到正确的状态)。

资源管理器左边的树状图完全是另外一回事。它不会更新图标,不管你敲多少次F5。这是因为资源管理器并不能让TortoiseSVN访问。

一个简单的说明:树状图的显示始终来自于整个资源管理器,包括网路驱动器和其他的命名空间的扩展,由于这些会非常缓慢(比如一个慢的网络驱动器),资源管理器不能一直请求图标覆盖更新图标,即使你告诉资源管理器文件夹已经修改,应该依照图标覆盖来更新图标,它仍然不会工作。首先检查文件夹是否真的已经修改,如果资源管理器认为文件夹真的已经修改,才会更新这些图标。

现在,由于文件夹的Subversion状态和它自身状态没有关系,文件夹自身并没有被真正的修改(修改的是一些在.svn文件夹里的文件),因此资源管理器并不能更新图标。

这里有一些让资源管理器甚至是资源管理器左侧的文件树刷新图标的小技巧和应急方案,但这些技巧和应急方案显然不能实施可可都工作。

一个通常使用的小技巧,但是它很慢,TortoiseSVN也不能立刻使用,它将使得整个系统缓慢许多。但是你可以通过工作拷贝管理员账号使用'cleanup'命令手动激活。当清除命令执行完成以后,你不得不等待几秒让目录树更新这些图标。

为什么图标覆盖有时会变成一个随机图案?

Windows图标缓存有很多bug。可以使用下面的方法解决这个问题:

  • 安装Microsoft的TweakUI 通过选项来重新创建图标。
  • 或者增加图标缓存。到HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer 增加一个新的字符串 Max Cached Icons。他的默认值为500 - 尝试增加到2048(见微软知识库的Q132668)。
  • 或者在Windows目录下删除ShellIconCache文件,然后重启计算机。
  • TortoiseSVN 1.3.0以后的版本,你可以在命令行调用TortoiseProc重建图标缓存,TortoiseProc.exe /command:rebuildiconcache

一般问题:

鼠标右键点击文件时CPU占用100%

每次右键点击文件,CPU飙升到100%(同时右键菜单被显示。)如果从菜单中选择某项,则CPU又恢复正常;如果在空白处点击右键,CPU将不会有问题,到底是怎么回事?

XP包含了一个已知的bug,当你在特定的配置文件下访问上下文菜单会引起cpu占用上升到100%。这个bug会使文件复制暂停,使网络连接缓慢,流媒体(声音,视频)扭曲。 为了工作在包含这个 bug 的环境下,你需要通过以下操作禁止图形界面的传输效果:

  1. 控制面板->显示
  2. 选择外表栏
  3. 点击效果,然后清空“为菜单和工具提示使用以下过渡效果”栏
  4. 点击确定关闭所有的对话框。

另一种解决方法是在点击右键显示上下文菜单前点击一次左键。

是否可以创建一个本地的版本库到网络文件夹?

不能创建 Berkeley DB 版本库到共享的网络地址!

BDB 版本库 不能 存在于远程文件系统,比如NFS,AFS,或者Windows SMB。 BDB要求文件系统运行在严格的POSIX语义环境,更重要的是,将文件直接映射到进程内存的能力。很多没有网络的文件系统都提供了这个功能。 如果你尝试在网络共享中使用BDB,结局是不可预知的。你可能会立刻看到诡异的错误,或者在几个月以后,你发现版本库隐约被毁坏。

你可以使用 FSFS 格式的版本库但只有一个用户可以访问本地硬盘,接下来的FAQ项目会讲到为什么共享版本库是一个坏想法。 除非你真的有迫切的原因让你的文件放到网络共享,通常来说,最好的办法就是避免这样做。

如果你真的需要通过网络共享访问FSFS版本库,你应该按照下面的其中一点来做:

  1. 用下面的语法规则来映射网络驱动器:
    将//server/shared映射到S:
    file:///S:/repos (盘符前有三个斜杠)
  2. 通过下面的格式指定一个UNC直接路径:
    Subversion >= 1.2
    file://server/shared/repos (2个斜杠)
    Subversion < 1.2 (奇怪的语法,我们知道)
    file://///server/shared/repos (5个斜杠)
    file:///\server/shared/repos (3个斜杠+反斜杠)

但是不要说我们没有提醒过你……

是否可以将版本库保存在网络共享驱动器来代替创建服务器?

如果你需要多个电脑访问版本库,在理论上你可以创建 FSFS 版本库(但不能是 BDB 版本库)在网络共享驱动器上,通过已下格式访问 file:// protocol。事实上这里有三个不推荐的原因:

  1. 你将给所有用户直接访问权限,所以他们会有可能偶然的删除或者破换版本库文件系统。
  2. 并不是所有的网络共享协议都支持Subversion要求的锁定。总有一天你会发现你的版本库被悄悄的破坏。
  3. 你不得不设置正确的访问权限,SAMBA 在这一点上特别难以满足。

更好的办法是创建一个真正的服务器进程(像Apache,svnserve),存储版本库到当地的文件系统上,使版本库服务器可以在网络上有效,可以被访问。这也许会比你想的要简单。Subversion书中 第6章 服务器配置 有详细的方法说明。

是否可以使用不同的Subversion客户端来操作同一个工作拷贝?

可以,客户端只是用来控制你的工作拷贝,以及工作拷贝与版本库之间的交互。工作拷贝里的元数据对于不同的客户端来说都是一样的。

但是,必须是使用同一版本Subversion库的客户端。TortoiseSVN 所使用的Subversion版本会在安装文件的文件名里标明,其它的客户端也会有类似说明。版本号的头两位数一致的客户端才能通用。例如,所有使用Subversion1.5.x 的客户端都可通用(‘x’表示此位数字不影响兼容性)

你还必须确保这些客户端都是为同一个操作系统编译的。客户端兼容的前提是必须是同一种操作系统,并且元数据的表示方式可能发生变化。你不可以 对同一个工作拷贝同时使用Windows的原生客户端和Cygwin的客户端。如果是通过网络共享的工作拷贝,你不可以 同时使用Windows的客户端和Linux的客户端。

TortoiseSVN能实时自动转换文本文件中的换行符吗?

请到查看Subversion书中关于svn:eol-style属性的内容。 比如说,如果你将此属性设置为‘native’,在 Linux 下它就会以LF作为换行符, Windows 下则是 CRLF。想了解如何通过TortoiseSVN设置这些属性,请到 这里 阅读我们的文档。

如果冲突是在一个文件夹的属性里,怎样找到它呢?

在属性有冲突的文件夹里,有一个dir_conflicts.prej文件,用文本编辑器打开它,你会看到有冲突的属性,用你想保留的属性覆盖有冲突的。

我误删了一个文件,怎么找回来?

如果你还没提交,你可以在被删除的文件/文件夹的父文件夹作 还原 操作。

如果你已经提交了删除文件,你可以使用版本库浏览器,回到那文件还存在时的版本,然后在上下文菜单中使用 拷贝到…… 命令,输入你工作拷贝的路径作为目标路径,被删除的文件就会从版本库复制到你的的工作拷贝。

用这个方法也可以恢复被删除的目录。

如果用这个方法恢复文件/目录后,日志对话框无法显示它的修改历史,别担心,历史信息还在的。在 SVN 中复制一个文件时,它的历史信息会同时被复制。但TortoiseSVN的查看日志功能默认是“Stop on copy”,即当你查看的日志是由分支点开始的。之所以这么做是因为当查看一个真正的分支时,你多数只是想知道那个分支的历史信息。如果要看完整的历史信息,你可以不选 'Stop on copy',而把‘Get All’选上。

为什么我右击一个链接的时候有几个TortoiseSVN菜单?

这是正常的,其中一个是针对链接本身(.lnk-file 文件),另外一个针对它指向的文件。这样既可以对一个链接文件进行版本控制,又可以对它指向的目标进行控制。事实上在文件菜单里你会有多达三个菜单(上下文菜单只显示二个)。

能不能像 Visual Source Safe 一样使用‘共享文件’?

Subversion中不能共享一个文件,但可以共享一个文件夹。请查看 Subversion Book外部定义一章。

没有服务器,可以单独使用 TortoiseSVN 吗?

可以,你可以用file://协议来访问你的本地版本库。

使用TortoiseProc时可以发送用户名和密码吗?

TortoiseSVN 是一个 图形化客户端,它会在需要的时候提示你输入用户名和密码。如果你想以非交互方式访问版本库,可以使用命令行客户端。

版本分支图是怎么一回事?

版本分支图跟TortoiseSVN的其它功能不一样。它可以显示一个文件或文件夹的所有历史修订,包括拷贝、移动、分支和加标记操作。

我们经常会被问到“为什么要把版本库根目录的日志也拿下来”,或者是“为什么会需要取由第一次修订到最新一次修订的全部日志呢”

我得澄清一点:这可不是因为我们太懒,或是笨到不会优化——尽管你们有些人似乎就是这么暗示的。我们这么做其实是有必要的。

版本分支图是通过查找针对某个对象的所有修订,来呈现它的历史的,这需要用到所有的可用信息。

如果查看选定文件/文件夹的日志,在日志对话框的下半部分你可以看到选中的修订影响到的所有路径,这就是在版本分支图用到的信息。如果查看/trunk的日志,你会发现里面没有记录加标记或分支的日志,就算是对/trunk本身加标记、作分支也不会有。 --> 这就是取版本库根目录日志的用意:只有版本库根目录日志才包含这些所需信息,包括一个目录何时曾被复制、分支、打标记或移动到何处。

沿用前面的例子,如果我们不取所有修订的日志,而只取一部分的,那就有可能丢失/trunk作分支、打标记的日志。而且即使那些分支、标记本身做过修改,或者那些日志也在取下的部分里,版本分支图也无法知道那些分支、标记操作是在/trunk还是别的路径发生的。这意味着,版本分支图不单是不完整的,还有可能是错的。

因此我们不会去做所谓的“优化”,如果这个图一时正确一时错误,而且你还无从判断它是否正确、什么时候正确,这比完全没用的东西更糟糕。

通过 svn+ssh 提交时,为什么日志里没有‘作者’信息?

因为是 SSH 全权处理验证过程,所以Subversion根本不会知道是谁提交的。如果要告诉Subversion作者是谁,你可以在 URL 中指定,像这样 svn+ssh://[email protected] 。你应该在签出工作拷贝时这么做。

为什么TortoiseSVN识别不了一个文件被修改过?

如果你改了一个文件,但是TortoiseSVN没识别到,请检查该文件是不是确实跟你工作拷贝中的不一样。

如果你确定该文件已经修改过,但在提交对话框中却没有显示为已修改,请确保:

  • 文件的最后修改日期发生了改变(有些工具比如十六进制编辑器会重设这个值)
  • 如果设置了 svn:eol-style 属性,而所作的改动又只是添加删除一些空行的话,Subversion 会认为该文件没有被修改过

Subversion 是这样判断一个文件是否被修改过的:

  1. 最后修改日期和/或文件大小是否已改变?
  2. 如果否,则视为未修改
  3. 如果是,将文件内容与 BASE 文件进行比较
  4. 找到第一个有差异的字节时停止,将文件标为已修改
  5. 如果找不到有差异的字节,将文件标为未修改

删除一个文件后,它就不存在了,那我怎么提交呢?

很简单,提交整个目录。资源管理器窗口中, 去到文件所在文件夹, 右键 然后 提交。提交对话框会显示你的所有修改,包括添加或删除文件。

日期变成乱码了,甚至在签出/更新时会崩溃!

这通常在安装 XP SP3 后发生,按下面的步骤修正:

  1. https://support.microsoft.com/kb/914387下载tzedit.exe
  2. 运行 tzedit.exe
  3. 从列表中选择你的时区(我收到的所有崩溃报告都是来自“耶路撒冷”时区的,大概你会选这个吧)
  4. 点击“编辑”
  5. 点击“确定”

怎样才能……

……为我的文件添加关键字信息,比如作者、版本、日期、提交日期?

请阅读Subversion书中关于svn:keywords属性的说明。

在TortoiseSVN中,这样 设置。

……改变文件名的大小写?

Subversion 是针对大小写敏感的文件系统(比如 Linux )设计的,这在大小写不敏感的Windows下有时就会有问题。一个典型的例子是,重命名文件时,如果文件名仅有大小写不一样,如Makefile改成MAKEFILE。在工作拷贝中要这么干就有困难,因为Subversion在很短的一瞬间内需要让这两个名字并存,而Windows没办法支持。

目前为止最简单的方法是用版本库浏览器来重命名:

  1. 提交工作拷贝中的更改。
  2. 在版本库浏览器中将文件名由UPPERcase改为upperCASE。
  3. 更新你的工作拷贝。

……在提交后更改日志信息或者作者?

调出日志对话框,在你要编辑的修订上 右击 ,然后在弹出菜单中点“更改作者”或“更改日志消息”。要服务器接受此项更改,版本库要装一个 pre-revprop-change 钩子程序,它可以让服务器允许修改作者或消息,默认安装是不允许修改这两项信息的。

……清除TortoiseSVN里下拉列表的内容?

你可以在TortoiseSVN的设置对话框里删除所有保存的数据,点击相应的按钮即可。

……从计算机中彻底删除一个版本库?

选中文件夹,然后按下键盘上的‘删除’键。

完全没有什么隐藏的文件或设置,版本库所需的全部文件都在一个文件夹里。

工作拷贝也一样。如果你把一个工作拷贝删除到回收站里,将来彻底删除时可能会很慢,因为包含了大量的小文件,尽早清空回收站比较好。

……将日志导出为文本文件?

使用日志窗口。只需选定你要的条目,按 Ctrl+C,再 Ctrl+V 粘贴到文本编辑器。

若是需要自动化处理日志信息或者想要XML格式的,你可以使用命令行客户端。

……在我的项目中使用修订版本号?

若要将修订版本号放到你的程序的版本信息里,你需要另外一个工具。你可以在我们网站的下载页面或者TortoiseSVN安装目录的bin下找到SubWCRev.exe

这个工具会遍历你的整个工作拷贝,找到最高的修订版本号,来替换下面的:

$WCREV$
这个字符串将会用你工作拷贝的修订版本号替换
WCMODS?Modified:Not modified$
如果你在本地作了修改,就会插入问号和冒号之间的字符串;如果没有,则插入冒号和美元符号之间的字符串。在我们上面的例子中即分别是ModifiedNot modified
$WCDATE$
将会用你工作拷贝的最新修订日期替换

举个例子,请看 TortoiseSVN 代码树version.in 文件,这个文件在TortoiseSVN及它的资源文件中用到。在编译脚本中这样调用 SubWCRev.exe 工具: SubWCRev.exe path\\to\\working\\copy version.in version.h 将会创建一个新的文件 version.h,文件中出现的所有上面提到的字符串都会用工作拷贝的实际值来替换。version.h 会放在项目的资源文件里,用来描述版本信息。

……禁止Subversion自动合并?

有些人不喜欢Subversion 在更新时自动合并其他人的修改和自己的本地修改,如果要强制这些文件为冲突状态,之后再自己手工合并,可以这么做:

  1. 在TortoiseSVN-> 设置 ->Subversion配置文件, 点编辑按钮
  2. 修改 [helpers] 部分,添加
    diff-cmd = "C:\\false.bat"
    diff3-cmd = "C:\\false.bat"
    (注意,有两个反斜杠)
  3. 创建文件 C:\false.bat,输入两行
    @type %9
    @exit 1

这可以令自动合并总是失败,从而强制文件变为冲突状态。

写上 'type %9' 这行是因为 diff3-cmd 会将合并结果输出到标准输出,然后Subversion会以这个合并结果覆盖你的本地文件。写上这句,你的本地文件就不会变成一个空文件。

……我当前是在哪一个沙盒/版本库?

在工作拷贝中,右击文件夹,在弹出菜单中选择“属性”,在属性对话框中跳转到“Subversion”标签页,你可以看到关于此文件夹的所有信息,包括它指向的 URL。

另一个快速的方法是,在右键菜单中点选“重新定位”,第一个 URL 就是。当然你并不是想重新定位你的工作拷贝,取消这个对话框就行了。

……静默/自动安装 TortoiseSVN?

这样运行 MSI 安装程序:

msiexec /package TortoiseSVN.msi /quiet INSTALLDIR="path/to/install/dir"

错误信息

无法复制/移动‘XXX.svn-base'到'XXX.tmp':系统找不到指定文件。

这个错误信息通常在你更新工作拷贝时出现,可能的原因有两个:

  • 版本库中有两个文件的名字只是大小写不同,这在Windows下是允许签出的,因为Windows的文件系统是大小写不敏感的。很可能其中一个文件是误添加的,所以你要找出是哪一个,然后删除它,以确保不会把更改提交到错误的文件。
  • 某个文件的文件名是非法的(对Windows来说非法),比如,"con", "lpr", "com"都是非法的,因为这些都是设备名。当然,含有"/\*?:|"和其它特殊字符在Windows(NTFS 和 FAT)也是不允许的。

是,我们知道这个错误信息对解决问题没什么实质性的帮助,但这个错误信息是来自Subversion库的,我们改不了。

有几个办法可以避免这个问题,请看 这里

无法打开文件'XXX\nnn-n.txn\changes':无法访问,文件正被其它程序使用。

通常报告这个错误的人都说这个问题是随机发生的,并且通常会在一次大的提交中发生。重新提交可能成功,也可能在别的地方出错。

最有可能的原因是,有一个病毒扫描程序正在非正常地占用这个文件。你可以试着禁用病毒扫描,或者让它忽略你的版本库文件。

类似的错误也可能发生在你的工作拷贝,试试让它忽略 .svn 文件夹。

添加‘XXX’失败:同名对象已存在。

这个错误通常是在你更新工作拷贝时发生。之所以抛出这个错误是因为Subversion绝对不会擅自删除或者覆盖你已有的本地文件。有三个可能原因会导致这个错误:

  1. 你有一个未纳入版本控制的本地文件,名字跟其他人已添加的文件一样。这种情况下你可以先移走或者重命名你的本地文件再更新。之后你可以决定是需要合并还是把你的文件改个名字。
  2. 版本库中的一个文件被重命名了,但只是大小写不一样,如 Install.txt 改为 install.txt,而你在本地作了修改。当你更新时就会遇到第一种情况,你修改过的本地文件被视为未纳入版本控制。将它移到其它地方,再更新,问题解决。
  3. 版本库中有两个文件的名字只是大小写不同,这在 Windows 下是 允许签出的,因为 Windows 的文件系统是大小写不敏感的。很可能其中一个文件是误添加的,所以你要找出是哪一个,然后删除它,以确保不 会把更改提交到错误的文件。

OPTIONS of '<path>': 401 Authorization Required <url>

升级到 1.4.x 版之后,你发现无法访问版本库了,每次都出这个错: OPTIONS of 'path': 401 Authorization Required 'url'

这是因为 1.4.x 版使用了 SSPI 自动验证,即TortoiseSVN会自动使用登录 Windows 域控制器的用户信息来作身份验证。

如果你设置你的服务器以 SSPI 的方式向域控制器作身份验证,而域控制器又没开放 GUEST 用户的话,不会有问题。但是如果开放了 GUEST 用户,自然所有以 GUEST 用户进行的验证都会通过——但是一般来说你是不会授权 GUEST 访问你的版本库的。这就造成了 验证 通过了,但 授权 不成功。

另一个失败的原因是,你设置用来访问版本库的用户跟你用来登录工作站的用户不一致(那我就奇怪了,如果是这样你根本就不应该以 SSPI 方式来验证呀)。

有几个方法可以解决此问题:

  • 在域控制器中禁用 GUEST 用户
  • 将登录工作站的用户和访问版本库的用户设为一样
  • 不用 SSPI 来做版本库验证
  • 检查用户名的大小写,将控制文件中的用户名改为小写对解决问题也可能有帮助

客户端版本太旧,不能操作工作拷贝‘XXX’

完整的错误信息是:客户端版本太旧,不能操作工作拷贝'.';请下载更高版本的Subversion客户端。

当先使用一个比较高版本的Subversion客户端,然后又用比较低版本的客户端来执行命令,就会发生这个错误。比如你先用了 1.4.x 版的客户端操作工作拷贝,然后用 1.3.x 版的操作同一个工作拷贝。

这是因为Subversion1.4 和 1.5 会自动更新工作拷贝的格式,而老版本的客户端不认新的格式。

唯一的解决办法是升级你的客户端,或者用你老版本的客户端重新签出。

工作拷贝已过期

这个错误是在提交修改的时候出现的,通常是因为在版本库里,你想要提交的文件已经被其他人修改了。

这时你要先用 更新 命令更新的的工作拷贝到版本库当前的版本。

你可能会不明白为什么要这么做,尤其是在你 确知 版本库并没有被修改过的情况下。答案很简单,因为提交的时候,并不会彻底更新你的工作拷贝,而只是那些修改的文件会被自动更新。举个例子,有个新建的版本库:

Add Folder in revision 1
Add File1 and File2 in revision 2
Modify File1 and commit in revision 3

现在版本库处于修订版本 3,但你的工作拷贝的版本会是这个样子:

Folder     : revision 1
Folder/File1 : revision 3
Folder/File2 : revision 2

这时如果你修改 File2 然后提交,就会失败。因为客户端告诉版本库 File2 是在版本 2 的基础上作修改的,但是版本库已经处于版本 3 了。如果此时你执行更新命令,就会将 File2 也变成版本 3 (当然,你的本地修改还会在的)。

这个错误还可能在你试图创建分支或标记时出现。答案永远都是:如果工作拷贝已经过期,那就更新呗!

无法写到标准输出

TortoisePlink 使用的是标准的 plink 代码,但不是针对 Windows 编译的,因而无法正常发送错误信息。在 TSVN 的设置 -> 网络里,将 SSH 客户端指向标准 plink,错误信息就会输出到一个命令行窗口中。设置好之后再像之前一样运行 TortoisePlink。

“无法写到标准输出” 表示 Plink 想要抛出一个错误,但是因为 TortoisePlink 并没有提供一个 DOS 窗口,所以就没没有标准输出来接收这个错误信息。

知道是设置有问题后,可以先使用普通的 plink 程序,看到底是什么错误,解决它。

如果普通 plink 挂住了,那就是参数不对(设置 -> 网络)。

另一个可能是 SSH 后台程序找不到 svnserve 可执行文件。以你将要使用的用户(此处为 myuser)登录到服务器,输入 "which svnserve",如果没有显示指向可执行文件的路径,就把该文件(以及其它 Subversion可执行文件)设为对于该用户可全局访问。

400 服务器未能理解请求(400 Bad Request)

REPORT request failed on '...' REPORT of '...': 400 Bad Request (http://...)

你的 DAV 请求被防火墙阻止了,多数防火墙都会这么这么干。你可以让你的管理员更改防火墙的设置,或者以 https 访问,如 https://svn.collab.net/repos/svn/ ,这样你与版本库之间的通信是经过 SSL 加密的,防火墙无法阻止(如果它没有封掉 SSL 端口的话)。

另外,现已确认某些病毒扫描程序(如卡巴斯基)也会导致这个错误。

403 对被请求页面的访问被禁止(403 Forbidden)

PROPFIND request failed: 403 Forbidden

这有可能因为你试图访问版本库的父目录(而不是版本库本身)。你可以试着在 URL 尾部指定版本库的名字,还有别忘了名字后面的斜杠 ‘/’。

有关导致此错误的真正原因,请查看 Apache 的错误日志。

405 HTTP Method Not Allowed

PROPFIND Request Failed - Error 405 HTTP Method Not Allowed

这个错误有几种形式,可能的原因有以下几个:

  • PROPFIND Request Failed 你试图使用较低版本的TortoiseSVN浏览版本库的父目录。你可以试着在 URL 尾部指定版本库的名字,或者升级TortoiseSVN到 1.2.3 版或更高。
  • PROPFIND Request Failed 你漏了 URL 末尾的斜杠 ‘/’,较旧版本的 TSVN 要求在版本库名字后必须有斜杠,否则它会砍掉版本库名字,等于试图去访问它的父目录。
  • PROPFIND Request Failed 你可能正尝试通过一个不允许 DAV 请求的代理访问版本库。通常你用网页浏览器浏览版本库是没问题的,只在使用 svn 客户端时才出错。你必须配置你的代理服务器或防火墙,以让 DAV 请求通过,或者使用 https 来访问,多数代理服务器无法分析加密过的信息包,因而也就无法阻止 DAV 请求了。
    另一个可能是你正在运行病毒扫描程序或防火墙,很多此类软件会在你根本不知道的情况下就阻止了 DAV 请求,可以试一下禁用它们。
  • Lock Request Failed 你尝试在工作拷贝中锁定一个文件,而这个文件在版本库中已经不存在了。你需要先更新工作拷贝。

有关导致此错误的真正原因,请查看 Apache 的错误日志。