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}''