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

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

Ответ 1

Ключевые слова SVN не являются хорошим решением. Как отмечали другие, добавление $Revision $в файл влияет только на конкретный файл, который может не измениться в течение длительного времени.

Помните, что нужно "редактировать" файл (добавив или удалив пустую строку) до того, как каждое совершение будет бессмысленным. Вы могли бы просто набрать ревизию вручную.

Один хороший способ сделать это (что я знаю) - это автоматизированный процесс развертывания (что всегда хорошо) и использование команды svnversion. Вот что я делаю:

Где бы я ни нуждался в пересмотре, я включаю: <?php include 'version.php'; ?>. Этот файл "version.php" имеет только номер версии. Более того, он не является частью репозитория (он должен быть проигнорирован). Вот как я его создаю:

1) В проектах, где SVN установлен на сервере, я также использую его для развертывания. Получение последней версии на сервере У меня есть script, который, помимо прочего, делает следующее (он выполняется на сервере):

cd /var/www/project
svn update
rm version.php
svnversion > version.php

2) В проектах, где SVN не установлен, мое развертывание script является более сложным: он создает файл version.php локально, застегивает код, загружает и извлекает его

Ответ 2

Предполагая, что ваш webroot является извлеченной копией дерева subversion, вы можете проанализировать файл /.svn/entries и подключить номер версии (4-я строка здесь)...

В PHP:

$svn = File('.svn/entries');
$svnrev = $svn[3];
unset($svn);

Ответ 3

Вот как я заработал. Если ваш сервер настроен для разрешения shell_exec И вы только что установили SVN:

$revision = `svnversion`;

или

$revision = shell_exec('svnversion');

Ответ 4

Из этого ответа:

Вы можете сделать это, добавив следующие в любом месте вашего кода

$Id:$ 

Итак, например, Джефф сделал:

<div id="svnrevision">svn revision: $Id:$</div>

а при проверке в сервер заменил $Id: $на текущий номер ревизии. Я также нашел эту ссылку.

Существует также $Date: $, $Rev: $, $Revision: $

Ответ 5

Бит позже, но используйте крюк post-commit Subversion. Создайте оболочку script в папке "Крюки репозитория":

#!/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, script удаляет предыдущий живой шаблон (во избежание конфликтов), запускает обновление и заменяет вхождения REVISION в шаблоне фактическим номером ревизии.

Подробнее о крючках здесь

Ответ 6

В большинстве случаев код на сервере фактически содержит "Экспорт" кода, а не проверку, и поэтому не содержит папок .svn. По крайней мере, эту настройку я вижу чаще всего. Другие действительно проверяют свой код на веб-сервере?

Ответ 7

Самый простой способ - использовать Subversion "Keyword Substitution". Существует руководство здесь в книге SVN (Контроль версий с Subversion).

Вам просто нужно будет добавить текст $Rev $где-то в вашем файле. Затем включите ключевое слово в вашем репозитории. При проверке SVN заменит номер версии в файле.

Ответ 8

Вы можете приблизиться к Ключевые слова SVN. Добавьте $Revision $, где вы хотите, чтобы ревизия отображалась, но будет отображаться только последняя ревизия, в которой был изменен конкретный файл, поэтому вам придется каждый раз вносить изменения в файл. Получение глобального номера ревизии невозможно без какого-либо внешнего script или крюка post-commit.

Ответ 9

См. мой ответ на аналогичный вопрос "Марк" Экспорт 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

Ответ 10

Вы также можете сделать это следующим образом:

$status = @shell_exec('svnversion '.realpath(__FILE__));
if ( preg_match('/\d+/', $status, $match) ) {
    echo 'Revision: '.$match[0];
}

Ответ 11

$svn_rev=file_get_contents('/path.to.repository/db/current');

Ответ 12

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

Ответ 13

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

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

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