Есть ли простой способ скопировать каталог из одного репозитория в другой с копированием всей истории?
Как перенести репозиторий SVN в другой репозиторий SVN?
Ответы (9)
Самый простой способ - использовать:
svnadmin dump path/to/repos > repos.out
Это создаст переносимый формат для вашего репозитория (с историей) в файле repos.out
. Затем вы можете использовать
svnadmin load path/to/newrepos < repos.out
для загрузки вашего «сброшенного» репозитория в новый или существующий.
Глава 5. Обслуживание репозитория -> Перенос данных репозитория в другое место содержит следующее примечание об использовании svnadmin dump
в версии 1.7:
Формат дампа репозитория Subversion описывает только изменения репозитория с поддержкой версий. Он не будет нести никакой информации о незафиксированных транзакциях, пользовательских блокировках на пути к файловой системе, настройках конфигурации репозитория или сервера (включая сценарии ловушек) и т. Д.
svnadmin create path/to/newrepos
.
- person Vargas; 16.05.2017
/home/repos/svn
, так что у каждого репо есть conf для доступа, я потеряю authz
, passwd
, svnserve.conf
?
- person Jon Weinraub; 01.03.2018
svnserve pack
, разве он не новее и лучше?
- person Sandburg; 29.08.2018
svnadmin hotcopy
.
- person bahrep; 29.04.2020
Как предлагается в книге Subversion:
svnadmin dump path/to/repos_src \
| svndumpfilter include path/inside/svn/to/directory \
| svnadmin load path/to/repos_dst
На примере:
svnadmin dump /var/lib/svn/old_repo \
| svndumpfilter include trunk/my_project/common_dir \
| svnadmin load /var/lib/svn/new_repo
Если вам не нужна история, вы можете использовать svn export
, чтобы получить чистую папку без .svn
папок, а затем svn import
в другое хранилище.
С историей вам нужно будет использовать svnadmin dump
. Затем вы должны использовать _5 _ для фильтрации только тех частей или путей, которые вы хотите использовать перед использованием svnadmin load
.
Темы для чтения:
Используйте команду svnsync
- Subversion Repository Mirroring:
svnsync
- это инструмент зеркалирования удаленного репозитория Subversion. Проще говоря, это позволяет вам воспроизводить ревизии одного репозитория в другом.
В документации Subversion для команды svnsync
есть следующее предупреждение (начиная с версии 1.7), подразумевающее, что после использования некоторых других команд SVN для изменения зеркального репозитория svnsync
не следует снова использовать с этим конкретным зеркалом:
svnsync
очень чувствителен к изменениям, сделанным в зеркальном репозитории, которые не были сделаны как часть операции зеркалирования. Чтобы этого не произошло, лучше всего, еслиsvnsync
процесс будет единственным процессом, которому разрешено изменять зеркальный репозиторий.
В Subversion версии 1.7 есть новая команда svnrdump
, которую можно использовать для доступа к удаленному репозиторию и создания вывода в том же формате дампа, который генерируется командой svnadmin dump
. Это позволяет вам использовать svnrdump
с svnadmin load
для передачи репозитория Subversion.
См. svnrdump — Remote Subversion Repository Data Migration, в котором есть объяснение новой команды.
В главе 5 красной книги раздел Перенос данных репозитория в другое место содержит подраздел Перенос данных репозитория с использованием svnrdump
, в котором упоминается:
Основное различие [между
svnrdump
иsvnadmin dump
] состоит в том, что вместо прямого доступа к репозиториюsvnrdump
работает удаленно, используя те же протоколы доступа к репозиторию (RA), что и клиент Subversion. Таким образом, вам может потребоваться предоставить учетные данные для аутентификации. Кроме того, на ваше удаленное взаимодействие [sic] распространяются любые ограничения авторизации, настроенные на сервере Subversion.
Я также предполагаю, что ограничения svnadmin dump
, касающиеся настроек конфигурации сервера, таких как перехватчики, могут не передаваться, также будут применяться к svnrdump
.
Вы можете создать файл дампа с помощью svnadmin dump
, а затем импортировать в новый репозиторий с помощью svnadmin load
.
Я думаю, следует указать, что файл дампа, созданный с помощью
svnadmin dump path/to/repos > dumpfile
можно создать (начиная с svn 1.7 и далее) с помощью команды
svnrdump dump url_to_repos > dumpfile
Это полезно, когда выполняется с удаленного компьютера, а не с сервера.
Чтобы перенести репозиторий с одного сервера на другую версию, вам необходимо выполнить следующие действия.
Шаг 1: Выгрузите все версии репозитория в файл дампа. У вас могут быть тысячи версий в существующем репозитории. Таким образом, вы можете создать файл дампа, используя следующий сценарий.
dump.sh
# Here “i” is the version starting number, and “j” is the maximum version number of your existing #repository.
j=4999;
for ((i=0;i<=$j;i++));
do
# your-unix-command-here
echo $i
svnadmin dump <old_server_repository_location > -r $i –incremental > <dump_location>/$i.dump
done
В приведенном выше сценарии вы можете получить полный дамп старого репозитория в зависимости от наличия места, или вы можете сделать дамп за короткий промежуток времени (то есть от 0-5000, затем от 5001-10000 и так далее).
Шаг 2: Выполните указанный выше сценарий, используя команду ниже. В зависимости от версии ядра вам необходимо выполнить любой из двух следующих запросов.
$ bash dump.sh > stdout.sh
$ ./sh dump.sh > stdout.sh
Это запишет все команды, которые вам нужно было выполнить, используя указанную выше команду, в файл stdout.sh. Вы можете отслеживать этот файл для использования в будущем.
Шаг 3: Убедитесь, что брандмауэр открыт для порта номер 22 между старым и новым сервером. Если он не открыт, попросите администратора сделать его доступным.
Шаг 4: Теперь скопируйте все файлы дампа, сгенерированные из старого репозитория SVN, на новый сервер, используя следующую команду.
$ sftp xxxx@<new_server>
Connecting to <new_server>…
Password:
sftp> mput *.dump <new_server>/dump_location
В приведенной выше команде xxxx
- это пользователь, выполняющий операцию. В процессе выполнения sftp вы копируете файлы дампа со старого сервера на новый.
Шаг 5: Создайте новый репозиторий на новом сервере
$ svnadmin create <new_repository>
Шаг 6: Теперь используйте приведенный ниже сценарий для загрузки всех файлов дампа.
load.sh
# Here “i” is the version starting number, and “j” is the maximum version number of your existing #repository.
j=4999;
for ((i=0;i<=$j;i++));
do
# your-unix-command-here
echo $i
svnadmin load –bypass-prop-validation <new_repository> < dump_location /$i.dump
done
Просто выполнив шесть простых шагов, вы сможете перенести существующий репозиторий в новый репозиторий. Благодаря этому процессу вам не нужно беспокоиться о поврежденных версиях вашего существующего репозитория.
В случае, если это поможет другим, есть svn2svn для воспроизведения ревизий из одного репозитория Subversion в другой:
https://github.com/tonyduckles/svn2svn