Получение последнего номера ревизии в SVN? - PullRequest
97 голосов
/ 23 февраля 2009

Используя PHP, Perl или Python (предпочтительно PHP), мне нужен способ запросить базу данных SVN и узнать номер последней редакции, отправленной в SVN. Мне не нужно ничего, кроме этого. Он должен быть не интенсивным (поэтому я делаю это каждые 5 минут как задание cron; производительность SVN не должна быть затронута).

SVN находится в моей внутренней сети, но не на моем конкретном компьютере.

У меня установлен SVN, но нет привязок для PHP / Perl / Python. Я использую Windows XP, но я бы предпочел независимое от платформы решение, которое также может работать в Linux. Если у вас есть решение только для Linux (или только для XP), это также будет полезно.

Ответы [ 25 ]

127 голосов
/ 23 февраля 2009

Если вы хотите проанализировать локальную рабочую копию, лучшим инструментом будет 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
66 голосов
/ 23 февраля 2009
<?php
    $url = 'your repository here';
    $output = `svn info $url`;
    echo "<pre>$output
"; ?>

Вы можете получить вывод в XML следующим образом:

$output = `svn info $url --xml`;

Если есть ошибка, то вывод будет направлен на stderr. Для захвата stderr в вашем выводе используйте таким образом:

$output = `svn info $url 2>&1`;
45 голосов
/ 23 февраля 2009

svn info -r HEAD

Это даст вам номер последней редакции в начале вашего хранилища.

Есть несколько хороших постов в блоге об интеграции номеров Subversion в ваш скрипт сборки:

35 голосов
/ 23 февраля 2009

Это должно работать в Bash, из рабочего каталога. Я использовал его в Windows с unixutils :

svn info |grep Revision: |cut -c11-
33 голосов
/ 05 июня 2009

Должно работать следующее:

svnlook youngest <repo-path>

Возвращает один номер ревизии.

13 голосов
/ 15 октября 2013

Чтобы действительно получить номер последней редакции ("головной ревизии") на вашем удаленном репозитории, используйте это:

svn info -r 'HEAD' | grep Revision | egrep -o "[0-9]+"

Выходы, например:

35669
12 голосов
/ 11 ноября 2011

Примечание о получении номера последней редакции:

Скажите, что я 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'
USER@server.com'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 сообщается локально).

8 голосов
/ 20 августа 2015
  • Начиная с Subversion 1.9, вы можете использовать опцию - show-item , чтобы получить значение одного из полей svn info вывода команды. Эта команда будет отображать только номер редакции:

    svn info --show-item=revision <URL-to-repository>
    
  • Получите вывод XML svn info с помощью опции --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 для получения дополнительной информации.

6 голосов
/ 23 февраля 2009

Я думаю, что вы ищете

svn info -r HEAD

Можете ли вы использовать эту команду?

Возможно, вам также потребуется указать учетные данные для входа в хранилище.

4 голосов
/ 23 февраля 2009

Кто-то еще побудил меня опубликовать ответ о svnversion, что, безусловно, является лучшим решением, если у вас есть рабочая копия (IIRC, она не работает с URL-адресами). Я добавлю это: если вы находитесь на сервере, на котором размещается SVN, лучший способ - использовать команду svnlook. Это команда, которую вы используете при написании сценария перехвата для проверки хранилища (и даже текущей транзакции, в случае перехватов перед фиксацией). Вы можете напечатать svnlook help для деталей. Вы, вероятно, хотите использовать команду svnlook youngest. Обратите внимание, что для этого требуется прямой доступ к каталогу репо, поэтому его необходимо использовать на сервере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...