Как я могу получить номер версии Subversion в PHP?


Я хочу, чтобы мое приложение PHP было помечено номером ревизии, который оно использует, но я не хочу использовать CruiseControl или обновлять файл и загружать его каждый раз. Как мне это сделать?

13 30

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];
}
$svn_rev=file_get_contents('/path.to.repository/db/current');

Еще одна возможность сделать это-запустить cron, который выполняет шаги, описанные в "процессе развертывания" (предполагая, что это сервер *nix/FreeBSD).

Если производительность является проблемой, то вы могли бы сделать:

exec('svn info /path/to/repository', $output);
$svn_ver = (int) trim(substr($output[4], strpos($output[4], ':')));

Это, конечно, зависит от того, что вы выполнили проверку и наличие команды svn.