Usar el gancho post-commit de SVN para actualizar solo los files que se han confirmado

Estoy usando un repository SVN para mi trabajo de desarrollo web. Tengo un sitio de desarrollo configurado que contiene un checkout del repository.

He configurado un enlace SVN post-commit para que cada vez que se realice una confirmación en el repository, se actualice el sitio de desarrollo:

cd /home/www/dev_ssl /usr/bin/svn up 

Esto funciona bien, pero debido al tamaño del repository, las actualizaciones tardan mucho (aproximadamente 3 minutos), lo cual es bastante frustrante cuando se realizan confirmaciones regulares. Lo que me gustaría es cambiar el gancho post-commit para actualizar solo aquellos files / directorys que se han comprometido, pero no sé cómo hacer esto. La actualización del "directory común más bajo" probablemente sea la mejor solución, por ejemplo

Si comete los siguientes files:

  • /branches/feature_x/images/logo.jpg
  • /branches/feature_x/css/screen.css

Actualizaría el directory: / branches / feature_x /

¿Alguien puede ayudarme a crear una solución que logre esto?

Actualización :

  • El repository y el sitio de desarrollo están ubicados en el mismo server, por lo que los problemas de networking no deberían estar involucrados.
  • El uso de la CPU es muy bajo y las E / S deberían estar bien (se está ejecutando en un server dedicado de alta especificación)
  • El sitio de desarrollo es aprox. 7.5 GB de tamaño y contiene aprox. 600,000 artículos, esto se debe principalmente a tener múltiples twigs / tags

Puede usar svnlook dirs-changed y svn up -N para actualizar solo el contenido de cada carpeta modificada:

 cd /home/www/dev_ssl svnlook dirs-changed [REPOS] -r [REV] | xargs /usr/bin/svn up -N 

O bien, si por file puede ser mejor para usted (utilizando sed para despojar a los personajes de acción):

 svnlook changed [REPOS] -r [REV] | sed "s/^....//" | xargs /usr/bin/svn up 
 #!/bin/bash REPOS="$1" REV="$2" # A - Item added to repository # D - Item deleted from repository # U - File contents changed # _U - Properties of item changed; note the leading underscore # UU - File contents and properties changed # Files and directories can be distinguished, as directory paths are displayed with a trailing "/" character. LOOK=/usr/local/svn/bin/svnlook SVN=/usr/local/svn/bin/svn DEV=/var/www/test cd /var/tmp/svn for changes in `$LOOK changed $REPOS | awk '{print $1 "=" $2;}'`; do len=${#changes} idx=`expr index "$changes" =`; directory=${changes:$idx}; action=${changes:0:$idx-1}; if [ ${changes:len-1} = '/' ] then case "$action" in "A" ) \ mkdir --mode=775 -p $DEV/$directory; chown nobody:nobody $DEV/$directory; chmod 775 $DEV/$directory; ;; "D" ) \ rmdir $DEV/$directory; ;; esac else case "$action" in "A"|"U"|"UU" ) \ $SVN export --force --non-interactive -r HEAD -q file://$REPOS/$directory; BASE=`basename $directory`; DIR=`dirname $directory`; chown nobody:nobody $BASE; chmod 775 $BASE; mkdir --mode=775 -p $DEV/$DIR; cp -f --preserve=ownership $BASE $DEV/$DIR; unlink $BASE; ;; "D" ) \ rm -f $DEV/$directory; ;; esac fi done exit 0 

Para windows:

 for /F "eol=¬ delims=¬" %%A in ('svnlook dirs-changed %1 -r %2') do svn export "file:///c:/path/to/repo/%%A" "c:/svn_exports/%%A" --force 

Simplemente copie lo anterior en su file por lotes de gancho post-commit (o window para VisualSVN) y listo: obtendrá el directory actualizado exportado a c: \

Podría intentar usar% 1 en lugar de c: / ruta / hacia / repository anterior, pero descubrí que no funcionaba porque VisualSVN daba la ruta% 1 con separadores de ruta de acceso de retroceso y svnlook los proporcionaba con barras diagonales. Esto no parece funcionar bien, así que codifiqué la ruta de repository (obtuve los errores "El nombre del file, el nombre del directory o la syntax de la label del volumen es incorrecta")