2009-04-02 14 views
20

Hola, me preguntaba si hay una manera para que el servidor SVN asigne automáticamente la propiedad svn: needs-lock en cualquier archivo que sea binario y no textual.Agregue automáticamente svn: needs-lock

Tenemos un equipo de desarrolladores bastante pequeño, pero el hecho de que cada uno recuerde establecer esta propiedad en archivos binarios recién creados no tiene sentido, ya que es muy fácil olvidarlo.

Respuesta

13

Edite el archivo svn config y añada una entrada para accesorios automáticos o use svn:auto-props propiedad versionada con SVN 1.8 y clientes más recientes. Read SVNBook!

EDIT:

De SVN 1.8 la puede aplicar la propiedad svn:auto-props a la ruta raíz de su repositorio. Consulte esto release note y actualizado SVNBook 1.8 chapter.

+3

¡cuidado! Tienes que configurar accesorios automáticos en cada cliente SVN individualmente. No hay forma de que el servidor aplique automáticamente el bloqueo de necesidades, al menos desde svn 1.7. –

+2

TSVN tiene la propiedad tsvn: autopropulsados ​​que se utiliza para esto: http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-propertypage.html#tsvn-dug-propertypage-tsvn-props – Stefan

+0

@Dan pero podría crear un script precompromiso que rechace los archivos binarios que no tienen esta propiedad. – greggo

4

Debe tenerse en cuenta que el método de autopropósitos debe configurarse en cada cliente SVN que se utilice. Por lo tanto, cuando configura un desarrollador nuevo o un desarrollador existente en una máquina nueva, debe recordar realizar esta configuración.

Si está usando TortoiseSVN, puede establecer la propiedad tsvn:autoprops en la carpeta base de cada pago y será respetada por todos los clientes de TortoiseSVN.

Si realmente quieres clavarlo, deberás poner un gancho pre-commit en cada depósito. La secuencia de comandos enforcer se puede diseñar fácilmente para esto.

Si tiene cualquier python-fu, RepoGuard (el sucesor de SVNChecker) parece que podría ser útil también.

No importa cuál elija, no hay forma de aplicar retroactivamente la propiedad a los archivos existentes en el repositorio, creo. Sin embargo, es probable que puedas aplicarlo en la siguiente confirmación del archivo.

+0

Este es un punto excelente. Si está acostumbrado a la aplicación del lado del servidor de esto (como en TFS), no es inmediatamente evidente. +1 – MutantNinjaCodeMonkey

+1

Obsoleto, también. Consulte la función "Configuración Dictada por Repositorio" de SVN 1.8: http://subversion.apache.org/docs/release-notes/1.8.html#repos-dictated-config – bahrep

2

Hay una página en esta wiki de Subversion que describe todas las diferentes opciones sobre cómo agregar automáticamente needs-lock y cómo garantizar que se haya establecido. La página también proporciona scripts de ejemplo y detalles de configuración:

http://www.orcaware.com/svn/wiki/Automatic_lock-modify-unlock

+1

Tenga en cuenta que no hay forma de que el servidor aplique automáticamente las necesidades- bloquear. Esta documentación explica cómo configurar cada cliente SVN individualmente para aplicar el bloqueo de necesidades automáticamente, y cómo configurar el servidor SVN para rechazar las confirmaciones que no usan el bloqueo de necesidades correctamente. –

+2

@DanFabulich ahora hay una forma de indicar al cliente de SVN 1.8 que aplique autopropulsados ​​desde el repositorio. – bahrep

21

Apache Subversion 1.8 introdujo la característica Repository Dictated Configuration que requiere SVN 1,8 cliente, pero 1,8 servidor no es necesario ya que esta es una característica del lado del cliente.

Con Subversion 1.8, puede configurar patrones de autopropulsados ​​dentro de un repositorio utilizando el nuevo Subversion svn:auto-props inherited property.

Por ejemplo, establezca el valor svn:auto-props en la propiedad en la raíz de su repositorio (o la ruta del repositorio que representa la raíz de un proyecto). Esto dará como resultado cada archivo * .exe recién agregado que tenga la propiedad svn:needs-lock=* aplicada.

Puede almacenar los valores de varias líneas en las propiedades de Subversion, por lo que puede agregar la siguiente SVN estándar: needs-lock y el patrón MIME para svn:auto-props:

