svn version-control hook svn-hooks pre-commit

Comparta los ganchos de precompilación de SVN comunes/útiles



version-control hook (22)

¿Qué tal un gancho para compilar el proyecto? por ejemplo, ejecuta make all. ¡Esto asegura que nadie verifique el código que no compila! :)

¿Cuáles son algunos de los ganchos precompromisos comunes y / o útiles para SVN?


Algunos prefieren ejecutar una herramienta parecida a una pelusa para un idioma dado para encontrar problemas comunes en el código y / o imponer el estilo de codificación. Sin embargo, en un equipo pequeño y experto, prefiero permitir que cada compromiso se realice y se ocupen de posibles problemas durante la integración continua y / o la revisión del código. Gracias a esto, las confirmaciones son más rápidas, lo que fomenta las confirmaciones más frecuentes y facilita la integración.


Comprobando rutas absolutas en varios archivos de texto (es decir, VRML, XML, etc.). La mayoría del código registrado nunca debe tener rutas absolutas, sin embargo, algunas personas y herramientas insisten en producir material codificado.


Compruebo el tipo de archivo y me aseguro de que ciertos tipos prohibidos no se cometan por accidente (por ejemplo, .obj, .pdb). Bueno, no desde la primera vez que alguien registró 2 gig de archivos temporales generados por el compilador :(

para ventanas:

@echo off svnlook log -t "%2" "%1" | c:/tools/grep -c "[a-zA-z0-9]" > nul if %ERRORLEVEL% NEQ 1 goto DISALLOWED echo Please enter a check-in comment 1>&2 exit 1 :DISALLOWED svnlook changed -t %2 %1 > c:/temp/pre-commit.txt findstr /G:"%1/hooks/ignore-matches.txt" c:/temp/pre-commit.txt > c:/temp/precommit-bad.txt if %ERRORLEVEL% NEQ 0 exit /b 0 echo disallowed file extension >> c:/temp/precommit-bad.txt type c:/temp/precommit-bad.txt 1>&2 exit 1


Compruebo la colisión del caso (ventanas estúpidas) y también require-mergeinfo.pl para asegurar que el cliente sea al menos 1.5 - de esa manera siempre se establecerá svn: mergeinfo


Contaré unas palabras para enviar mensajes. Necesitan ser 5 palabras o más. Esto ha llevado a algunos insultos cómicos en mi contra ...


En la empresa en la que trabajo actualmente, esto está marcado:

  • Si los archivos binarios tienen establecido el atributo needs lock;
  • Si los archivos Java tienen el aviso de copyright estándar y si incluye el año actual;
  • Si el código está formateado correctamente (usamos Jalopy para el formato del código), esto puede sonar tonto, pero en realidad facilita las comparaciones de texto entre las diferentes versiones;
  • Si el código tiene un mensaje de confirmación;
  • Si la estructura del directorio se ajusta a lo que se define (todos los proyectos deben estar bajo una carpeta SVN definida, y cada proyecto debe tener una carpeta de etiquetas, ramas y troncales);

Supongo que es eso.

Me gusta la idea de verificar si la confirmación está asociada a un ticket; en realidad tiene mucho sentido para mí.



Estoy pensando en escribir uno para verificar doctype en archivos aspx / html, solo para asegurarme de que todos estén usando el correcto.

Además, puede hacer que un enlace de confirmación pre (o posterior) envíe una notificación a su servidor de CI como se describe en el blog de Hudson.


Inserta una nota en Mantis bugtracker con los detalles de la lista de cambios basados ​​en el mensaje de confirmación que tiene ''issue #'' o similar a través de RegEx.


Me gusta usar los ganchos svn para:

  • hacer cumplir los puntos más estrictos de estilo de código
  • comprobar si hay errores de sintaxis obvios
  • asegúrese de que las palabras clave especiales de Trac, como "Soluciones" o "Direcciones", en realidad preceden al número de problema correspondiente

Me gustaría un gancho que comprueba la nota [Reviewer: xyz] en el mensaje de confirmación y rechaza la confirmación.


Que tiene un mensaje de compromiso, y lo es! = Que "corregir errores". ¡Maldita sea, odiaba esos mensajes inútiles!


Que un usuario ha ingresado un comentario en el mensaje de compromiso y que contiene un número de problema particular para seguir.


Resolviendo la falta de File Externals en SVN 1.5 usando PostUpdate y PreCommit


Tenemos un gancho de confirmación de publicación que publica el mensaje en una cuenta de Twitter. Utiliza twitsvn (descargo de responsabilidad: soy un committer en ese proyecto).

¿Tonto? Tal vez ... pero resultó ser una buena forma de comunicar los sucesos de nuestro repositorio a algunos de los miembros del equipo con problemas de control de versiones. Una vez que SVN comenzó a hablar con ellos a través de su cliente de Twitter, no se sentía como una caja negra.


Un gran enlace de confirmación que tenemos en nuestro archivo es verificar todos los proyectos de Visual Studio .VCPROJ (o .CSPROJ) para asegurarnos de que los directorios de salida no se hayan cambiado a nada local (comúnmente utilizado para la depuración).

Estos problemas se compilarán correctamente, pero aún se romperá la compilación debido a la falta de ejecutables.


Usamos un combo de enlace precomprometido y postcompromiso para actualizar automáticamente bugzilla con la entrada asociada de la confirmación svn.

Usamos un segundo enlace (precompromiso) para garantizar que las propiedades svn: eol-style y svn: keywords apropiadas se establezcan en un archivo antes de agregarlo al repositorio.

Tenemos un tercer gancho (post-commit) para iniciar una compilación y enviar los resultados por correo si la compilación está rota, y para informar a todos cuando la compilación se haya reparado de nuevo.

Tenemos un cuarto gancho (post-commit) para iniciar la replicación de svn, para asegurarnos de que la replicación fuera del sitio sea lo más actualizada posible.

Desafortunadamente, no puedo publicar la fuente a estos, pero, a excepción de la integración de Bugzilla, son bastante fáciles de implementar, y Hudson es probablemente una mejor opción para la integración continua.

Para la integración de bugzilla, sugeriría buscar en scmbug .


Uso el check -mime-pliquet pre-commit hook para verificar que las opciones de Tipo MIME y Fin de línea estén establecidas en archivos comprometidos. Uso subversión para publicar archivos para que sean visibles en un sitio web usando DAV, y todos los archivos sin el tipo MIME se sirven como archivos de texto (por ejemplo, el código HTML se muestra en un navegador en lugar del marcado prestado).


Uso un gancho post-commit para reescribir la propiedad de autor a un nombre descriptivo de nuestro árbol ldap. (la autenticación es con la identificación del empleado)


Utilizo el siguiente script hook para asegurarme de que las terminaciones de línea del código fuente y los permisos de los scripts de shell son correctos (es frustrante cuando alguien ingresa en Windows cuando todo parece correcto y rompe la compilación de Unix).

#!/bin/bash REPOS="$1" TXN="$2" # Exit on all errors. set -e SVNLOOK=svnlook echo "`$SVNLOOK changed -t "$TXN" "$REPOS"`" | while read REPOS_PATH do if [[ $REPOS_PATH =~ A[[:blank:]]{3}(.*)/.(sh|c|h|cpp) ]] then if [ ${#BASH_REMATCH[*]} -ge 2 ] then FILENAME=${BASH_REMATCH[1]}.${BASH_REMATCH[2]}; # Make sure shell scripts are executable if [[ sh == ${BASH_REMATCH[2]} ]] then EX_VALUE="true" if [ -z "`$SVNLOOK propget -t /"$TXN/" /"$REPOS/" svn:executable /"$FILENAME/" 2> /dev/null`" ] then ERROR=1; echo "svn ps svn:executable $EX_VALUE /"$FILENAME/"" >&2 fi EOL_STYLE="LF" else EOL_STYLE="native" fi # Make sure every file has the right svn:eol-style property set if [ $EOL_STYLE != "`$SVNLOOK propget -t /"$TXN/" /"$REPOS/" svn:eol-style /"$FILENAME/" 2> /dev/null`" ] then ERROR=1; echo "svn ps svn:eol-style $EOL_STYLE /"$FILENAME/"" >&2 fi fi fi test -z $ERROR || (echo "Please execute above commands to correct svn property settings." >& 2; exit 1) done


  • Verifique las pestañas y rechace el check-in.
  • Verifique si hay terminaciones de línea inconsistentes y rechace el check-in.
  • Compruebe la existencia de "CR: [nombre de usuario]" y rechace el check-in si no hay revisión del código.