Отримання останнього ревізійного номера у SVN?


103

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

SVN розташований у моєму Інтранеті, але не на моєму конкретному комп’ютері.

У мене встановлено SVN, але прив'язки для PHP / Perl / Python не встановлені. Я запускаю Windows XP, але я вважаю за краще незалежне від платформи рішення, яке також може працювати в Linux. Якщо у вас є рішення для Linux (або лише для XP), це також буде корисним.


2
"svn info - show-item revision" надасть поточну версію, до якої оновлений поточний каталог.
GreatAndPowerfulOz

1
$ 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 ); ти використовував це навмисно (каламбур) або ти звичайно використовуєш таким чином замість цього?
одалет

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

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

У мене svn info -r HEAD
виникли

38

Це має працювати в Bash, з робочого каталогу. Я використовував його в Windows із встановленими unixutils :

svn info |grep Revision: |cut -c11-

Він працює, якщо ви помістите URL сховища там, де у вас є% *, що б ви не мали на увазі під цим. Хороший синтаксис крою, я цього не знав раніше.
ypnos

1
Примітка: оскільки в цьому файлі відсутня -rHEAD, це поверне редагування фіксації для запитуваного файлу чи каталогу. Це може бути не останньою загальною редакцією (оскільки інші зміни, можливо, були внесені в іншому місці або в піддереві).
Містер Фооз,

4
Також це не працює для локалізованих версій SVN (польською мовою це має бути | cut -c9-).
zgoda

2
тобто, btw, причина, по якій я сильно не люблю локалізовані інструменти для розробників командного рядка; нульова перевага, купа проблем. Я зазвичай видаляю локалізації саме з цієї причини.
gimpf

7
Передача роздільника замість числа символів найкраще працює для локалізованого вмісту, наприклад svn info | grep Revision | cut -d " " -f 2, поверне другу рядок після її розбиття за допомогою пробілів.
Butifarra

34

Слід працювати:

svnlook youngest <repo-path>

Він повертає єдиний номер перегляду.


15

Щоб дійсно отримати номер останньої редакції ("головна редакція") у вашому віддаленому сховищі, скористайтеся цим:

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

Наприклад:

35669

12

Примітка про отримання останнього номера редакції:

Скажіть, що я 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повідомляється локально).


9
  • Починаючи з Subversion 1.9, ви можете скористатися опцією --show-item, щоб отримати значення одного з полів svn infoвиводу команди. Ця команда відображатиме лише номер редакції:

    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 Server 3.4 або новішу, ви можете отримати кількість ревізій у сховищі, виконавши ці команди:

    $repo = Get-SvnRepository <REPOSITORY-NAME>

    $repo.Revisions

    Для отримання додаткової інформації див. Get-SvnRepositoryПосилання на командлет PowerShell .


7

Я думаю, ти шукаєш

svn info -r HEAD

Чи можете ви скористатися цією командою?

Можливо, вам потрібно буде також подати облікові дані для входу в сховище.


Я думаю, що це має бути svn info -r HEAD
Stephen

-r може бути легко оминутий тоді.
ypnos

Правильно - я не вказав варіант для -r - це було саме для нього, щоб знайти те, що йому потрібно, і розпочати роботу з довідкою / книгою.
Тім

4

Хтось ще побив мене, щоб розмістити відповідь про svnversion, що, безумовно, найкраще рішення, якщо у вас є робоча копія (IIRC, вона не працює з URL-адресами). Додам: якщо ви перебуваєте на сервері, на якому розміщено SVN, найкращим способом є використання svnlookкоманди. Це команда, яку ви використовуєте під час написання сценарію гачка для огляду сховища (і навіть поточної транзакції, якщо гачки попередньо здійснюються). Ви можете ввести svnlook helpдеталі. Можливо, ви хочете скористатися svnlook youngestкомандою. Зауважте, що для нього потрібен прямий доступ до каталогу repo, тому його потрібно використовувати на сервері.


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

Якщо у вас є нещастя з необхідністю зробити це з пакетного файлу 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

дивіться цю іншу відповідь на основі цього
icc97

2

Ви шукаєте виклик, подібний виклику командного рядка

svn info URL

Здається, що це можливо за допомогою бібліотеки pysvn, і є рецепт який повинен допомогти вам почати роботу. Я не впевнений, чи є щось подібне для PHP.

Якщо вам потрібно вдатися до виклику бінарного --xmlфайлу SVN, не забудьте скористатися параметром, щоб отримати результат як XML. Це повинен бути простіший для розбору, ніж вихідний з командного рядка.


Я використовую subprocess.check_outputв python, щоб уникнути чергового дзвінка в бібліотеку. Якщо ви просто перевіряєте номери версій / витягуєте останні копії, простіше просто використовувати svn з командного рядка через subprocess. Тепер, якщо ви робите автоматичні реєстрації та злиття ...
Droogans

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в БАШ дасть вам усі деталі

RESULT:
Path: .
URL: 
Repository Root: 
Repository UUID: 
Revision: 54
Node Kind: directory
Schedule: normal
Last Changed Author: 
Last Changed Rev: 54
Last Changed Date: 

З цього ви отримаєте РЕВІЗІЮ


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набором властивостей, зовнішні можуть змінитися, і, отже, остання редакція сервера підривної системи зміниться. Але остання редакція робочої копії чи URL-адреси повідомить про номер редакції лише тоді, коли змінити pron svn: externals або будь-який елемент нижче в шляху до URL-адреси, що очікується.

Таким чином, ви або отримуєте svn:externalsвластивість і перебираєте URL-адреси та вибираєте перегляд висот або запитуєте базову URL-адресу на підривному сервері. Версія, повідомлена з базової URL-адреси, буде містити останню версію для ВСЕГО на сервері.

Отже, якщо ви використовуєте зовнішні, найкраще використовувати, svn info BASE_URLде BASE_URLє коренева URL-адреса для всіх шляхів на підривному сервері.


0

Це отримає саме номер ревізії останньої зміненої версії:

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

Я сподіваюся, що це допомагає.


0

$ svn log | head -10 у будь-якому каталозі, в якому є .svnпапка


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, але застосовується той самий принцип, який описаний у цій публікації списку розсилки .


Це чудовий інструмент / відповідь, але я не думаю, що він так багато потребує - я зрозумів, що це потрібна лише остання редакція, тож, можливо, він може почати збірку, якщо його поточна редакція відрізняється від попередньої з моменту останньої перевірки. Можливо, я неправильно зрозумів.
Тім

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.