Поточна команда перегляду Subversion


75

Чи існує команда Subversion для відображення поточного номера версії?

Після того, як svn checkoutя хочу запустити сценарій і потребую номер редакції у змінній. Було б чудово, якби була така команда svn info get_revision_number.

Відповіді:


118

Новіші версії svn підтримують --show-itemаргумент:

svn info --show-item revision

Для номера редакції вашої місцевої робочої копії використовуйте:

svn info --show-item last-changed-revision

Ви можете використовувати os.system()для виконання командний рядок наступним чином:

svn info | grep "Revision" | awk '{print $2}'

Я роблю це у своїх сценаріях щоночної збірки.

Також на деяких платформах є svnversionкоманда, але, думаю, у мене була причина не використовувати її. Ага, так. Ви не можете отримати номер редакції з віддаленого сховища, щоб порівняти його з локальним за допомогою svnversion.


4
Зверніть увагу, що cmd.exeв оригінальному питанні був тег, що означає, що OP знаходиться у Windows, де ви не можете використовувати grepі awk.
iamamac

1
os.system повідомляє лише код виходу, він не забезпечує спосіб отримання вихідних даних. Натомість виконання svn info(наприклад, з модулем підпроцесу), читання вихідних даних та виконання кроків grep / awk безпосередньо в Python ( if "Revision" in line: return line.split()[1]), як простіше, так і простіше, ніж спроба писати команди bash у Python.

4
позбутися grep:svn info | awk '/Revision/ { print $2; }'
просто когось

4
Якщо ви все одно svn info | awk '/^Revision:/ {print $2;}'
викликаєте

1
Якщо у вашій системі використовуються локалі, вам слід додати "LANG = C" раніше, наприклад так:LANG=C svn info | grep "Revision" | awk '{print $2}'
Флорент

24

Існує також більш зручна (для деяких) svnversionкоманда.

Результатом може бути один номер версії або щось подібне (від -h):

  4123:4168     mixed revision working copy
  4168M         modified working copy
  4123S         switched working copy
  4123:4168MS   mixed revision, modified, switched working copy

Я використовую цей фрагмент коду python для вилучення інформації про редакцію:

import re
import subprocess

p = subprocess.Popen(["svnversion"], stdout = subprocess.PIPE, 
    stderr = subprocess.PIPE)
p.wait()
m = re.match(r'(|\d+M?S?):?(\d+)(M?)S?', p.stdout.read())
rev = int(m.group(2))
if m.group(3) == 'M':
    rev += 1

5
  1. Перш за все статус svn має номер редакції, ви можете прочитати його звідти.

  2. Крім того, кожен файл, який ви зберігаєте у SVN, може зберігати номер редакції сам по собі - додайте $Rev$ключове слово до свого файлу та запустіть propset:svn propset svn:keywords "Revision" file

  3. Нарешті, номер редакції також є у .svn/entriesфайлі, четвертий рядок

Тепер кожного разу, коли ви перевіряєте цей файл, він буде мати ревізію сам по собі.


Щодо пункту 3, чи доцільно очікувати, що номер редакції завжди буде на 4-му рядку? Якщо це розумне сподівання, це здається найпростішим способом зробити це практично в будь-якому середовищі.
grimus

Так, принаймні в розумному діапазоні версій диверсій. Якщо вони змінять формат у якійсь майбутній версії (можливо, але не швидше за все скоро), то вам доведеться адаптуватися.
Корнел Кіселевич

Я трохи розібрався в цьому і виявив таке: svnbook.red-bean.com/en/1.4/svn.developer.insidewc.html Здається, формат, швидше за все, час від часу змінюватиметься. Я впевнений, що для більшості речей читання файлу записів буде працювати нормально, але вам доведеться підтримувати свій код, якщо файл записів змінюється.
гримус

На жаль, я не бачив вашого коментаря до того, як розмістив повідомлення, але, думаю, ми все одно погоджуємось.
гримус

Пробував svn, version 1.11.0 (r1845130) compiled Oct 31 2018, 12:40:42 on x86_64-unknown-cygwin: .svn/entriesмістить лише одне ціле число.
badams


