Подтвердить что ты не робот

Как вы определяете последний номер версии SVN, внедренный в каталог?

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

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

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

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

Я также понимаю, что один альтернативный подход заключается в том, чтобы сохранить файл версии с 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)
4b9b3361

Ответ 1

Один из способов. Когда вы проверите код, посмотрите на последнюю строку вывода 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)

Ответ 2

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/[email protected] | awk '/^Last Changed Rev:/ {print $NF}'

Ответ 3

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

Ответ 4

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

Здесь часть нашего сборника script: наше (С#) приложение получает номер версии 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

Ответ 5

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

Ответ 6

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

Ответ 7

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

Ответ 8

Для меня лучший способ узнать последний номер ревизии соединительной линии/ветки - получить его с удаленного 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. нет. Так что если trunk rev no больше, чем rev no файла версии, мне нужно "искусственно модифицировать этот файл" и зафиксировать его, чтобы получить правильную промежуточную версию (= версия trunk). Это панель! У кого-то есть идея? Большое спасибо

Ответ 9

Если вам просто нужен номер версии последнего изменения, который был зафиксирован, и они используют 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 ed out:

67000

Ответ 10

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

repo_root# find ./ | xargs -l svn info  | grep 'Revision: ' | sort
...
Revision: 86
Revision: 86
Revision: 89
Revision: 90
[email protected]:/home/stage_vancity#