2008-09-11 21 views
31

Me gustaría comenzar a etiquetar mis binarios implementados con el último número de revisión de SVN.¿Cómo se determina el último número de revisión de SVN enraizado en un directorio?

Sin embargo, como SVN se basa en archivos y no en directorios/proyectos, necesito escanear todos los archivos del directorio y del subdirectorio para determinar el número de revisión más alto.

Usando svn info en la raíz no funciona (sólo se informa de la versión de ese directorio, no los archivos en los subdirectorios):

Me preguntaba si hay un acceso directo mediante el comando svn para hacer esto. De lo contrario, ¿alguien puede sugerir un script simple que sea eficiente en la red (preferiría que no llegara al servidor remoto)?

también entiendo que un enfoque alternativo es mantener un archivo de versión con el svn:keywords. Esto funciona (lo he usado en otros proyectos), pero me cansé de ocuparme de asegurarme de que el archivo esté sucio y lidiar con los inevitables conflictos de fusión.

respuesta que ver con mi problema mentido no hacer una adecuada svn up antes de llamar a svn info en el directorio raíz:

$ svn info 
Path: . 
... 
Last Changed Author: fak 
Last Changed Rev: 713 
Last Changed Date: 2008-08-29 00:40:53 +0300 (Fri, 29 Aug 2008) 

$ svn up 
At revision 721. 

$ svn info 
Path: . 
... 
Revision: 721 
Last Changed Author: reuben 
Last Changed Rev: 721 
Last Changed Date: 2008-08-31 22:55:22 +0300 (Sun, 31 Aug 2008) 

Respuesta

22

Una forma. A la salida del código, mira la última línea de salida de svn:

$ svn up 
...stuff... 
Updated to revision 66593. 

una manera más directa:

$ svn info 
Path: . 
URL: https://svn.example.com/svn/myproject/trunk 
Repository Root: https://svn.example.com/svn/ 
Repository UUID: d2a7a951-c712-0410-832a-9abccabd3052 
Revision: 66593 
Node Kind: directory 
Schedule: normal 
Last Changed Author: bnguyen 
Last Changed Rev: 66591 
Last Changed Date: 2008-09-11 18:25:27 +1000 (Thu, 11 Sep 2008) 
+0

Nunca pensé de utilizar svn up. Sin embargo, no estoy seguro de que me sienta cómodo de poner eso en una secuencia de comandos de implementación. Además, svn info no funciona porque solo informa en ese directorio, no en los archivos de los subdirectorios. ¡Gracias por la idea! –

+0

Ignore el comentario sobre svn info, entendí mal la interacción de svn up y svn info. –

1

"svn info" le mostrará el número de revisión de la copia de trabajo (ver la Línea "Revisión" en la salida de "svn info"). Su sistema de compilación probablemente le permita colocar la parte relevante de la información de "svn info" en algún lugar donde se reflejará en su aplicación. Por ejemplo, puede especificar que al crear, se debe crear un archivo temporal (sin versión) que contenga el resultado de "svn info"; y luego incluye este archivo al compilar.

+0

Ahh, parece que malinterpreté las interacciones de svn up y svn info. ¡Gracias por hacerme probar mis suposiciones! –

2

No sé si está usando MSBuild (Visual Studio) para construir sus binarios. Pero si lo haría: hay una conexión posible entre Subverion y MSBuild través MSBuild Community Tasks Project

