Чи існує команда Subversion для відображення поточного номера версії?
Після того, як svn checkout
я хочу запустити сценарій і потребую номер редакції у змінній. Було б чудово, якби була така команда svn info get_revision_number
.
Відповіді:
Новіші версії 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.
svn info
(наприклад, з модулем підпроцесу), читання вихідних даних та виконання кроків grep / awk безпосередньо в Python ( if "Revision" in line: return line.split()[1]
), як простіше, так і простіше, ніж спроба писати команди bash у Python.
grep
:svn info | awk '/Revision/ { print $2; }'
svn info | awk '/^Revision:/ {print $2;}'
LANG=C svn info | grep "Revision" | awk '{print $2}'
Існує також більш зручна (для деяких) 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
Перш за все статус svn має номер редакції, ви можете прочитати його звідти.
Крім того, кожен файл, який ви зберігаєте у SVN, може зберігати номер редакції сам по собі - додайте $Rev$
ключове слово до свого файлу та запустіть propset:svn propset svn:keywords "Revision" file
Нарешті, номер редакції також є у .svn/entries
файлі, четвертий рядок
Тепер кожного разу, коли ви перевіряєте цей файл, він буде мати ревізію сам по собі.
svn, version 1.11.0 (r1845130) compiled Oct 31 2018, 12:40:42 on x86_64-unknown-cygwin
: .svn/entries
містить лише одне ціле число.
REV =svn info svn://svn.code.sf.net/p/retroshare/code/trunk | grep 'Revision:' | cut -d\ -f2
svn info
, Я вірю, це те, що ти хочеш.
Якби ви просто хотіли переглянути, можливо, ви могли б зробити щось на зразок:
svn info | grep "Revision:"
Використовуйте щось на зразок наведеного нижче, користуючись перевагами 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", що не одне і те ж, ані часто настільки корисне.
svnversion
? Він має задокументований компактний вихід і не вимагає чогось такого складного для його синтаксичного аналізу.
Щойно використав відповідь @ badcat у зміненій версії, використовуючи subprocess.check_output()
:
import subprocess
revision = subprocess.check_output("svn info | awk '/^Revision:/ {print $2}'", shell=True).strip()
Я вважаю, що ви також можете встановити та використовувати pysvn, якщо хочете використовувати python для взаємодії зі svn.
Ніхто не згадує про 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-файл із змінною частиною - ім'я директорії - що відповідає метаданим Робочої копії
В іншому випадку для старої версії, якщо '--show-item' не розпізнається, ви можете використовувати таку команду:
svn log -r HEAD | grep -o -E "^r[0-9]{1,}" | sed 's/r//g'
Сподіваюся, це допоможе.
cmd.exe
в оригінальному питанні був тег, що означає, що OP знаходиться у Windows, де ви не можете використовуватиgrep
іawk
.