24

我正在尝试svn update使用 TortoiseSVN 对我的 SVN 工作副本,但更新失败,要求先执行清理。

但是,svn cleanup失败也表明\.svn\pristine\20\20long-namecbf.svn-base file cannot be found.

我已经尝试释放锁,但这也不起作用。

知道我应该如何进行吗?

4

7 回答 7

43

这个问题:

找不到文件 .svn\pristine\24\24fd530d4bd82341fb514ab912c9e10adbc4ad89.svn-base

我从其他文件中复制了一个 svn-base 并将其重命名为 24fd530d4bd82341fb514ab912c9e10adbc4ad89.svn-base。并执行清理操作。之后我遇到了另一个文件丢失。使用相同的方式,最后我解决了这个问题。

从安装了 SilkSVN 的 Windows 命令行:

cd project directory
svn status

这将产生错误。选择并复制目录和文件名文本,然后粘贴:

echo > .svn\pristine\<paste>

例如:

echo > 24\24fd530d4bd82341fb514ab912c9e10adbc4ad89.svn-base

有了这些知识,编写一个可以为每个人自动修复这些问题的批处理文件将是相当简单的。svn 命令将生成一个可以检查失败的 %ERRORLEVEL% 值。

于 2013-07-23T03:07:45.040 回答
14

我解决了这个问题

  1. 创建一个空文件 /workingdirectory/.svn/pristine/da/da39a3ee5e6b4b0d3255bfef95601800afd80009.svn-base

  2. 运行svn 清理

于 2017-03-26T22:12:05.773 回答
8

我通过用刚签出的副本中的相同目录替换 .svn 目录而逃脱了。对我来说幸运的是,本地副本与 repo 的修订版相同。如果不是这种情况,不确定会产生什么影响。

于 2013-02-01T06:44:57.743 回答
3

对我来说,文件在那里,但在名称后面附加了 (1)。(一份)ff4c7be3da460bb91144d6761cc5743536c983f4(1).svn-base

我删除了“(1)”并且清理运行良好 ff4c7be3da460bb91144d6761cc5743536c983f4.svn-base

于 2014-08-03T13:41:37.050 回答
1

接受了 chunguiw 的回答并为它写了一个 Python (2.7) 脚本,以防万一有人感兴趣。

它遵循以下程序:尝试清理,解析输出,触摸丢失的文件,重复直到完成。

import os
import sys
import subprocess
import re

def touch(fname, times=None):
    with open(fname, 'a'):
        os.utime(fname, times)


svnbase_regex = re.compile(r"svn: E720002: Can't open file \'([^']+)\':")


if __name__ == "__main__":
    # Can pass SVN working copy's root folder as a parameter, otherwise runs on CWD
    try:
        root_folder = sys.argv[1]
    except IndexError:
        root_folder = "."
    root_folder = os.path.abspath(root_folder)
    os.chdir(root_folder)
    count = max_times = 10
    # Repeats file touching at most N times (the number above)
    while count > 0:
        count -= 1
        try:
            svn_output = subprocess.check_output("svn cleanup", stderr=subprocess.STDOUT)
        except subprocess.CalledProcessError, e:
            svn_output = e.output
        regex_match = svnbase_regex.search(svn_output)
        if not regex_match:
            break
        touch(regex_match.group(1))
        print "Done %s" % regex_match.group(1)
    print "Exited, fixed up %s missing entries." % (max_times - count)
    print "last SVN output:"
    print svn_output
于 2019-02-28T15:25:23.973 回答
0

您可以使用SmartSVN恢复丢失的原始文件。
下载并安装它。它不是免费的,但 30 天的免费试用应该足以修复您的存储库。 在SmartSVN
中打开您的工作副本。要修复,请选择修改>验证管理区域... 享受吧!

于 2012-10-02T07:25:55.697 回答
0

这也可以作为单线:

while [ 1 ] ; do OUTPUT=`svn cleanup 2>&1 | sed 's/^.* open file //' | sed 's/:.*$//' | sed "s/'//g"`;if [ "X${OUTPUT}" == "X" ] ; then   break; fi; echo $OUTPUT;touch $OUTPUT;done
于 2020-04-18T18:05:50.113 回答