*.bmp = svn:mime-type=image/bmp;svn:needs-lock=* 
*.gif = svn:mime-type=image/gif;svn:needs-lock=* 
*.ico = svn:mime-type=image/x-icon;svn:needs-lock=* 
*.jpeg = svn:mime-type=image/jpeg;svn:needs-lock=* 
*.jpg = svn:mime-type=image/jpeg;svn:needs-lock=* 
*.png = svn:mime-type=image/png;svn:needs-lock=* 
*.tif = svn:mime-type=image/tiff;svn:needs-lock=* 
*.tiff = svn:mime-type=image/tiff;svn:needs-lock=*  
*.doc = svn:mime-type=application/x-msword;svn:needs-lock=* 
*.docx = svn:mime-type=application/x-msword;svn:needs-lock=* 
*.jar = svn:mime-type=application/octet-stream;svn:needs-lock=* 
*.odc = svn:mime-type=application/vnd.oasis.opendocument.chart;svn:needs-lock=* 
*.odf = svn:mime-type=application/vnd.oasis.opendocument.formula;svn:needs-lock=* 
*.odg = svn:mime-type=application/vnd.oasis.opendocument.graphics;svn:needs-lock=* 
*.odi = svn:mime-type=application/vnd.oasis.opendocument.image;svn:needs-lock=* 
*.odp = svn:mime-type=application/vnd.oasis.opendocument.presentation;svn:needs-lock=* 
*.ods = svn:mime-type=application/vnd.oasis.opendocument.spreadsheet;svn:needs-lock=* 
*.odt = svn:mime-type=application/vnd.oasis.opendocument.text;svn:needs-lock=* 
*.pdf = svn:mime-type=application/pdf;svn:needs-lock=* 
*.ppt = svn:mime-type=application/vnd.ms-powerpoint;svn:needs-lock=* 
*.ser = svn:mime-type=application/octet-stream;svn:needs-lock=* 
*.swf = svn:mime-type=application/x-shockwave-flash;svn:needs-lock=* 
*.vsd = svn:mime-type=application/x-visio;svn:needs-lock=* 
*.xls = svn:mime-type=application/vnd.ms-excel;svn:needs-lock=* 
*.zip = svn:mime-type=application/zip;svn:needs-lock=* 
+1

Si * es un comodín, ¿* * svn: needs-lock = * funcionaría si quisiera simplemente aplicar needs-lock a TODOS los tipos de archivos? –

+1

@JonathonCowley Lo he probado ahora con TortoiseSVN 1.8.7 (SVN 1.8.9) y estableciendo 'svn: auto-props' en' * = svn: needs-lock = * 'hace exactamente lo que preguntas, es decir, "apply" needs-lock a todos los archivos debajo de la carpeta donde estableces la propiedad. – bahrep

+0

Gracias por la respuesta muy rápida. Lo habría probado yo mismo, pero estoy en una PC donde no tengo acceso a Subversion. –

1

Utilice un gancho pre-commit

#!/bin/bash 

REPOS="$1" 
TXN="$2" 

SVNLOOK=/usr/bin/svnlook 
ICONV=/usr/bin/iconv 

SVNLOOKOK=1 

# Check files for svn:needs-lock property 
# Exit on all errors. 
set -e 

echo "`$SVNLOOK changed -t "$TXN" "$REPOS"`" | while read REPOS_PATH 
do 
if [[ $REPOS_PATH =~ (A|M|U)[[:blank:]]{3}(.*)\.(.*) ]] 
then 
    if [ ${#BASH_REMATCH[*]} -ge 2 ] 
    then 
    FILENAME=${BASH_REMATCH[2]}.${BASH_REMATCH[3]}; 

    # Make sure every file has the svn:needs-lock property set 
    if [ "" == "`$SVNLOOK propget -t \"$TXN\" \"$REPOS\" svn:needs-lock \"$FILENAME\" 2> /dev/null`" ] 
    then 
    ERROR=1; 
    echo "" >&2 
    echo "svn:needs-lock property has to be set on \"$FILENAME\"" >&2 
    echo "" >&2 
    fi 
    fi 
fi 
test -z $ERROR || (exit 1) 
done 

# All checks passed, so allow the commit. 
exit 0 

y un pre-bloqueo de gancho

#!/bin/bash 

REPOS="$1" 
PATH="$2" 
USER="$3" 

# If a lock exists and is owned by a different person, don't allow it 
# to be stolen (e.g., with 'svn lock --force ...'). 

# (Maybe this script could send email to the lock owner?) 
SVNLOOK=/usr/bin/svnlook 
GREP=/bin/grep 
SED=/bin/sed 

LOCK_OWNER=`$SVNLOOK lock "$REPOS" "$PATH" | \ 
      $GREP '^Owner: ' | $SED 's/Owner: //'` 

# If we get no result from svnlook, there's no lock, allow the lock to 
# happen: 
if [ "$LOCK_OWNER" = "" ]; then 
    exit 0 
fi 

# If the person locking matches the lock's owner, allow the lock to 
# happen: 
if [ "$LOCK_OWNER" = "$USER" ]; then 
    exit 0 
fi 
+0

¡Agradable! Adapte el gancho 'pre-commit' para imprimir el comando' svn propset' con los archivos necesarios: https://gist.github.com/spl/0affe6cc0e06aae6cb46a45b8a9edd36 –

Cuestiones relacionadas