Получение последнего номера версии в SVN?

104

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

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

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

Coltin
источник
2
"svn info --show-item revision" даст текущую версию, до которой обновляется текущий каталог.
GreatAndPowerfulOz 02
2
$ svn info --show-item revision svn: invalid option: --show-itemИспользование Apache Subversion 1.8.16 (r1740329), скомпилировано 26 апреля 2016 г. Также пробовалось с CollabNet 1.6.11 (r934486), скомпилировано 6 марта 2014 г.
IceArdor
В связи с этими комментариями, ознакомьтесь svn help infoс юридическими вариантами дляsvn info
XavierStuvw
@IceArdor Я использую SVN v1.9.5 и --show-itemдоступен
icc97

Ответы:

68
<?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
В случае ошибки вывод будет направлен на stderr. Чтобы захватить stderr в вашем выводе, используйте следующим образом: $ output = svn info $url 2>&1;
Дэниел Икс Мур,
3
Спасибо! Я использовал --xml, чтобы создать свой собственный инструмент C #, который помогает мне создавать атрибут AssemblyFileVersion. PS: английский не является моим основным языком, и меня озадачило слово «таким образом», которое я никогда раньше не слышал. Кстати, происхождение довольно забавное: cf ( en.wiktionary.org/wiki/thusly ); Вы использовали это намеренно (каламбур?) или вы часто используете именно так, а не так?
odalet
7
svn info $url | grep 'Last Changed Rev' | awk '{ print $4; }'
Cobra_Fast
7
@Cobra_Fast, вам не нужно трубить, вы можете сделать svn info --show-item revision $urlили svn info --show-item last-changed-revision $url.
cp.engr 03
2
@ cp.engr Я считаю, что это только с SVN v1.9 или около того - то есть у меня он есть в v1.9.5, и его нет в v1.8.6
icc97
131

Если вы хотите проанализировать локальную рабочую копию, лучший инструмент 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
что-то
источник
2
согласен, гораздо лучше, чем svn info
Ричард
32
svnversion предназначен для локальных рабочих копий и не будет обращаться к репозиторию в интрасети, как указано в вопросе.
Дэниел Икс Мур
5
Для тех, кто не знаком с svnversion, это часть стандартного клиента командной строки. Вот справочная страница: svnbook.red-bean.com/nightly/en/svn.ref.svnversion.re.html .
Майкл Соренс
45

svn info -r HEAD

Это даст вам номер последней версии во главе вашего репозитория.

В блоге есть несколько хороших сообщений об интеграции номеров подрывной деятельности в ваш сценарий сборки:

Ник Хаддад
источник
Это самый простой способ, так как вам не нужно сначала узнавать URL-адрес репозитория. Спасибо!
derFunk
Я получил ошибки при использовании кавычек вокруг HEAD, так что это должно бытьsvn info -r HEAD
icc97
39

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

svn info |grep Revision: |cut -c11-
Blorgbeard отсутствует
источник
Это работает, если вы поместите URL-адрес репозитория там, где у вас есть% *, что бы вы под этим ни подразумевали. Хороший синтаксис cut, раньше этого не знал.
ypnos
1
Примечание: поскольку здесь отсутствует -rHEAD, это вернет версию фиксации для запрошенного файла или каталога. Это может быть не последняя общая ревизия (поскольку другие изменения могли быть зафиксированы в другом месте или в поддереве).
Mr Fooz,
4
Кроме того, это не работает для локализованных версий SVN (на польском языке это будет | cut -c9-).
zgoda
2
это, кстати, причина, по которой я сильно не люблю локализованные инструменты разработчика командной строки; ноль плюсов, куча проблем. Я обычно удаляю локализации именно по этой причине.
gimpf 09
8
Передача разделителя вместо количества символов лучше всего подходит для локализованного содержимого, например svn info | grep Revision | cut -d " " -f 2, вернет вторую строку после того, как она будет разделена с использованием пробелов.
Butifarra 01
34

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

svnlook youngest <repo-path>

Он возвращает единственный номер редакции.

Пурпурный
источник
15

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

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

Например, выходы:

35669
derFunk
источник
12

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

Скажем, я cdперешел в измененный подкаталог ( 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сообщенной локально).

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

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

бахреп
источник
7

Я думаю ты ищешь

svn info -r HEAD

Можете ли вы выполнить оболочку для этой команды?

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

Тим
источник
Я думаю, это должно быть svn info -r HEAD
Стивен
-r можно легко опустить.
ypnos
Правильно - я не указал параметр для -r - это было просто для него, чтобы найти то, что ему нужно, и начать работу с помощью / книгой.
Тим
4

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

