Получение последнего номера версии в 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

Ответ 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

Ответ 25

Обновление: Subversion 1.9 будет поддерживать новую команду "svn youngest", которая выводит только последний номер версии. Разница с "svnlook youngest" заключается в том, что "svn youngest" также работает удаленно.

http://subversion.tigris.org/issues/show_bug.cgi?id=4299