Как я могу получить номер версии Subversion в PHP?
Я хочу, чтобы мое приложение PHP было помечено номером ревизии, который оно использует, но я не хочу использовать CruiseControl или обновлять файл и загружать его каждый раз. Как мне это сделать?
13 ответов:
SVN keywords не является хорошим решением. Как указывали другие, добавление $ Revision$ в файл влияет только наконкретный файл , который может не изменяться в течение длительного времени.
Не забывать "редактировать" файл (добавляя или удаляя пустую строку) перед каждой фиксацией бессмысленно. С таким же успехом вы можете просто ввести ревизию вручную.
Один хороший способ сделать это (о котором я знаю) - это иметь автоматизированный процесс развертывания (что всегда хорошо) и использовать команду svnversion. Здесь вот что я делаю:
Везде, где мне нужна ревизия, я включаю:
<?php include 'version.php'; ?>
. Эта версия.php " файл имеет только номер редакции. Более того, он не является частью репозитория (он настроен на игнорирование). Вот как я его создаю:1) в проектах, где SVN установлен на сервере, я также использую его для развертывания. Получение последней версии на сервер у меня есть скрипт, который помимо всего прочего делает следующее (он работает на сервере):
cd /var/www/project svn update rm version.php svnversion > version.php
2) на проектах, где SVN не является установленный мною сценарий развертывания сложнее: он создает версию.php файл локально, архивирует код, загружает и извлекает его
Предполагая, что ваш webroot является извлеченной копией дерева subversion, вы можете проанализировать /.svn / entries файл и зацепить номер редакции (4-я строка здесь)...
В PHP:
$svn = File('.svn/entries'); $svnrev = $svn[3]; unset($svn);
Вот как я заставил его работать. Если ваш сервер настроен на разрешение shell_exec и у вас установлен SVN, просто запустите:
$revision = `svnversion`;
Или
$revision = shell_exec('svnversion');
Из Этот ответ:
Вы можете сделать это, добавив следующее в любом месте вашего кода
$Id:$
Так, например, сделал Джефф:
<div id="svnrevision">svn revision: $Id:$</div>
И при регистрации в сервер заменил $Id:$ на текущий номер ревизии. Я также нашел эту ссылку.
Есть также $Date:$, $Rev:$, $ Revision:$
Теперь немного поздно,но используйте крюк Subversion post-commit. В папке hooks вашего репозитория создайте сценарий оболочки, подобный этому:
#!/bin/bash REPOS="$1" REV="$2" cd /web/root rm -f /web/root/templates/base.html /usr/bin/svn update /bin/sed -i s/REVISION/$REV/ /web/root/templates/base.html
В этом конкретном примере предполагается, что ваш живой сайт находится в /web/root, а код разработки хранится в другом месте. При фиксации изменения dev скрипт удаляет предыдущий живой шаблон (чтобы избежать конфликтных сообщений), запускает обновление и заменяет вхождения ревизии в шаблоне фактическим номером ревизии.
Подробнее о крючках здесь
В большинстве случаев код на сервере фактически содержал бы "экспорт" кода, а не проверку, и поэтому не содержал бы.папки svn. По крайней мере, такую установку Я вижу чаще всего. Действительно ли другие люди проверяют свой код на веб-сервере?
Вы можете приблизиться с помощью ключевых словSVN . Добавьте $Revision$ туда, где вы хотите, чтобы показывалась ревизия, но это будет только последняя ревизия, в которую был изменен конкретный файл, поэтому вам придется вносить изменения в файл каждый раз. Получение глобального номера редакции невозможно без какого-либо внешнего скрипта или крючка после фиксации.
Самый простой способ-использовать Subversion "подстановка ключевых слов". Есть руководство здесь в книге SVN (управление версиями с помощью Subversion).
Вам просто нужно будет добавить текст $Rev$ где-нибудь в вашем файле. Затем включите ключевое слово в репозитории. При оформлении заказа SVN подставит номер ревизии в файл.
Смотрите мой ответ на аналогичный вопрос "пометка" экспорт svn с ревизией.
Если вы записываете номер редакции при экспорте, вы можете использовать:
svn export /path/to/repository | grep ^Exported > revision.txt
Чтобы удалить все, кроме номера ревизии, вы можете передать его через эту команду sed:
svn export /path/to/repository | grep ^Exported | sed 's/^[^0-9]\+\([0-9]\+\).*/\1/' > revision.txt
Вы также можете сделать это следующим образом:
$status = @shell_exec('svnversion '.realpath(__FILE__)); if ( preg_match('/\d+/', $status, $match) ) { echo 'Revision: '.$match[0]; }