Rmeador
источник
2
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
Ник Генри
источник
2

Вы можете использовать любую команду:

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
Ангелин Надар
источник
2

Если вам нужен действительно короткий:

svn info ^/

Каретка обозначение является обобщающим для «URL корневого каталога хранилища».

Санхюн Ли
источник
2

Если вам не повезло сделать это из командного файла 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", повторяя каждую строку сгенерированного вывода. Он использует двоеточие в качестве разделителя между первым и вторым токенами в строке. Когда первый токен является «Revision», он устанавливает переменную среды REV на второй токен.

йо Йо
источник
1
вы также можете использовать FINDSTR:FOR /F "tokens=2" %%i IN ('svn info ^| FINDSTR Revision:') DO SET revision=%%i
icc97,
см. этот другой SO-ответ для основы этого
icc97
2

Вы ищете вызов, похожий на вызов командной строки

svn info URL

Кажется, что это возможно с помощью библиотеки pysvn, и есть рецепт, который поможет вам начать работу. Не уверен, есть ли что-то подобное для PHP.

Если вам нужно прибегнуть к вызову двоичного файла SVN самостоятельно, обязательно используйте --xmlпараметр, чтобы получить результат в виде XML. Это должно быть легче проанализировать, чем вывод командной строки.

Сандер Райкен
источник
Я использую subprocess.check_outputв Python, чтобы избежать очередного вызова библиотеки. Если вы просто проверяете номера ревизий / загружаете последние копии, проще использовать svn из командной строки через subprocess. Теперь, если вы выполняете автоматические
чекины
2

Вы можете использовать выходной формат XML, например:

  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
фитореч
источник
2

Вы можете попробовать следующую команду:

svn info -r 'HEAD' | grep Revision: | awk -F' ' '{print $2}'
Мраджив
источник
1

Просто 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: 

Вы получите ПЕРЕСМОТР из этого

D_D
источник
1

Самый простой и понятный способ сделать это (на самом деле 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

Ф. Игорь
источник
1
Я пробовал на svn 1.9.3, и вот команда svn info --show-item, вместо--show item
elopio
0

Опубликованные решения не обрабатывают случай, когда используются внешние элементы.

Если у меня есть URL-адрес или рабочая копия с установленными svn:externalsсвойствами, внешние элементы могут измениться, и, следовательно, изменится последняя версия сервера Subversion. Но последняя ревизия рабочей копии или URL-адреса будет сообщать номер ревизии только при изменении свойства svn: externals или любого элемента ниже в пути URL-адреса, что является ожидаемым поведением.

Таким образом, вы либо получаете svn:externalsсвойство, и перебираете URL-адреса и выбираете ревизию высоты, либо запрашиваете базовый URL-адрес с сервера Subversion. Версия, полученная по базовому URL, будет содержать последнюю версию ВСЕГО на сервере.

Итак, если вы используете внешние объекты, лучше всего использовать svn info BASE_URLwhere BASE_URL- корневой URL-адрес для всех путей на сервере Subversion.

Ник
источник
0

Будет получен только номер последней измененной ревизии:

<?php
$REV="";
$repo = ""; #url or directory
$REV = svn info $repo --show-item last-changed-revision;
?>

Надеюсь, это поможет.

Крам
источник
0

$ svn log | head -10 в любом каталоге, в котором есть .svnпапка

2 кипы
источник
0

svn infoили svnversionне будет принимать во внимание подкаталоги, чтобы найти последнюю «ревизию» живой кодовой базы, взломанный способ ниже работал у меня - это может занять некоторое время:

repo_root$ find ./ | xargs -l svn info  | grep 'Revision: ' | sort
...
Revision: 86
Revision: 86
Revision: 89
Revision: 90
$
Даниэль Соколовски
источник
0

Это можно получить с помощью библиотеки "SVN" :

import svn.remote

file_path = "enter your filepath"

svn_inf = svn.remote.RemoteClient(file_path)

head_revision = ([x for x in svn_inf.log_default(revision_to = 'HEAD')] [-1]).revision

Head_revision должен содержать номер последней версии файла.

Нага Рави Теджа Лелла
источник
-1

Похоже, для этого есть запись в официальном FAQ . Исходный код написан на языке C, но применяется тот же принцип, как указано здесь в этом сообщении списка рассылки .

Мэтт Би
источник
Это отличный инструмент / ответ, но я не думаю, что ему нужно так много - я понял, что нужна только последняя версия, поэтому, возможно, он сможет начать сборку, если его текущая версия отличается от предыдущей с момента последней проверки. Может я неправильно понял.
Тим
-1

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

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

Маркус Кун
источник