Назад | Перейти на главную страницу

Получить последний тег из Subversion

Есть ли способ определить новейший тег в Subversion?

Для приложения, которое я развернул, у клиента должен быть другой сервер, к которому они могут получить доступ в случае отказа рабочего сервера. Уже существует автоматизированная система копирования базы данных на резервный сервер. Код приложения находится в репозитории Subversion, и я хотел бы написать сценарий, который автоматически копирует код из Subversion на сервер резервного копирования. У меня есть сценарий, который делает это, однако мне нужно вручную указать ему, какой тег нужно получить. Есть ли способ сделать это полностью автоматизированным.

На сервере работает Redhat.

Эта команда оболочки выводит последний созданный тег в вашем tags каталог.

svn log -v --limit 1 tagsURL | awk '/^   A/ { print $2 }'

Если вы вызываете команду из извлеченного репозитория, вы можете использовать токен относительного пути svn ^:

svn log -v --limit 1 ^/tags | awk '/^   A/ { print $2 }'

Если ваши теги перечислены последовательно при сортировке, вы можете получить имя последнего, используя что-то вроде:

svn ls .../path/to/repo/tags | tail -n 1

Если структура тегов вашего проекта не такая строгая, результат svn ls нужно будет передать -v (подробный) вариант и отсортирован по дате в выводе.

Насколько я понимаю, теги - это просто копии основной ветки, созданной с помощью команды svn copy. Итак, если вы это делаете, разве вы не даете этим тегам номера версий? Просто возьмите наибольшее число?

Возможно, вы имеете в виду последний номер ревизии репо? В этом случае это будет примерно так:

svn info https://www.myDomain.com/svn/myRepo | grep Revision | awk '{print $2}'

Или, может быть, вы хотите:

svn ls https://www.myDomain.com/svn/myRepo/tags

Затем вы можете ввести svn-информацию для каждого из этих каталогов, и тот, у которого номер последней измененной версии будет самым большим, будет последним тегом.

Если ваши теги не сортируются «естественным образом» (если вы следите за семантическим управлением версиями, 1.10.0 будет отображаться после 1.1.0, а не после 1.9.0 в svn ls output), вы можете использовать идентификатор редакции гарантированной сортировки вашего каталога тегов:

 svn ls -v --config-dir=/root/.subversion https://svn/project/tags | sort -n |  awk '{ field = $NF }; END{ print field }'
 1.10.0

Если у вас хорошие номера версий

svn ls https://www.myDomain.com/svn/myRepo | sort -V | tail -n 1
 svn list --xml $REPO/tags | grep 'revision="' | cut -d '"' -f2 | tr -d ' ' | sort -bnu | tail -1

Мне нравится решение Джима Хуанга, работает как шарм. Если вы получаете сообщение об ошибке «Сломанная труба» (я получаю это в Ubuntu и Mac), просто попробуйте окружить команду следующим образом:

exec 6>&2 2>/dev/null; svn log -v tagsURL | awk '/^   A/ { print $2 }' | head -1;  exec 2>&6 6>&-

Это просто подавит сообщение об ошибке. Я проверил несколько списков рассылки и, очевидно, никто не знает, почему возникает эта ошибка.