Aquí es parte de nuestra escritura de la estructura: nuestra (C#) aplicación obtiene el número SVN revisión incluye:

<SvnVersion LocalPath="$(MSBuildProjectDirectory)" ToolPath="installationpath\of\subversion\bin"> 
    <Output TaskParameter="Revision" PropertyName="Revision" /> 
    </SvnVersion> 
    <Message Text="Version: $(Major).$(Minor).$(Build).$(Revision)"/> 
... 
    AssemblyVersion="$(Major).$(Minor).$(Build).$(Revision)" 
    AssemblyFileVersion="$(Major).$(Minor).$(Build).$(Revision)" 

Ene

+0

No lo soy, pero estoy seguro de que la información es útil para quienes sí lo son. ¡Gracias! –

2

las respuestas proporcionadas por @Charles Miller y @Troels Arvin son correctas - se puede utilizar la salida de la svn update o svn info, pero a medida que insinúan, este último sólo funciona si el depósito está al día. Por otra parte, no estoy seguro de cuál es el valor del número de revisión que le corresponderá si parte de su árbol fuente está en una revisión diferente a la de otra parte. Realmente me parece que deberías estar trabajando en un árbol homogéneo. Sugiero que actualice antes de ejecutar la información (o si ya ha actualizado su compilación, está dorado) o usando svn info URL-to-source.

20

svnversion parece ser la forma más limpia de hacer esto:

svnversion -c /path/to/your-projects-local-working-copy/. | sed -e 's/[MS]//g' -e 's/^[[:digit:]]*://' 

El comando anterior limpiar cualquier letra M y S (indicando las modificaciones locales o switchedness) desde la salida, así como la revisión más pequeña número en el caso svnversion devuelve un rango en lugar de solo un número de revisión (consulte the docs para obtener más información). Si no desea filtrar la salida, saque la tubería y la parte sed de ese comando.

Si desea utilizar svn info, debe utilizar el argumento "recursivo" (-R) para obtener la información de todos los subdirectorios también. Desde la salida se convierte entonces en una larga lista, tendrá que hacer algún tipo de filtrado para obtener el último número de la revisión cambió de todos los que es el más alto:

svn info -R /path/to/your-projects-local-working-copy/. | awk '/^Last Changed Rev:/ {print $NF}' | sort -n | tail -n 1 

Lo que comando hace es que toma todos las líneas que incluyen la cadena "Last Changed Rev", luego elimina todo de cada una de esas líneas excepto el último campo (es decir, el número de revisión), luego ordena estas líneas numéricamente y elimina todo menos la última línea, lo que da como resultado el número de revisión más alto. Si está ejecutando Windows, estoy seguro de que también puede hacerlo fácilmente en PowerShell, por ejemplo.

Para que quede claro: los enfoques anteriores se obtiene el último número cambiado recursiva revisión de sólo la ruta en el repositorio de que su copia de trabajo local representa, para esa copia de trabajo local, sin golpear el servidor. Entonces, si alguien ha actualizado algo en esta ruta al servidor del repositorio después de su último svn update, no se reflejará en esta salida.

Si lo que quiere es la última revisión de este cambio de ruta en el servidor , que puede hacer:

svn info /path/to/your-projects-local-working-copy/[email protected] | awk '/^Last Changed Rev:/ {print $NF}' 
7

duplicados de this question. Como publiqué allí, el comando svnversion es tu amigo. No es necesario analizar el resultado, no hay necesidad de actualizar primero, solo hace el trabajo.

+0

'svnversion -c' dará el número de revisión del último cambio en esa ruta. –

2

Hay un programa distribuido con Subversion llamado svnversion que hace exactamente lo que quiere hacer. Así es como etiquetamos nuestros sitios web.

0

Esto es ridículo, pero svn info o no tendrá en cuenta los subdirectorios; es una característica llamada trabajo 'Revisiones mixtas' - Yo lo llamo tortura. Sólo tenía que encontrar las últimas 'revisión' de la base de código en vivo y la corté muy por debajo trabajado para mí - que podría tomar un tiempo para ejecutar:

repo_root# find ./ | xargs -l svn info | grep 'Revision: ' | sort 
... 
Revision: 86 
Revision: 86 
Revision: 89 
Revision: 90 
[email protected]:/home/stage_vancity# 
+1

"WC mixto" es ** tu elección **, nadie te dicta que vayas por esta (fea) forma de desarrollo –

1

Para mí la mejor manera de descubrir el último número de la revisión del tronco/rama es obtenerlo desde la URL remota. Es importante NO usar el directorio de trabajo porque puede estar obsoleto. Aquí hay un fragmento con el lote (odio mucho ;-)):

@for /f "tokens=4" %%f in ('svn info %SVNURL% ^|find "Last Changed Rev:"') do set lastPathRev=%%f 

echo trunk rev no: %lastPathRev% 

Pero tengo un problema para codificar este número como versión provisional en fuentes que contienen $ Rev: $. El problema es que $ Rev: $ contiene el archivo rev. no. Entonces, si trunk rev no es más grande que el rev no del archivo de versión, necesito modificar este archivo "artificialmente" y comprometerlo para obtener la versión provisional correcta (= versión troncal). Este es un panel! ¿Alguien tiene una mejor idea? Muchas gracias

1

Si lo que desea es el número de revisión del último cambio que se ha cometido, y está utilizando Windows sin grep/awk/xargs, aquí es el escueto comando a ejecutar (línea de comandos):

X:\trunk>svn info -r COMMITTED | for /F "tokens=2" %r in ('findstr /R "^Revision"') DO @echo %r 
67000 

svn info -r COMMITTED le dará el último cambio comprometidos con el directorio que se encuentra en:

X:\Trunk>svn info -r COMMITTED 
Path: trunk 
URL: https://svn.example.com/svn/myproject/trunk 
Repository Root: https://svn.example.com/svn/ 
Repository UUID: d2a7a951-c712-0410-832a-9abccabd3052 
Revision: 67400 
Node Kind: directory 
Last Changed Author: example 
Last Changed Rev: 67400 
Last Changed Date: 2008-09-11 18:25:27 +1000 (Thu, 11 Sep 2008) 

el bucle se ejecuta findstr hasta encontrar la parte de revisión de la salida de svn info. El resultado de esto será (que no se ve esto):

Revision: 67000 

Que a su vez divide la tokens, y devuelve el segundo, para ser echo ed a cabo:

67000 
Cuestiones relacionadas