Всегда фиксировать один и тот же файл с SVN

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

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

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

10 svn
8.08.2008 13:55:04
13 ОТВЕТОВ
РЕШЕНИЕ

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

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

    const long WC_REV = $ WCREV $;

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

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

    Путь SubWCRev \ к \ рабочему пути к \ к \ version.h.tmpl пути \ к \ version.h

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

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

9
25.02.2009 18:32:54

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

1
8.08.2008 14:07:49

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

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

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

3
8.08.2008 14:21:42

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

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

1
8.08.2008 14:12:15

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

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

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

1
8.08.2008 14:15:49

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

4
8.08.2008 14:28:17

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

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

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

1
8.08.2008 14:28:52

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

Для получения дополнительной информации о pre-commit-hooks я нашел эту страницу полезной.

1
8.08.2008 14:48:29

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

2
24.02.2009 12:09:28

Может ли файл номера редакции быть изменен скриптом, который развертывает ваш сайт из 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
25.02.2009 10:30:50
Оппс, я забыл скопировать строку "set version =" .. Спасибо!
dbr 25.02.2009 10:31:21

По сути, вы хотите вывод svnversionкоманды в файл.

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

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

13
24.02.2009 13:31:50
+1 к этой идее. Хотелось бы добавить, что в больших репозиториях запуск svnversion может занять много времени (более минуты). По этой причине я анализирую вывод 'svn info'.
Joshua McKinnon 25.02.2009 19:38:18

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

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

svn propset svn:keywords "Revision" file.txt

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

6
2.03.2009 15:49:37
Я думаю, что @Stefan имел в виду что-то другое. Конечно, $ Rev $ даст вам соответствующий номер редакции последнего коммита этого конкретного файла . Но я думаю, что Стефан хочет иметь номер последней редакции всего проекта и использовать его как своего рода номер версии своего программного обеспечения.
user2161065 23.10.2013 15:16:38

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

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

1
2.03.2009 22:03:37