【问题标题】:How to skip broken revision in svnsync sync如何在 svnsync 同步中跳过损坏的修订
【发布时间】:2014-08-21 07:49:32
【问题描述】:

我想要做什么:

我正在将我们的远程 svn 存储库镜像到我的本地 Win7。 因此,我正在遵循this tutorial 的一些步骤。

问题:

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

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

它应该只是这个,并且只是在 repo 中间损坏的修订版。

问题:

是否可以跳过该修订版、伪造它甚至只是复制损坏的版本?

这个版本花了一段时间,所以请不要解决我必须从头开始的解决方案。我也无法更改远程 svn 存储库。

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

【问题讨论】:

    标签: svn revision svnsync


    【解决方案1】:

    您说您无法更改远程 svn 存储库,因此您的选择非常有限。不过,我想svnrdump 工具可以帮助您。

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

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

    【讨论】:

    • @besnep 1. 尝试最新的 Subversion 1.8.10 命令行工具 2. svnsync 应该给你与svnrdump 相同的“安全连接被截断”错误。如果您遇到不同的错误,则需要进行调查。
    • 我没有让它工作。但我的情况发生了变化。我现在可以完全访问 svn repo 和它运行的 windows + apache 服务器。此外,我现在想修复 repo,以便修订版 25824 不再被破坏。但是新情况不再适合这个线程。感谢您的帮助。
    【解决方案2】:

    很多时间过去了,现在我解决了我的问题。

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

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

    剩下的我写了一个 VBS 脚本。

    call dumpRevs(0, 80000)
    

    使用 dumpRevs 我将旧存储库转储到其他地方(并记录它)。 VBS 在旧的 SVN 服务器上启动。

    call loadDump(newRepoPath, 0, 80000) 
    

    使用 loadDump 我将转储的转速加载到新的仓库中。损坏的修订被虚拟提交替换。 VBS 在新的 SVN 服务器上启动

    最后,新仓库中可能会丢失文件。因此,我将它们相互匹配。为此,我检查两个存储库并将差异转移到新存储库并进行最终提交(不要忘记在旧存储库的同一修订版上进行虚拟提交,以便仍然可以转储和加载新签入) .

    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
    

    【讨论】:

      猜你喜欢
      • 2011-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-18
      • 2015-02-01
      • 2011-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多