К сожалению, у меня нет полностью автоматизированного решения для вас, но один из способов выяснить, какие файлы имеют версии в хранилище, - использовать команду list с инструментом командной строки:
svn.exe list -R
Эта команда рекурсивно выведет список всех файлов, которые SVN поддерживает в текущем каталоге. Получив этот список, вы можете скопировать их в другой каталог и выполнить пакетную фиксацию в новом хранилище.
Комбинирование этой команды с некоторой магией Powershell , вероятно, сделало бы задачу воссоздания хранилищ максимально безболезненной.
Обновление:
Я провел некоторое время, играя с Powershell, и выяснил, как вы можете это сделать. Для примера, который я собираюсь объяснить, исходный каталог хранилища - C: \ source_repos \, а новый каталог хранилища - C: \ dest_repos \.
-
Откройте командную строку. Это можно сделать через папку меню «Пуск» «Стандартные» или запустив «cmd» из окна поиска в Vista / Win7 или «Выполнить ...» в WinXP.
-
Из командной строки выполните следующие команды:
cd C:\source_repos\
echo File > filelist.csv
svn.exe list -R >> filelist.csv
Вторая команда создает файл listlist.csv с первой строкой, содержащей слово «Файл». Третья команда запускает команду svn list и перенаправляет вывод для добавления в filelist.csv. На этом этапе filelist.csv должен иметь «File» в первой строке, а затем каждый файл, версионный в вашем каталоге svn, перечисленный в отдельных строках.
-
Возьмите код ниже и вставьте его в файл с именем 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
для каждого прогона.
-
Откройте Powershell (его можно найти в разделе «Аксессуары» в Vista / Win7 или Powershell в WinXP). Перейдите в каталог, где вы сохранили вышеуказанный скрипт и запустите его. Если вы получаете сообщение об ошибке «выполнение сценариев отключено в этой системе», запустите
Set-ExecutionPolicy RemoteSigned
в PowerShell для запуска локальных сценариев без подписи.
Это должно сделать это. Если все прошло хорошо, вы сможете перейти к
C:\dest_repos\
и
svn add
всем файлам в новом хранилище и
svn commit
их.
Если у вас возникнут вопросы о том, что я пытался объяснить, или возникнут какие-то странные ошибки, дайте мне знать. Я провел поверхностное тестирование сценария, но вполне возможно, что я забыл некоторые крайние случаи.
Удачи в восстановлении ваших репозиториев!