Получение последнего номера версии в SVN?
Используя PHP, Perl или Python (желательно PHP), мне нужен способ запросить базу данных SVN и узнать последний номер версии, отправленный в SVN. Мне не нужно ничего, кроме этого. Он должен быть неинтенсивным (поэтому я делаю это каждые 5 минут в качестве задания cron, производительность SVN не должна затрагиваться).
SVN находится на моей интрасети, но не на моем конкретном компьютере.
У меня установлен SVN, но никаких привязок для PHP/Perl/Python не установлено. Я запускаю Windows XP, но я бы предпочел независимое от платформы решение, которое также может работать в Linux. Если у вас есть только Linux-решение (только для XP), это также будет полезно.
Ответы
Ответ 1
<?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`;
Ответ 2
Если вы хотите проанализировать локальную рабочую копию, лучшим инструментом является 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
Ответ 3
svn info -r HEAD
Это даст вам последний номер версии во главе вашего репозитория.
В вашей сборке script есть несколько хороших сообщений в блоге об интеграции чисел subversion:
Ответ 4
Это должно работать в Bash из рабочего каталога. Я использовал его в Windows с unixutils:
svn info |grep Revision: |cut -c11-
Ответ 5
Следующее должно работать:
svnlook youngest <repo-path>
Он возвращает один номер версии.
Ответ 6
Чтобы получить последнюю версию ( "ревизия главы" ) в удаленном репозитории, используйте следующую команду:
svn info -r 'HEAD' | grep Revision | egrep -o "[0-9]+"
Выходы, например:
35669
Ответ 7
Заметка о получении последнего номера версии:
Скажем, что я 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
(обратите внимание на разницу между параметром capital -R
и нижним регистром -R
сейчас):
> svn info -r 'HEAD'
[email protected] 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
, зарегистрированной локально).
Ответ 8
-
Начиная с Subversion 1.9 вы можете использовать опцию - show-item, чтобы получить значение одного из полей svn info
вывод команды. Эта команда будет отображать только номер версии:
svn info --show-item=revision <URL-to-repository>
-
Получите XML-вывод информации svn с помощью опции --xml
и используйте PowerShell для получения номера версии. Вот простой пример:
[xml]$svninfo = svn info <REPOSITORY-URL> --xml -r HEAD
$latestrevnum = $svninfo.info.entry.revision
$latestrevnum
-
Используя VisualSVN Server 3.4 или новее, вы можете получить количество ревизий в репозитории, выполнив следующие команды:
$repo = Get-SvnRepository <REPOSITORY-NAME>
$repo.Revisions
Подробнее см. Get-SvnRepository
ссылка на командлет PowerShell.
Ответ 9
Я думаю, что вы ищете
svn info -r HEAD
Можете ли вы использовать эту команду?
Вероятно, вам также потребуется указать учетные данные для входа в репозиторий.
Ответ 10
Кто-то другой избил меня, чтобы опубликовать ответ о svnversion
, что, безусловно, лучшее решение, если у вас есть рабочая копия (IIRC, он не работает с URL-адресами). Я добавлю следующее: если вы используете сервер SVN, лучший способ - использовать команду svnlook
. Это команда, которую вы используете при написании hook script для проверки репозитория (и даже текущей транзакции, в случае перехвата с фиксацией). Вы можете ввести svnlook help
для получения дополнительной информации. Вероятно, вы хотите использовать команду svnlook youngest
. Обратите внимание, что для этого требуется прямой доступ к каталогу репо, поэтому он должен использоваться на сервере.
Ответ 11
Вы ищете вызов, похожий на вызов командной строки
svn info URL
Кажется, что это возможно с помощью библиотеки pysvn, и там рецепт, который должен помочь вам приступить к работе. Я не уверен, есть ли что-то подобное для PHP.
Если вам нужно прибегнуть к вызову двоичного файла SVN самостоятельно, обязательно используйте параметр --xml
, чтобы получить результат как XML. Это должно быть проще проанализировать, чем вывод командной строки.
Ответ 12
Вы можете использовать формат 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
Ответ 13
[email protected]:~/Work/standingcloud/svn/main/trunk/dev/scripts$ svnversion
12354
или
[email protected]:~/Work/standingcloud/svn/main/trunk/dev/scripts$ svn info --xml | xmlstarlet sel -t --value-of "//entry/@revision"
12354
или
[email protected]:~/Work/standingcloud/svn/main/trunk/dev/scripts$ svn info --xml | xmlstarlet sel -t --value-of "//commit/@revision"
12335
Ответ 14
Вы можете использовать любую команду:
1)
> svn info | awk '/Revision:/ { print $2 }' =>returns the latest version
2)
> svn log -l 1 | grep '^r[0-9]\+' | awk '{print $1}'
svn log -l 1 => returns the latest version commit
grep '^r[0-9]\+' => greps the r4324 (revision) number
awk '{print $1}' => prints the match found
Ответ 15
Если вам нужен действительно короткий:
svn info ^/
обозначение каретки является сокращением для "URL-адреса корневого каталога репозитория".
Ответ 16
Только svn info
в BASH предоставит вам все детали
RESULT:
Path: .
URL:
Repository Root:
Repository UUID:
Revision: 54
Node Kind: directory
Schedule: normal
Last Changed Author:
Last Changed Rev: 54
Last Changed Date:
Вы получите ОБОСНОВАНИЕ из этого
Ответ 17
Если вам не повезло сделать это из командного файла 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 ко второму токену.
Ответ 18
Опубликованные решения не обрабатывают случай использования внешних элементов.
Если у меня есть URL-адрес или рабочая копия с набором свойств svn:externals
, внешние переменные могут измениться, и, следовательно, последняя редакция сервера subversion изменится. Но последняя ревизия рабочей копии или URL-адреса будет сообщать только номер версии, когда изменение svn: externals было изменено или какой-либо элемент ниже в URL-адресе, что является ожидаемым поведением.
Итак, вы либо получаете свойство svn:externals
, и итерации по URL-адресам, либо выбираете высоту ревизии или запрашиваете базовый URL-адрес с сервера subversion. Версия, указанная с базового URL, будет содержать последнюю версию для ВСЕГО на сервере.
Итак, если вы используете внешние, лучше использовать svn info BASE_URL
, где BASE_URL
- это
корневой URL для всех путей на сервере subversion.
Ответ 19
svn info
или svnversion
не будут принимать во внимание подкаталоги, чтобы найти последнюю "ревизию" живой кодовой базы, которую взломанный ниже способ работал у меня - для запуска может потребоваться некоторое время:
repo_root$ find ./ | xargs -l svn info | grep 'Revision: ' | sort
...
Revision: 86
Revision: 86
Revision: 89
Revision: 90
$
Ответ 20
$ svn log | head -10
в любой директории с папкой .svn
Ответ 21
Вы можете попробовать следующую команду:
svn info -r 'HEAD' | grep Revision: | awk -F' ' '{print $2}'
Ответ 22
Это получит только номер версии последней измененной версии:
<?php
$REV="";
$repo = ""; #url or directory
$REV = svn info $repo --show-item last-changed-revision;
?>
Надеюсь, это поможет.
Ответ 23
Самый простой и чистый способ сделать это (на самом деле 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
Ответ 24
Похоже, есть запись в официальном FAQ для этого. Исходный код находится в C, но тот же принцип применяется, как описанный здесь, в этом списке рассылки.
Ответ 25
Обновление: Subversion 1.9 будет поддерживать новую команду "svn youngest", которая выводит только последний номер версии. Разница с "svnlook youngest" заключается в том, что "svn youngest" также работает удаленно.
http://subversion.tigris.org/issues/show_bug.cgi?id=4299