Всегда фиксируйте один и тот же файл с помощью SVN

StackOverflow https://stackoverflow.com/questions/5948

  •  08-06-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

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

    const long WC_REV = $WCREV$;

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

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

    SubWCRev путь o\workingcopy путь o\version.h.tmpl путь o\version.h

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

А документация для SubWCRev тоже может помочь.

Другие советы

По сути, вам нужен результат svnversion команда в файле.

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

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

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

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

svn propset svn:keywords "Revision" file.txt

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

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

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

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

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

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

Может ли файл номера ревизии быть изменен сценарием, который развертывает ваш сайт из 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 как в примере выше)

В зависимости от вашего клиента некоторые из них предлагают перехватчик предварительной фиксации, с помощью которого вы можете реализовать что-то, что просто «касается» файла и помечает его как измененный.Если вы используете что-то вроде Visual Studio, вы можете создать задачу после сборки, которая «касается» файла, но вам нужно будет убедиться, что вы выполнили сборку, прежде чем фиксировать изменения.

@gradonmantank:Потому что он хочет, чтобы этот файл был обновлен до последней версии.Вы полностью прочитали его вопрос?

Крючок предварительной фиксации может сработать.

Раньше у меня был ручной способ сделать это.Я бы запустил сценарий, который бы использовал sed для замены комментария текущей отметкой времени в моем файле $Rev$.Таким образом, содержимое файла изменится, и Subversion зафиксирует его.

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

Вместо этого, я думаю, вам понадобится небольшой скрипт, который вы будете выполнять вместо svn commit команда, которая сначала обновляет метку времени, а затем выполняет обычную фиксацию.

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

Таким образом, вам нужно каким-то образом принудительно обновить файл.

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top