2008-09-21 17 views

Respuesta

53

palabras clave SVN no es una buena solución. Como otros señalaron que agregar $ Revision $ en un archivo solo afecta a el archivo específico, que puede no cambiar durante un tiempo prolongado.

Recordar "editar" un archivo (agregando o eliminando una línea en blanco) antes de cada confirmación es inútil. Podrías simplemente escribir la revisión a mano.

Una buena forma de hacerlo (que yo sepa) es tener un proceso de implementación automatizado (que siempre es bueno) y usar el comando svnversion. Esto es lo que hago:

Donde sea que necesite la revisión, hago un include: <?php include 'version.php'; ?>.Este archivo "version.php" solo tiene el número de revisión. Además, no es parte del repositorio (se debe ignorar). Así es como lo creo:

1) En proyectos donde SVN está instalado en el servidor, también lo utilizo para la implementación. Obtener la versión más reciente en el servidor tengo un script que entre otras cosas hace lo siguiente (se ejecuta en el servidor):

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

2) En proyectos donde SVN no está instalado mi script de implementación es más compleja: crea el archivo version.php localmente, comprime el código, lo carga y lo extrae

+0

Lo bueno de su respuesta es que es independiente del idioma: 'svnversion' guarda el número de revisión en un archivo de texto y es la aplicación que necesita ese valor que accede más tarde a ese archivo. – AxeEffect

17

Asumiendo que su Webroot es una copia desprotegida del árbol de la subversión, se podría analizar el archivo /.svn/entries y enganche el número de revisión (4ª línea aquí) ...

En PHP:

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

hace que su aplicación depende de elementos internos SVN. Disculpa, no, no –

+11

@ Brent.Longborough No me gustaría votar si pudieras, pero no puedo, así que dejaré este comentario. –

+0

En realidad esto parece más portátil que usar un binario svnversion posiblemente "no existe", especialmente considerando sistemas de Windows, cajas de desarrolladores, etc. –

4

de this answer:

usted puede hacerlo añadiendo lo siguiente cualquier parte del código

$Id:$ 

Así, por ejemplo, Jeff hizo:

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

y en caso de control en el servidor reemplazado $ Id: $ con el número revisión actual. También encontré this reference.

También hay $ Fecha: $, $ Rev: $, $ Revision: $

+2

Ten cuidado con esto. Como se mencionó en daremon, la palabra clave SVN no se actualizará a menos que ese archivo haya cambiado. Tengo una base de código donde esta información se encuentra en una "Ventana Acerca de" que muy pocas veces se modifica. Con frecuencia me olvido de "editar" ese archivo para que se actualice la ID de Rev. –

2

En la mayoría de los casos el código en el servidor sería en realidad contienen una "exportación" del código, no de una copia y, por lo tanto, no contiene las carpetas .svn. Al menos esa es la configuración que veo más a menudo. ¿Los demás realmente revisan su código en el servidor web?

+1

No, probablemente estés ahí. Ese es probablemente el mejor comportamiento para un servidor de producción también ... Es posible que no desee que la gente husmee en los directorios .svn. – Oli

+5

Espero que no permita el acceso a los directorios .svn en la configuración de su servidor o al menos .htaccess. De lo contrario, se puede ver todo su código. –

2

La manera más fácil es utilizar Subversion "Keyword Substitution". Hay una guía here en el libro SVN (Version Control with Subversion).

Básicamente, solo tendrá que agregar el texto $ Rev $ en algún lugar de su archivo. Luego active la palabra clave en su repositorio. En el checkout, SVN sustituirá el número de revisión en el archivo.

2

Puede acercarse con SVN Keywords. Agregue $ Revision $ donde desee que se muestre la revisión, pero eso solo mostrará la última revisión que se modificó en ese archivo en particular, por lo que tendría que hacer un cambio en el archivo cada vez. No es posible obtener el número de revisión global sin algún tipo de script externo o un enlace post-commit.

0

Otra posibilidad para hacerlo es ejecutar un cron que ejecute los pasos descritos en el "Proceso de implementación" (asumiendo que es un * nix/FreeBSD servidor).

1

También puede hacerlo de esta manera:

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

Véase mi respuesta a la pregunta similar "Mark" svn export with revision.

Si captura el número de revisión cuando se exporta se puede utilizar:

svn export /path/to/repository | grep ^Exported > revision.txt 

a la tira de todo, pero el número de revisión, puede canalizarla a través de este comando sed:

svn export /path/to/repository | grep ^Exported | sed 's/^[^0-9]\+\([0-9]\+\).*/\1/' > revision.txt 
0

Si el rendimiento es un problema, entonces usted podría hacer:

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

Esto, por supuesto, depende de su h Después de hacer un pago y la presencia del comando svn.

3

Mida un poco tarde, pero utilice un enlace de post-commit de Subversion. En la carpeta ganchos de su repositorio, crear una secuencia de comandos shell como éste:

#!/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 

Este ejemplo particular asume su sitio en vivo se encuentra en/web/raíz y el código de desarrollo se lleva a cabo en otros lugares. Cuando se realiza un cambio de desarrollador, el script elimina la plantilla previa en vivo (para evitar mensajes conflictivos), ejecuta la actualización y reemplaza las apariciones de REVISIÓN en la plantilla con el número de revisión real.

Más en ganchos here

8

Esta es la forma en que tengo que trabajar. Si el servidor está configurado para permitir que shell_exec y usted tiene SVN instalado basta con ejecutar:

$revision = `svnversion`; 

o

$revision = shell_exec('svnversion'); 
+0

¿No es el comando svnversion? – grantc

+0

¡Uy! Debe haber sido otra noche tarde. ¡Gracias! Corregido :) –

+3

¿Cómo no es esta la respuesta aceptada? Funciona perfectamente y mucho mejor que cualquier otro esquema que parece. Incluso puedes cronizar cosas en un archivo de texto. ¡Gracias! Fácil y perfecto y exactamente lo que pidió el OP – ladieu

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