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
Eche un vistazo a este guión casero: http://envrac.blogdns.net/shellscripts/export-automatique-d-un-projet-subversio !
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