我正在尝试做什么:
我正在将我们的远程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线程对我没有帮助。
答案 0 :(得分:1)
您说无法对远程svn repo 进行更改,因此您的选项非常有限。我想svnrdump
工具可以帮助你。
您可以远程转储修订25825-HEAD并使用svnadmin load
将其加载到您的本地仓库。
答案 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