tutorial tortoise subversion repositorio linea funciona espaƱol descargar crear como comandos svn hook post-commit

subversion - tortoise svn local



Usar el gancho post-commit de SVN para actualizar solo los archivos que se han confirmado (4)

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

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

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

Esto funciona bien, pero debido al tamaño del repositorio, 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 archivos / directorios que se han comprometido, pero no sé cómo hacer esto. La actualización del "directorio común más bajo" probablemente sea la mejor solución, por ejemplo

Si comete los siguientes archivos:

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

Actualizaría el directorio: / branches / feature_x /

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

Actualización :

  • El repositorio y el sitio de desarrollo están ubicados en el mismo servidor, por lo que los problemas de red 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 servidor 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 ramas / etiquetas


Para ventanas:

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 archivo por lotes de gancho post-commit (o ventana para VisualSVN) y listo: obtendrá el directorio actualizado exportado a c: /

Podría intentar usar% 1 en lugar de c: / ruta / hacia / repositorio 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 repositorio (obtuve los errores "El nombre del archivo, el nombre del directorio o la sintaxis de la etiqueta del volumen es incorrecta")


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 archivo 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