Как вы определяете последний номер версии SVN с корнем в каталоге? - PullRequest
32 голосов
/ 11 сентября 2008

Я хотел бы начать помечать мои развернутые двоичные файлы последним номером версии SVN.

Однако, поскольку SVN основан на файлах, а не на каталогах / проектах, мне нужно просмотреть все файлы каталога и подкаталога, чтобы определить наибольшее число ревизий.

Использование svn info в корне не работает (он просто сообщает версию этого каталога, а не файлы в подкаталогах):

Мне было интересно, есть ли ярлык, использующий команду svn для этого. В противном случае, кто-нибудь может предложить простой сценарий, эффективный для сети (я бы предпочел, чтобы он вообще не попадал на удаленный сервер)?

Я также понимаю, что одним из альтернативных подходов является сохранение файла версии с svn:keywords. Это работает (я использовал его в других проектах), но мне надоело следить за тем, чтобы файл был грязным, и иметь дело с неизбежными конфликтами слияния.

Ответ Я вижу, что моя проблема в том, что я не выполнил правильный svn up перед вызовом svn info в корневом каталоге:

$ svn info
Path: .
...
Last Changed Author: fak
Last Changed Rev: 713
Last Changed Date: 2008-08-29 00:40:53 +0300 (Fri, 29 Aug 2008)

$ svn up
At revision 721.

$ svn info
Path: .
...
Revision: 721
Last Changed Author: reuben
Last Changed Rev: 721
Last Changed Date: 2008-08-31 22:55:22 +0300 (Sun, 31 Aug 2008)

Ответы [ 10 ]

23 голосов
/ 11 сентября 2008

В одну сторону. Когда вы проверите код, посмотрите на последнюю строку вывода svn:

$ svn up
...stuff...
Updated to revision 66593.

Более прямой путь:

$ svn info
Path: .
URL: https://svn.example.com/svn/myproject/trunk
Repository Root: https://svn.example.com/svn/
Repository UUID: d2a7a951-c712-0410-832a-9abccabd3052
Revision: 66593
Node Kind: directory
Schedule: normal
Last Changed Author: bnguyen
Last Changed Rev: 66591
Last Changed Date: 2008-09-11 18:25:27 +1000 (Thu, 11 Sep 2008)
22 голосов
/ 30 октября 2008

svnversion, кажется, самый чистый способ сделать это:

svnversion -c /path/to/your-projects-local-working-copy/. | sed -e 's/[MS]//g' -e 's/^[[:digit:]]*://'

Приведенная выше команда удалит все буквы M и S (указывающие на локальные модификации или коммутацию) из выходных данных, а также меньший номер редакции в случае, если svnversion возвращает диапазон вместо одного номера редакции (см. документы для получения дополнительной информации). Если вы не хотите фильтровать вывод, извлеките канал и часть sed этой команды.

Если вы хотите использовать svn info, вам нужно использовать аргумент «рекурсивный» (-R), чтобы получить информацию также из всех подкаталогов. Поскольку выходные данные становятся длинным списком, вам нужно выполнить некоторую фильтрацию, чтобы получить последний измененный номер ревизии из всех самых высоких:

svn info -R /path/to/your-projects-local-working-copy/. | awk '/^Last Changed Rev:/ {print $NF}' | sort -n | tail -n 1

Что делает эта команда, так это то, что она берет все строки, включающие строку "Last Changed Rev", затем удаляет все из каждой из этих строк, кроме последнего поля (то есть номера ревизии), затем сортирует эти строки численно и удаляет все но последняя строка, в результате чего просто самый высокий номер ревизии. Если вы используете Windows, я уверен, что вы можете сделать это довольно легко, например, в PowerShell.

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

Если то, что вы хотите, является последней измененной версией этого пути на сервере , вы можете сделать:

svn info /path/to/your-projects-local-working-copy/.@HEAD | awk '/^Last Changed Rev:/ {print $NF}'
7 голосов
/ 30 октября 2008

Дубликат этого вопроса . Как я уже писал, команда svnversion - ваш друг. Не нужно анализировать вывод, не нужно сначала обновлять, просто выполняет работу.

3 голосов
/ 11 сентября 2008

Я не знаю, используете ли вы MSBuild (Visual Studio) для сборки своих двоичных файлов. Но если бы вы: между Subverion и MSBuild возможна связь через Проект MSBuild Community Tasks

