Восстановление сервера VisualSVN из клиентской копии - PullRequest
1 голос
/ 04 марта 2010

Я использую VisualSVN на виртуальной машине Windows. ВМ разбилась и испортила образ. После восстановления старого образа (2007 г.) мы обнаружили, что резервное копирование данных не работает должным образом. Поэтому у меня есть несколько проектов (~ 20), размещенных на моем ноутбуке (на стороне клиента), и я хочу перенести их обратно на сервер VisualSVN, который сейчас пуст.

Я знаю, что это можно сделать, просто добавив файлы проекта вручную, но это займет много времени, потому что я не хочу включать каждый файл (т. Е. Соответствующие файлы). Любые предложения будут с благодарностью.

1 Ответ

1 голос
/ 04 марта 2010

К сожалению, у меня нет полностью автоматизированного решения для вас, но один из способов выяснить, какие файлы имеют версии в хранилище, - использовать команду list с инструментом командной строки:

svn.exe list -R

Эта команда рекурсивно выведет список всех файлов, которые SVN поддерживает в текущем каталоге. Получив этот список, вы можете скопировать их в другой каталог и выполнить пакетную фиксацию в новом хранилище.

Комбинирование этой команды с некоторой магией Powershell , вероятно, сделало бы задачу воссоздания хранилищ максимально безболезненной.

Обновление:

Я провел некоторое время, играя с Powershell, и выяснил, как вы можете это сделать. Для примера, который я собираюсь объяснить, исходный каталог хранилища - C: \ source_repos \, а новый каталог хранилища - C: \ dest_repos \.

  1. Откройте командную строку. Это можно сделать через папку меню «Пуск» «Стандартные» или запустив «cmd» из окна поиска в Vista / Win7 или «Выполнить ...» в WinXP.
  2. Из командной строки выполните следующие команды:
    cd C:\source_repos\
    echo File > filelist.csv
    svn.exe list -R >> filelist.csv
    

    Вторая команда создает файл listlist.csv с первой строкой, содержащей слово «Файл». Третья команда запускает команду svn list и перенаправляет вывод для добавления в filelist.csv. На этом этапе filelist.csv должен иметь «File» в первой строке, а затем каждый файл, версионный в вашем каталоге svn, перечисленный в отдельных строках.

  3. Возьмите код ниже и вставьте его в файл с именем reposcopy.ps1:
    # Assumptions / Notes:
    #  - No crazy file names with "\" in them!
    #  - A file named filelist.csv was created by running:
    #       svn.exe list -R >> filelist.csv
    #    and is in the base directory of the source repository.
    #  - The first line of filelist.csv is "File" without quotes, this is
    #    important for the Import-Csv command
    #  - If you get an error about permissions when you try to run the script,
    #    use the command "Set-ExecutionPolicy RemoteSigned" in the powershell
    
    # Source & destination repository directories
    $src = "C:\source_repos\"
    $dest = "C:\dest_repos\"
    
    # Get current directory
    $origdir = Get-Location
    
    # Goto source repository directory
    Set-Location $src
    
    # Check if destination repository directory exists, if not create it
    if (![IO.Directory]::Exists($dest)) {
        [IO.Directory]::CreateDirectory($dest)
    }
    
    # Import filelist.csv created with these commands at a command prompt:
    #    cd C:\source_repos
    #    echo File > filelist.csv
    #    svn.exe list -R >> filelist.csv
    $filelist = Import-Csv filelist.csv
    
    # Go through each line in the filelist
    foreach ($line in $filelist) {
        # Concatenate the filename with the source and destination directories
        $srcfile = [String]::Concat($src, $line.File)
        $destfile = [String]::Concat($dest, $line.File)
    
        # If the destination file is a directory and it doesn't exist create it
        # Otherwise copy the source file to the destination.
        if ($destfile.EndsWith("\")) {
            if (![IO.Directory]::Exists($destfile)) {
                [IO.Directory]::CreateDirectory($destfile)
            }    
        } else {
            Copy-Item $srcfile $destfile
        }
    }
    
    # Go back to the original directory
    Set-Location $origdir
    

    Вам нужно будет изменять переменные $src и $dest для каждого прогона.

  4. Откройте Powershell (его можно найти в разделе «Аксессуары» в Vista / Win7 или Powershell в WinXP). Перейдите в каталог, где вы сохранили вышеуказанный скрипт и запустите его. Если вы получаете сообщение об ошибке «выполнение сценариев отключено в этой системе», запустите
    Set-ExecutionPolicy RemoteSigned
    

    в PowerShell для запуска локальных сценариев без подписи.

Это должно сделать это. Если все прошло хорошо, вы сможете перейти к C:\dest_repos\ и svn add всем файлам в новом хранилище и svn commit их.

Если у вас возникнут вопросы о том, что я пытался объяснить, или возникнут какие-то странные ошибки, дайте мне знать. Я провел поверхностное тестирование сценария, но вполне возможно, что я забыл некоторые крайние случаи.

Удачи в восстановлении ваших репозиториев!

...