Получение последнего номера ревизии в SVN?
используя PHP, Perl или Python (предпочтительно PHP), мне нужен способ запросить базу данных SVN и узнать последний номер версии, отправленный в SVN. Мне не нужно ничего кроме этого. Он должен быть неинтенсивным (поэтому я делаю это каждые 5 минут в качестве задания cron; производительность SVN не должна влиять).
SVN находится в моей интрасети, но не на моем конкретном компьютере.
У меня установлен SVN, но Нет привязок, установленных для PHP/Perl/Python. Я запускаю Windows XP, Но я предпочел бы платформенно-независимое решение, которое также может работать в Linux. Если у вас есть решение только для Linux (или только для XP), это также было бы полезно.
25 ответов:
<?php $url = 'your repository here'; $output = `svn info $url`; echo "<pre>$output</pre>"; ?>вы можете получить вывод в XML следующим образом:
$output = `svn info $url --xml`;Если есть ошибка, то вывод будет направлен на stderr. Чтобы захватить stderr в вашем выходе используйте таким образом:
$output = `svn info $url 2>&1`;
Если вы хотите проанализировать локальную рабочую копию, лучшим инструментом является
svnversion, который поставляется с Subversion и производит выход, как968:1000M. В документации говорится:номер версии будет один если рабочая копия один редакции, без изменений, не включается и с URL-адресом, который соответствует Аргумент TRAIL_URL. Если рабочий копия необычна номер версии будет сложнее:
4123:4168 mixed revision working copy 4168M modified working copy 4123S switched working copy 4123:4168MS mixed revision, modified, switched working copy
svn info -r HEADэто даст вам последний номер ревизии в репозитории.
есть несколько хороших сообщений в блоге об интеграции номеров subversion в ваш скрипт сборки:
Это должно работать в bash, из рабочего каталога. Я использовал его в Windows с unixutils установлено:
svn info |grep Revision: |cut -c11-
чтобы действительно получить последнюю версию ("head revision") номер на вашем remote respository, используйте этот:
svn info -r 'HEAD' | grep Revision | egrep -o "[0-9]+"мероприятия к примеру:
35669
примечание о получении последнего номера редакции:
скажи, что я
cd- ed в пересмотренном подкаталоге (MyProjectDir). Тогда, если я позвонюsvnversion:$ svnversion . 323:340... Я получаю"
323:340", что, я думаю, означает:"у вас есть элементы здесь, начиная от ревизии 323 до 340".тогда, если я называю
svn info:$ svn info Path: . URL: svn+ssh://server.com/path/to/MyProject/MyProjectDir Repository Root: svn+ssh://server.com/path/to/MyProject Repository UUID: 0000ffff-ffff-... Revision: 323 Node Kind: directory Schedule: normal Last Changed Author: USER Last Changed Rev: 323 Last Changed Date: 2011-11-09 18:34:34 +0000 (Wed, 09 Nov 2011)... Я получаю"
323" как пересмотр - который на самом деле низкий пересмотр тех, о которых сообщаетsvnversion!мы можем использовать
svn infoв рекурсивном режиме, чтобы получить дополнительную информацию из локального каталога:> svn info -R | grep 'Path\|Revision' Path: . Revision: 323 Path: file1.txt Revision: 333 Path: file2.txt Revision: 327 Path: file3.txt Revision: 323 Path: subdirA Revision: 328 Path: subdirA/file1.txt Revision: 339 Path: subdirA/file1.txt Revision: 340 Path: file1.txt Revision: 323 ...... (снимите
grepчтобы увидеть более подробную информацию).наконец, что делать, когда мы хотим проверить, что последняя редакция онлайн хранилище (в данном случае, @
server.com)? Тогда мы снова выдадимsvn info, но с-r HEAD(Примечание разница между капиталом-Rопция ранее, и в нижнем регистре-rсейчас):> svn info -r 'HEAD' [email protected]'s password: Path: MyProjectDir URL: svn+ssh://server.com/path/to/MyProject/MyProjectDir Repository Root: svn+ssh://server.com/path/to/MyProject Repository UUID: 0000ffff-ffff-... Revision: 340 Node Kind: directory Last Changed Author: USER Last Changed Rev: 340 Last Changed Date: 2011-11-11 01:53:50 +0000 (Fri, 11 Nov 2011)самое интересное -
svn infoпо-прежнему ссылается на текущий подкаталог (MyProjectDir), однако онлайн путь отображается какMyProjectDir(вместо.для локального случая) - и сообщается о онлайн-версии высокий (340- в отличие от младшей,323сообщил локально).
начиная с Subversion 1.9 вы можете использовать опцию --show-item чтобы получить значение одного из полей команды. Эта команда отобразит только номер версии:
svn info --show-item=revision <URL-to-repository>получить XMLed вывод информации svn с помощью
--xmlопция и использовать PowerShell, чтобы получить номер редакции. Вот простой пример:[xml]$svninfo = svn info <REPOSITORY-URL> --xml -r HEAD $latestrevnum = $svninfo.info.entry.revision $latestrevnumсервер с помощью клиента VisualSVN 3.4 или более поздней версии, вы можете получить количество изменения в репозитории, выполнив следующие команды:
$repo = Get-SvnRepository <REPOSITORY-NAME>
$repo.Revisionsпосмотреть
Get-SvnRepositoryссылка на командлет PowerShell для получения дополнительной информации.
Я думаю, что вы ищете
svn info -r HEADможете ли вы выполнить эту команду?
вероятно, вам также потребуется предоставить учетные данные для входа в репозиторий.
кто-то еще избил меня, чтобы опубликовать ответ о
svnversion, что, безусловно, лучшее решение, если у вас есть рабочая копия (IIRC, он не работает с URL-адресами). Я добавлю это: если вы находитесь на сервере хостинга SVN, лучший способ-использовать
nickh@SCLLNHENRY:~/Work/standingcloud/svn/main/trunk/dev/scripts$ svnversion 12354или
nickh@SCLLNHENRY:~/Work/standingcloud/svn/main/trunk/dev/scripts$ svn info --xml | xmlstarlet sel -t --value-of "//entry/@revision" 12354или
nickh@SCLLNHENRY:~/Work/standingcloud/svn/main/trunk/dev/scripts$ svn info --xml | xmlstarlet sel -t --value-of "//commit/@revision" 12335
вы можете использовать команды:
1) > svn info | awk '/Revision:/ { print }' =>returns the latest version 2) > svn log -l 1 | grep '^r[0-9]\+' | awk '{print }' svn log -l 1 => returns the latest version commit grep '^r[0-9]\+' => greps the r4324 (revision) number awk '{print }' => prints the match found
Если вы хотите действительно короткий:
svn info ^/на каре нотации является сокращением для "URL корневого каталога репозитория".
вы ищете вызов, который похож на вызов командной строки
svn info URLКажется, что это возможно с помощью библиотеки pysvn, и там рецепт это должно помочь вам начать работу. Я не уверен, что есть что-то подобное для PHP.
Если вам нужно прибегнуть к вызову двоичного файла SVN самостоятельно, убедитесь, что вы используете
--xmlпараметр для получения результата в виде XML. Это должно быть проще разобрать, чем вывод командной строки.
вы можете использовать формат XML out, например:
svn info --xml | grep 'revision' | head -1 | grep -Eo "[0-9]+" | xargs expr -1 +пример: использование номера редакции
working=`svn info --xml | grep 'revision' | head -1 | grep -Eo "[0-9]+" | xargs expr -1 +` svn diff -r $working:HEAD --summarize --xml
просто
svn infoв Баш даст вам все деталиRESULT: Path: . URL: Repository Root: Repository UUID: Revision: 54 Node Kind: directory Schedule: normal Last Changed Author: Last Changed Rev: 54 Last Changed Date:вы получите ревизию от этого
Если у вас есть несчастье необходимости сделать это из пакетного файла Windows, вот заклинание, которое вы ищете:
set REV=unknown for /f "usebackq tokens=1,2 delims=: " %%A in (`svn info`) do if "%%A" == "Revision" set REV=%%B echo Current SVN revision is %REV%это запускает "svn info", повторяя каждую строку сгенерированного вывода. Он использует двоеточие в качестве разделителя между первым и вторым токеном в строке. Когда первый токен является "ревизией", он устанавливает переменную среды REV на второй токен.
опубликованные решения не обрабатывают случай, когда используются внешние.
если у меня есть URL или рабочая копия с
svn:externalsнабор свойств, внешние могут измениться и, таким образом, последняя версия сервера subversion изменится. Но последняя версия рабочей копии или URL-адреса будет сообщать только номер версии, когда svn: externals propty был изменен или любой элемент ниже в пути URL-адреса, что является ожидаемым поведением.так что вы либо получите
svn:externalsсвойства и итерации по URL-адресам и выберите ревизию heights или запросите базовый URL-адрес с сервера subversion. Версия, сообщенная из базового URL, будет содержать последнюю версию для всего на сервере.так что, если вы используете внешние, лучше всего использовать
svn info BASE_URLздесьBASE_URL- это корневой URL-адрес для всех путей на сервере subversion.
Это получит только номер ревизии последней измененной ревизии:
<?php $REV=""; $repo = ""; #url or directory $REV = svn info $repo --show-item last-changed-revision; ?>Я надеюсь, что это помогает.
самый простой и чистый способ сделать это (на самом деле svn 1.9, выпущенный в 2015 году) использует:
svn info --show-item revision [--no-newline] [SVNURL/SVNPATH]выход-это число последней ревизии (joungest) для SVNURL, или число текущей редакции рабочей копии SVNPATH. Элемент
--no-newlineявляется необязательным, сообщаетsvnне выделять косметическую новую строку (\n) после значения, если вам нужен минимальный выход (только номер версии).посмотреть: https://subversion.apache.org/docs/release-notes/1.9.html#svn-info-item
svn infoилиsvnversionне будем принимать во внимание подкаталоги, чтобы найти последнюю "ревизию" живой кодовой базы, взломанный способ ниже работал для меня - это может занять некоторое время для запуска:repo_root$ find ./ | xargs -l svn info | grep 'Revision: ' | sort ... Revision: 86 Revision: 86 Revision: 89 Revision: 90 $
похоже, что это запись в официальном FAQ для этого. Исходный код находится в C, но применяется тот же принцип, что и здесь изложил в этом сообщении.
Update: Subversion 1.9 будет поддерживать новую команду "svn youngest", которая выводит только последний номер версии. Отличие от " svnlook youngest "заключается в том, что" svn youngest " также работает удаленно.
Comments