tutorial subversion repositorios listar español comandos svn build-automation

subversion - ¿Cómo se determina el último número de revisión de SVN enraizado en un directorio?



subversion linux (10)

"svn info" le mostrará el número de revisión de la copia de trabajo (vea 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.

Me gustaría comenzar a etiquetar mis binarios implementados con el último número de revisión de SVN.

Sin embargo, dado que 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.

El uso de la svn info en la raíz no funciona (simplemente informa la versión de ese directorio, no los archivos en los subdirectorios):

Me preguntaba si hay un atajo usando 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 las 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 . Veo mi problema mintiendo al no hacer un svn up correcto antes de llamar a la 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)


De una sola mano. Cuando revisa el código, mire la última línea de salida de svn:

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

Una forma 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)


Duplicado de esta pregunta . Como svnversion allí, el comando svnversion es tu amigo. No es necesario analizar el resultado, no hay necesidad de actualizar primero, solo hace el trabajo.


Esto es ridículo, pero svn info o svnversion no tendrá en cuenta los subdirectorios; es una característica llamada trabajo ''Revisiones mixtas'' - Yo lo llamo tortura. Solo necesitaba encontrar la última "revisión" de la base de código en vivo y la forma pirateada a continuación funcionó para mí; podría llevar un tiempo ejecutarla:

repo_root# find ./ | xargs -l svn info | grep ''Revision: '' | sort ... Revision: 86 Revision: 86 Revision: 89 Revision: 90 root@fairware:/home/stage_vancity#


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


Las respuestas proporcionadas por @Charles Miller y @Troels Arvin son correctas: puede usar el resultado de la svn update svn info o la svn info , pero como usted indica, esta última solo funciona si el repositorio está actualizado. Por otra parte, no estoy seguro de qué valor le asignará cualquier número de revisión 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. Te sugiero que actualices antes de ejecutar la información (o que ya hayas actualizado tu compilación, que estés dorado) o que svn info URL-to-source .


No sé si estás usando MSBuild (Visual Studio) para construir tus binarios. Pero si lo hiciera: hay una conexión posible entre Subverion y MSBuild a través del Proyecto de Tareas Comunitarias de MSBuild

Aquí hay parte de nuestro script de compilación: nuestra aplicación (C #) incluye el número de revisión svn:

<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


Para mí, la mejor manera de averiguar el último número de revisión del enlace / bifurcación es obtenerlo desde la URL remota. Es importante NO usar el directorio de trabajo porque puede estar obsoleto. Aquí hay un fragmento con 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%

Sin embargo, tengo un problema para codificar este número como versión provisional en fuentes que contengan $ 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


Si solo quiere el número de revisión del último cambio que se cometió, y está usando Windows sin grep / awk / xargs, aquí está el comando bare-bones para ejecutar (línea de comando):

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

svn info -r COMMITTED le proporcionará el último cambio confirmado en el directorio en el que se encuentra actualmente:

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 for ejecuta findstr para localizar la parte de Revisión de la salida de la svn info . El resultado de esto será (no verá esto):

Revision: 67000

Que luego divide los tokens , y devuelve el 2do, para ser echo :

67000


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 borrará cualquier letra M y S (indicando modificaciones locales o conmutación) de la salida, así como el número de revisión más pequeño en caso de que svnversion regrese un rango en lugar de solo un número de revisión (ver los documentos para más información). Si no quiere filtrar la salida, saque la tubería y la parte sed de ese comando.

Si desea usar la svn info , debe usar el argumento "recursivo" ( -R ) para obtener la información de todos los subdirectorios. Dado que el resultado se convierte en una lista larga, deberá filtrar para obtener el último número de revisión modificado de todos los que sean más altos:

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

Lo que hace ese comando es que toma todas 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 quita 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 le dan el recursivo último número de revisión modificado de solo la ruta en el repositorio que representa su copia local de trabajo, para esa copia de trabajo local, sin tocar el servidor. Entonces, si alguien ha actualizado algo en esta ruta al servidor del repositorio después de su última svn update , no se reflejará en esta salida.

Si lo que desea es la última revisión modificada de esta ruta en el servidor , puede hacer lo siguiente:

svn info /path/to/your-projects-local-working-copy/.@HEAD | awk ''/^Last Changed Rev:/ {print $NF}''