Экспорт из SVN
Иногда возникает необходимость получить измененные файлы между двумя ревизиями. Не многие svn gui клиенты способны на это (а под linux таких вообще не встречал).
Зачем это нужно? Ну скажем для загрузки изменений произошедших в проекте. При этом не нужно будет перезаливать весь проект, что безусловно экономит время и трафик! ![]()
Для упрощения этой процедуры был написан небольшой консольный скрипт на php.
#! /usr/bin/php
< ?php
/**
* usage: svn://server repository start_revision end_revision /export/path/
*/
// Ловим параметры
if(isset($argv[1], $argv[2], $argv[3], $argv[4], $argv[5]) && ereg('^[0-9]+$', $argv[3]) && ereg('^[0-9]+$', $argv[4]))
{
$server = $argv[1];
$repository = $argv[2];
$revStart = $argv[3];
$revEnd = $argv[4];
$saveDir = $argv[5];
}
else
{
die("usage: svn://server repository start_revision end_revision /export/path/\n");
}
// Функция создания папок по пути
function mkdirs($path)
{
if(is_dir($path))
{
return true;
}
$exp = explode("/", $path);
$way = '';
foreach($exp as $n)
{
$way .= $n . '/';
if(!file_exists($way))
{
if(!mkdir($way, 0777))
{
return false;
}
}
}
return true;
}
// Получаем список измененных файлов
$svnList = explode("\n", `svn diff --summarize -r {$revStart}:{$revEnd} {$server}/{$repository}/`);
if(sizeof($svnList))
{
// Запишем ревизию в файл
file_put_contents($saveDir . '.revision', $revEnd);
foreach($svnList as $item)
{
if(strlen($item))
{
// Получаем путь до файла в хранилище
$sfile = trim(substr($item, 5, strlen($item)));
if(parse_url($sfile, PHP_URL_SCHEME) != '')
{
$sdir = dirname($sfile);
// Получаем путь папки для сохранения
$dir = $saveDir . substr($sdir, strlen($server . '/' . $repository . '/'), strlen($sdir));
// Получаем путь файла для сохранения
$file = $saveDir . substr($sfile, strlen($server . '/' . $repository . '/'), strlen($sfile));
// Создаем папку
if(mkdirs($dir))
{
// Забираем файл из хранилища
print `svn export --force -r {$revEnd} {$sfile} {$file}`;
}
}
}
}
}
?>
Использовать его очень просто:
~$ export.php svn://server path/to/repository start_revision end_revision /export/path/
Вот и все!
Было бы еще круче если б гуишка была
Интересно, а на Windows машине `svn diff –summarize -r {$revStart}:{$revEnd} {$server}/{$repository}/` сработает ?
Вообще говоря сработает. При установке клиента svn тоже ставиться всегда. Единственное что нужно путь прописать полный.
smartSVN
Что-то не вижу как…
Query -> Create Patch…
Если svn+ssh то на каждый файл просит пароль, очень напрягает, особенно если файлов больше тысячи…
@Aco
Добавь доверенный ключ.
И будет тебе счастье! =)
Кстати, напомни, как его добавить?
Напоминаю: Создание доверенного ssh ключа
На сервере не опасно ключи держать? Имхо, лучше сделать скрипт так, что бы он за один раз все файлы выкачивал?
@Aco
За один раз не получиться. Таков протокол svn’а.
Если есть какие-либо опасения за сохранность ключей, то лучше сделать отдельную ssh-учетку для работы svn’а с минимальными правами.