Вот часть нашего скрипта сборки: наше (C #) приложение получает включенный номер ревизии SVN:

  <SvnVersion LocalPath="$(MSBuildProjectDirectory)" ToolPath="installationpath\of\subversion\bin">
     <Output TaskParameter="Revision" PropertyName="Revision" />
  </SvnVersion>
  <Message Text="Version: $(Major).$(Minor).$(Build).$(Revision)"/>
...
    AssemblyVersion="$(Major).$(Minor).$(Build).$(Revision)"
     AssemblyFileVersion="$(Major).$(Minor).$(Build).$(Revision)"

Jan

2 голосов
/ 02 декабря 2015

Если вы просто хотите получить номер ревизии последнего внесенного изменения и используете Windows без grep / awk / xargs, выполните следующую команду (командная строка):

X:\trunk>svn info -r COMMITTED | for /F "tokens=2" %r in ('findstr /R "^Revision"') DO @echo %r
67000

svn info -r COMMITTED предоставит вам последнее совершенное изменение каталога, в котором вы находитесь:

X:\Trunk>svn info -r COMMITTED
Path: trunk
URL: https://svn.example.com/svn/myproject/trunk
Repository Root: https://svn.example.com/svn/
Repository UUID: d2a7a951-c712-0410-832a-9abccabd3052
Revision: 67400
Node Kind: directory
Last Changed Author: example
Last Changed Rev: 67400
Last Changed Date: 2008-09-11 18:25:27 +1000 (Thu, 11 Sep 2008)

Цикл for запускается findstr, чтобы найти часть Revision выхода из svn info. Вывод из этого будет (вы этого не увидите):

Revision: 67000

, который затем разбивает токены и возвращает 2-го, чтобы быть echo исключено:

67000
2 голосов
/ 30 октября 2008

Существует программа, поставляемая с Subversion под названием svnversion , которая делает именно то, что вы хотите. Это как мы помечаем наши сайты.

2 голосов
/ 11 сентября 2008

Ответы, предоставленные @Charles Miller и @Troels Arvin, верны - вы можете использовать выходные данные svn update или svn info, но, как вы намекаете, последний работает, только если хранилище обновлено. Опять же, я не уверен, какое значение любой номер ревизии будет для вас, если часть вашего исходного дерева находится в другой ревизии, чем другая часть. Мне действительно кажется, что вы должны работать над однородным деревом. Я бы посоветовал либо обновить информацию перед запуском информации (или, если вы уже обновили свою сборку, у вас все хорошо), либо использовать svn info URL-to-source.

1 голос
/ 17 января 2013

Для меня лучший способ узнать номер последней редакции ствола / ответвления - это получить его с удаленного URL. Важно НЕ использовать рабочий каталог, потому что он может устареть. Вот фрагмент с партией (я очень ненавижу; -)):

@for /f "tokens=4" %%f in ('svn info %SVNURL% ^|find "Last Changed Rev:"') do set lastPathRev=%%f

echo trunk rev no: %lastPathRev%

Тем не менее, у меня проблема с жестким кодированием этого числа в качестве промежуточной версии в источники, содержащие $ Rev: $. Проблема в том, что $ Rev: $ содержит файл rev. нет. Поэтому, если номер ствола не превышает номер версии файла версии, мне нужно «искусственно» изменить этот файл и зафиксировать его, чтобы получить правильную промежуточную версию (= версия ствола). Это панель! У кого-нибудь есть идея получше? Большое спасибо

1 голос
/ 11 сентября 2008

"svn info" покажет вам номер редакции рабочей копии (см. Строку "Revision" в выходных данных "svn info"). Ваша система сборки, вероятно, позволяет вам разместить соответствующую часть вывода "svn info" где-нибудь, где это будет отражено в вашем приложении. Например, вы можете указать, что при сборке должен быть создан временный (не версионный) файл, содержащий выходные данные из "svn info"; и затем вы включаете этот файл при компиляции.

0 голосов
/ 25 октября 2012

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

repo_root# find ./ | xargs -l svn info  | grep 'Revision: ' | sort
...
Revision: 86
Revision: 86
Revision: 89
Revision: 90
root@fairware:/home/stage_vancity#
...