Всегда фиксировать один и тот же файл с SVN - PullRequest
9 голосов
/ 08 августа 2008

В моем веб-приложении у меня есть файл, который содержит текущий номер ревизии через $ Rev $. Это прекрасно работает, за исключением того, что если я не внесу никаких изменений в этот файл, он не будет зафиксирован.

Можно ли в любом случае заставить один файл всегда фиксироваться на SVN-сервере?

Я использую TortoiseSVN для Windows, поэтому любой код или пошаговые инструкции будут полезны.

Ответы [ 13 ]

13 голосов
/ 24 февраля 2009

Как правило, вы хотите вывод команды svnversion в файл.

Такие файлы обычно хранятся вне хранилища и автоматически создаются скриптом сборки. Я предлагаю вам сделать то же самое. Если вы не строите, а просто набираете svn up на стороне сервера, просто наберите svnversion после svn up или создайте сценарий оболочки для выполнения обоих действий.

Если у вас есть , чтобы хранить его в хранилище, с другой стороны, лучше всего сделать ставку svnversion в ловушке перед фиксацией.

9 голосов
/ 25 февраля 2009

Если у вас установлен TortoiseSVN, у вас также есть инструмент SubWCRev. Используйте этот инструмент, чтобы получить ревизию, вместо неправильного использования ключевого слова $ REV $.

  1. создайте файл шаблона, который содержит ваши определения, может быть что-то вроде

    const long WC_REV = $ WCREV $;

    в файле с именем version.h.tmpl

  2. при каждой сборке вызывайте SubWCRev, чтобы создать «настоящий» файл, который вы можете использовать в своем приложении:

    SubWCRev путь \ до \ workingcopy путь \ до \ version.h.tmpl путь \ до \ version.h

Это создаст файл version.h из version.h.tmpl, в котором текст $ WCREV $ будет заменен ревизией, в которой находится ваша рабочая копия.

Также могут помочь документы для SubWCRev .

6 голосов
/ 02 марта 2009

Думаю, вы не понимаете, как работает флаг $ Rev $. Цель флага Rev не состоит в том, чтобы эта ревизия всегда фиксировалась в хранилище Subversion. Цель состоит в том, чтобы при обновлении флаг Rev всегда был тем, чем является ревизия. Вам не нужно помещать код в Subversion, который содержит ревизию. Subversion очень хорошо отслеживает эту информацию для вас.

Что вы, вероятно, пропустили, так это то, что вам нужно установить свойство для файла, чтобы ключевое слово Revision было правильно обработано.

svn propset svn:keywords "Revision" file.txt

Это гарантирует, что при каждом обновлении флаг $ Rev: xxx $ будет обновляться с текущей версией. Вам не нужно беспокоиться о том, как оно передается в хранилище.

4 голосов
/ 08 августа 2008

@ gatekiller: похоже, TortoiseSVN поддерживает клиентские хуки .

3 голосов
/ 08 августа 2008

Это прекрасно работает, за исключением того, что если я не внесу никаких изменений в этот файл, он не будет зафиксирован.

Если файл никогда не меняется, зачем вам его каждый раз фиксировать?

[EDIT] @Sean = Я понимаю, что он пытается сделать, но если файл никогда не обновляется через ловушку или каким-либо другим способом и, следовательно, никогда не изменяется, SVN никогда не поднимет его.

2 голосов
/ 24 февраля 2009

Может ли файл номера редакции быть изменен скриптом, который развертывает ваш сайт из SVN на веб-сервер?

Не уверен насчет Windows, но, используя bash-скрипт, я бы сделал что-то вроде ..

$ version=$(svnversion)
$ svn export . /tmp/staging/
Export complete.
$ echo "Revision: ${version}" > /tmp/staging/version.txt

Тогда /tmp/staging/version.txt будет содержать «Редакция: 1» (или любой другой номер ревизии).

Конечно, вы можете заменить некоторый идентификатор в файле, например $Rev$ (вместо создания version.txt, как в примере выше)

2 голосов
/ 24 февраля 2009

Я предлагаю изменить подход, каждый раз фиксируя файл, значит неявно хранить глобальный номер редакции в этом файле. Там пользователю может понадобиться другое ключевое слово, GlobalKey , чье отсутствие объяснено здесь Я фактически не использовал упомянутое svnversion , однако оно может привести вас к решению.

1 голос
/ 03 марта 2009

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

Если вы используете maven, вы можете сделать это с помощью maven-buildnumber-plugin.

1 голос
/ 08 августа 2008

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

Для получения дополнительной информации о хуках предварительной фиксации я нашел эту страницу полезной.

1 голос
/ 08 августа 2008

Создание файла не принесет вам никакой пользы. Файл не зафиксирован с полной версией внутри, он заменен только ключевым словом. Если вы посмотрите на файл внутри хранилища, вы увидите это.

Таким образом, вместо этого вам необходимо принудительно обновить файл.

Если вы работаете на платформе Windows, вы можете использовать инструмент SubWCRev, распространяемый вместе с TortoiseSVN. Документация здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...