如何验证Subversion工作副本

13

我有一个Subversion工作副本,至少有一个文件丢失(在修复树冲突时,本地副本被删除了)。很有趣,因为该文件已经版本化,在存储库中出现,树冲突的解决方案是100%本地的(在更新时发生,之后我没有提交),而且我运行了几次“svn cleanup”,但我的Subversion客户端(命令行svn和TortoiseSVN)都无法检测到工作副本已损坏。甚至还原所有更改也无法找回该文件。

我将像往常一样进行修复(在其他位置进行全新结帐并使用WinMerge复制更改);我实际上有一个不同的问题:

如何测试工作副本的有效性?

当然,您始终可以检出新副本并使用文件比较实用程序,但是...难道没有更好的方法吗?是否有一种工具来验证与svnadmin verify等效的工作副本?

=== 更新 ===

我得到了不错的答案,并有一些技巧可以防止工作副本损坏,但我的问题更多地是要找到一种方法,以确保工作副本既连贯又与实际存储库内容链接;换句话说,是svnadmin verify命令的工作副本等效物。

到目前为止,看起来:

  • Subversion没有提供这样的工具,并且可能SVN数据格式甚至不允许编写此类工具。

  • 更新到修订版本是一种似乎可以找到(和修复)某些问题的技术,虽然您经常需要向旧版本回滚和前进,我想它只能检测缺失的文件是否在修订版本范围内已更改。

  • 检出全新的工作副本似乎是唯一可靠的方法。


我曾经遇到过类似的问题 - 重命名文件夹有时会导致问题,但并非每次都会出现。通常情况下,还原操作可以将工作副本恢复到有效状态,但未版本化的项目(重命名文件夹的“复制”部分)会留下来。但是,我也希望有一个有效性检查工具。 - user180247
可能问题在于工作副本状态是有效的,只是不是你认为它应该是什么样子。例如,工作副本排除了存储库中的某些文件或文件夹是有效的。仅仅因为状态混乱并且不是你想要的,并不意味着它不能合法地出现,在这种情况下,“错误”是无法检测到的。列出任何“有趣”的内容的“此工作副本状态”工具可能更有用。 - user180247
@Steve314:工作副本的基本内容必须与存储库中的内容相同。Subversion是一种集中式版本控制系统,因此这是一个必要条件,应该可以检测到。当然,您描述的工具也很棒(例如,我想知道我是否有来自不同存储库的.svn目录),但那是另一回事。 - Álvaro González
我曾经遇到过几次缺少文件的问题(用户A添加了文件,它们在svn浏览器中显示,但是用户B的IDE不知道它们丢失了,并且在更新中被忽略)。我找到的唯一解决方案是进行完全递归的更新到版本x。 - Scott Wilson
4个回答

4

这看起来像是我之前遇到的问题:svn - 文件在工作副本中似乎“丢失”

引用wcoenen的答案:

SVN 1.6.1客户端(包括TortoiseSVN)存在一个bug,有时会错误地将文件夹设置为深度“empty”。这会导致您描述的症状。(请注意,可能是文件夹被svn 1.6.1设置为空,即使您已经升级到新的svn客户端。)

要修复它,请使用TortoiseSVN中的“更新到版本”菜单项,并选择深度“完全递归”


乍一看似乎不错。在我的测试副本中,这个方法已经恢复了丢失的文件。 - Álvaro González
虚惊一场。我在我的两个工作副本中进行了测试,它们都指向相同的位置和修订版:其中一个缺少一个有版本号的文件,“更新到修订版”无法恢复该文件(甚至没有警告有什么问题)。 - Álvaro González

2
如果你右键点击文件,在SVN菜单下应该有一个叫做Diff的命令。这将打开并突出显示本地版本和仓库版本之间的差异。
如果你愿意,也可以从命令行执行diff命令。

有意思... 如果我使用TortoiseSVN的“与URL比较差异”菜单项来比较工作副本和代码库主干,最终会收到一个错误消息:补丁文件中的路径 <i>D:/Project/working-copy/missing-file.php</i> 不存在。TortoiseMerge尝试通过去除前缀来应用补丁,但找不到匹配的路径。 - Álvaro González
@Steve314:你错过了tortoisesvn标签吗? - sbi
@sbi - 是的,看起来我在另一个问题上也错了 - 哎呀。 - user180247
抱歉,我后来添加了TortoiseSVN标签。该程序在问题中提到,但我错误地认为它与问题无关。 - Álvaro González

1

当我开始使用 Tortoise 在 Windows 上使用 SVN 时,我遇到了类似的问题。每当我需要复制一个文件夹 - 比如创建一个基于已有插件的新插件时 - 我就会在工作副本中愉快地复制+粘贴它。

我不知道的是,当你这样做时,你会连同 .svn 元数据目录一起复制。这会导致 Subversion 无尽的混乱 - 如果你使用图形客户端,新目录似乎已经被正确检入,并且客户端在每次提交后都会显示干净的界面。但是,新目录从未被检入

当你在其他地方检出新的工作副本时,你会注意到这一点,然后你就会陷入困境,因为那些文件从未受到版本控制。那时候花了我半天时间来修复它。

当你需要在工作副本中复制一个目录时,总是先导出它,然后再添加回去。


1
到目前为止,我不得不假设除非您进行新提交并比较两个目录树,否则没有可靠的方法来执行此操作。如果缺少数据但实际上未受损的 .snv 目录,则工作副本中没有足够的信息来检测某些文件已经丢失。
虽然 WC-NG 可能会改善当前格式(或者不会),但目前的格式并不是非常稳定的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接