pristine svn-base文件丢失

时间:2012-09-03 07:42:09

标签: svn tortoisesvn

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

然而,svn cleanup失败了\.svn\pristine\20\20long-namecbf.svn-base file cannot be found

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

知道我该怎么办?

7 个答案:

答案 0 :(得分:32)

这个问题:

  

找不到文件.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%值,可以检查其是否失败。

答案 1 :(得分:10)

我通过

解决了这个问题
  1. 创建一个空文件 /workingdirectory/.svn/pristine/da/da39a3ee5e6b4b0d3255bfef95601800afd80009.svn-base

  2. 运行 svn cleanup

答案 2 :(得分:8)

我通过用新签出的副本替换.svn目录而离开了。对我来说幸运的是,本地副本与repo的版本相同。如果不是这样的话,不确定会有什么影响。

答案 3 :(得分:3)

对我来说,文件在那里但是(1)附加了名称。 (复印件) ff4c7be3da460bb91144d6761cc5743536c983f4(1).svn-base

我删除了&#34;(1)&#34;和清理运行良好 ff4c7be3da460bb91144d6761cc5743536c983f4.svn基

答案 4 :(得分:2)

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

答案 5 :(得分:0)

以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 least 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.match(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." % (10 - max_times)
    print "last SVN output:"
    print svn_output

答案 6 :(得分: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