如何在svnsync同步中跳过损坏的修订版

时间:2014-08-21 07:49:33

标签: svn revision svnsync

我正在尝试做什么:

我正在将我们的远程svn repo镜像到我当地的Win7。 因此,我正在执行this tutorial的一些步骤。

问题:

现在svnsync sync file:///c:/repository(与教程中的步骤相同)停留在大约84000的修订版25824上。

Committed revision 25823.
Copied properties for revision 25823.
svnsync: E160006: No such revision 25824

它应该只是这一个而且只是在回购中间的破坏版本。

问题:

是否可以跳过该修订版,假冒它甚至只是将其复制?

直到这次修订需要一段时间,所以请不要解决我必须从头开始的问题。此外,我无法更改远程svn回购。

在这种情况下,像How to skip initial revisions in svnsync sync (to fix broken repository)这样的其他stackoverflow线程对我没有帮助。

2 个答案:

答案 0 :(得分:1)

您说无法对远程svn repo 进行更改,因此您的选项非常有限。我想svnrdump工具可以帮助你。

您可以远程转储修订25825-HEAD并使用svnadmin load将其加载到您的本地仓库。

  1. svnrdump dump <URL-TO-REPO> -r 25825:HEAD > MyDump.txt
  2. svnadmin load C:\respository < MyDump.txt

答案 1 :(得分:0)

很多时候,现在我解决了我的问题。

我遵循了这个教程: http://www.apharmony.com/software-sagacity/2014/07/recovering-from-a-missing-svn-revision/

第一个转储必须没有--incremental和--delta选项。 将其加载到新的SVN服务器。

其余的我写了一个VBS Skript。

call dumpRevs(0, 80000)

使用 dumpRevs ,我将旧存储库转储到其他位置(并记录下来)。 VBS在旧的SVN服务器上启动。

call loadDump(newRepoPath, 0, 80000) 

使用 loadDump ,我将转储的转速加载到新的仓库。破坏的修订版被虚拟提交替换。 VBS开始使用新的SVN服务器

最后,新仓库中可能会丢失文件。因此我将它们相互匹配。要做到这一点,我检查两个repos out并将diff转移到新的repo并进行最后的提交(不要忘记在你的旧repo上对同一个版本进行虚拟提交,这样新的checkins仍然可以转储并且加载)。

call updateRepos(https:\\oldSVNServer\oldRepo\projektA, projektA) 

我使用 updateRepos 查看我的回购(大型存储库..)。

我的脚本应该只是想知道如何做到这一点。 必须设置 [] 之间的所有内容。

Function dumpRevs(revStart, revEnd)
    Set oShell = CreateObject("WSCript.shell")
    Dim rev, dumpCommand
    rev = revStart
    while rev <= revEnd
        dumpCommand = "cmd.exe /C svnadmin dump [old Repo Folder] -r " & rev & " --incremental --deltas > [dump Folder]" & rev
        oShell.run dumpCommand, 1, True
        rev = rev + 1
    wend
End Function

Function loadDump(repoPath, revStart, revEnd)
    Set oShell = CreateObject("WSCript.shell")
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Dim rev, dumpCommand, dumpFilesPath, logPath, dummyRev
    dummyRev = "cmd.exe /C svnmucc propset dummy_prop 0 -m ""increases revision"" [new Repo URL] --username admin --password admin"
    rev = revStart
    while rev <= revEnd

        dumpFilesPath = "[dumpFolder]" & rev
        logPath = "[logFolder]" & rev & ".log"
        loadCommand = "cmd.exe /C svnadmin load " & repoPath &" < " & dumpFilesPath & " > " & logPath & " 2>&1"
        oShell.run loadCommand, 1, True

        If fileContains(logPath, "Committed revision "& rev & "") = false Then
            oShell.run dummyRev, 1, True
        End If
        rev = rev + 1
    wend
End Function

Function updateRepos(repoPath, name)
    Set oShell = CreateObject("WSCript.shell")
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Dim logPath, uptodate, upCommand, cleanCommand, nr  
    uptodate = false
    nr = 1

    Do
        logPath = "C:\Temp\up_" & name & nr & ".log"
        upCommand = "cmd.exe /C svn up --username admin --password admin --non-interactive " & repoPath & " > " & logPath & " 2>&1"
        cleanCommand = "cmd.exe /C svn cleanup --username admin --password admin --non-interactive " & repoPath & " > " & logPath & " 2>&1 & ECHO cleanup >>" &     logPath
        oShell.run upCommand, 1, True

        If fileContains(logPath, "is already locked") =true Or fileIsEmpty(logPath) =true Then
            oShell.run cleanCommand, 1, True
        ElseIf (fileContains(logPath, "Request Entity Too Large") = true) Or (fileContains(logPath, "out of memory") = true) Or (fileContains(logPath, "Caught signal") = true) Or (fileContains(logPath, "At revision") = true) Or (fileContains(logPath, "The XML response contains invalid XML") = true) Then
            Exit Function
        End If
        nr = nr + 1
    Loop While fileContains(logPath, "Updated to revision") <> true 
End Function

Function fileContains(filePath, str)
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Dim tempStr
    Set objInputFile = objFSO.OpenTextFile(filePath, 1, False)  
    Do until objInputFile.AtEndOfStream
        tmpStr = objInputFile.ReadLine

        If InStr(tmpStr, str) > 0 Then
                fileContains = true
            Exit Function
        End If
    Loop
    fileContains = false
End Function

Function fileIsEmpty(filePath)
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Dim size
    Set ofile = objFSO.getfile(filePath)
    size = ofile.size
    If size < 30 Then
        fileIsEmpty = true
        Exit Function
    End If
    fileIsEmpty = false
End Function