2

svn info, Я вірю, це те, що ти хочеш.

Якби ви просто хотіли переглянути, можливо, ви могли б зробити щось на зразок:

svn info | grep "Revision:"

2

Використовуйте щось на зразок наведеного нижче, користуючись перевагами XML-результатів диверсії:

# parse rev from popen "svn info --xml"
dom = xml.dom.minidom.parse(os.popen('svn info --xml'))
entry = dom.getElementsByTagName('entry')[0]
revision = entry.getAttribute('revision')

Зауважте також, що залежно від того, для чого вам це потрібно, <commit revision=...>запис може бути більше того, що ви шукаєте. Це дає "останню змінену версію", яка не змінюватиметься, поки код у поточному дереві насправді не зміниться, на відміну від "Ревізії" (що надано вище), яка буде змінюватись щоразу, коли що-небудь у сховищі змінюється (навіть гілки) і ви робите "svn up", що не одне і те ж, ані часто настільки корисне.


Попросити svn вивести XML, а потім проаналізувати його? Це задумано як жарт?
Жульєн Герто

1
@JulienGuertault, ні, вихід XML призначений для програмного використання, тоді як не XML - ні. Розбір результатів роботи людини ризикує змінити формат у майбутньому та зламати ваш код, і залежно від контексту може знадобитися спеціальна робота кожного разу, коли вам потрібно робити подібні дії. Якщо ви використовуєте підхід XML, ви можете заощадити зусилля на інфраструктурі з часом. Не жарт, але я також не сказав би, що робити це в інший спосіб - це будь-яким чином неправильно . Просто особисті переваги. Я зробив і те, і інше.
Пітер Хансен,

Синтаксичний аналіз машинного та людського висновків є дійсним (варто наголосити у вашій відповіді). Але чому б просто не використовувати svnversion? Він має задокументований компактний вихід і не вимагає чогось такого складного для його синтаксичного аналізу.
Жульєн Герто

@frgtn дав svnversion для своєї відповіді вище, але, як я вже згадував, використання параметрів виводу --xml у різних підкомандах svn дає вам уніфікований спосіб обробки найрізноманітніших вимог. З svnversion вам може знадобитися ще один спеціальний синтаксичний аналізатор, наприклад, щоб мати справу з доданим "M", якщо ви цього не хочете. Будь ласка, просто розгляньте мою відповідь як одну з багатьох можливих альтернатив, не прийнятих Оперативною програмою, але, можливо, корисних для тих, хто запізнюється, які потрапляють сюди з пошуку.
Пітер Хансен,

Дякую за додаткове пояснення.
Жульєн Герто

2

Щойно використав відповідь @ badcat у зміненій версії, використовуючи subprocess.check_output():

import subprocess
revision = subprocess.check_output("svn info | awk '/^Revision:/ {print $2}'", shell=True).strip()

Я вважаю, що ви також можете встановити та використовувати pysvn, якщо хочете використовувати python для взаємодії зі svn.


1

Ніхто не згадує про Windows World SubWCRev , який при правильному використанні може автоматично підставляти необхідні дані у потрібні місця, якщо скрипт викликає SubWCRev у форміSubWCRev WC_PATH TPL-FILE READY-FILE

Зразок мого хука після фіксації (частина)

SubWCRev.exe CustomLocations Builder.tpl  z:\Builder.bat
...
call z:\Builder.bat

де мій Builder.tpl

svn.exe export trunk z:\trunk$WCDATE=%Y%m%d$-r$WCREV$

як результат, у мене є кожен раз bat-файл із змінною частиною - ім'я директорії - що відповідає метаданим Робочої копії


0

Я думаю, що мені потрібно зробити інформацію svn, а потім отримати номер за допомогою рядкової маніпуляції з "Ревізія: xxxxxx" Було б непогано, якби була команда, яка повертає лише число :)


0

В іншому випадку для старої версії, якщо '--show-item' не розпізнається, ви можете використовувати таку команду:

svn log -r HEAD | grep -o -E "^r[0-9]{1,}" | sed 's/r//g'

Сподіваюся, це допоможе.

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