2010-03-18 30 views
36

? Tengo una idea de bloquear un repositorio de usuarios que insertan archivos al tener una secuencia de comandos de bloqueo en el gancho de actualización GIT, ya que la inserción solo puede reconocer el ID de usuario como argumentos y no como ramas Así que puedo bloquear todo el repositorio que solo está bloqueando un directorio.¿Hay alguna manera de bloquear una rama en GIT

¿Hay alguna manera de bloquear una rama específica en GIT?

¿O hay una manera en que un enganche de actualización puede identificar desde qué rama está presionando el usuario y a qué rama se inserta el código?

+1

qué quiere bloquear el nombre de la sucursal siempre (etiquetas Use a continuación), o simplemente evitar que otras personas empujando ¿lo? – hasen

+0

Véase también http://stackoverflow.com/a/5097437/6309 – VonC

+0

¿Qué tiene de malo tener un repositorio por separado y sacarlo? Sería un flujo de trabajo más estándar. –

Respuesta

34

La rama siendo empujado a es el primer parámetro de la update hook. Si desea bloquear la rama myfeature para empujar, este código (colocado en hooks/update) lo hará:

#!/bin/sh 
# lock the myfeature branch for pushing 
refname="$1" 

if [[ $refname == "refs/heads/myfeature" ]] 
then 
    echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" 
    echo "You cannot push to myfeature! It's locked" 
    echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" 
    exit 1 
fi 
exit 0 
+2

No veo un directorio .git en el repositorio remoto en GitHub. Veo un directorio .git solo en mi repositorio clonado local. Pero no creo que poner este código.git/hooks/update en mi repositorio local tendrá el efecto de bloquear el acceso de cualquier persona a esa sucursal remota de su repositorio local. ¿Me estoy perdiendo de algo? –

+0

@AjoyBhatia Tiene que haber un directorio .git. Si es un repositorio simple, entonces el directorio principal ya es el directorio .git. (Es un repositorio simple si tiene archivos/carpetas como HEAD, branches, hooks, config, etc.) Ponga su gancho en el gancho/dir – pentix

8

El gancho de actualización, a partir de los documentos:

El gancho se ejecuta una vez para cada árbitro que actualizarse, y toma tres parámetros:

  • el nombre de la ref en proceso de actualización,
  • el nombre del objeto anterior almacenado en la referencia,
  • y el nuevo nombre de objeto que se almacenará en la referencia.

Así que ... sí, se sabe exactamente qué rama está siendo empujada, y sólo se puede comprobar que el parámetro y salir fracaso si no quiere que la rama empujó a.

Y si quieres (inteligente) hacen esto antes de ha subido al usuario los objetos, se puede utilizar el pre-recepción de gancho:

Este gancho se ejecuta una vez para la operación de recepción. Que no tiene argumentos, pero para cada árbitro se actualizará que recibe en la entrada estándar una línea del formato:

<old-value> SP <new-value> SP <ref-name> LF

donde <old-value> es el antiguo nombre de objeto almacenado en el árbitro, <new-value> es el nuevo nombre del objeto que se almacenará en la referencia y <ref-name> es el nombre completo de la referencia.

(esos son los espacios y de avance de línea)

+0

Este informativo me ayuda, pero update hook solo conoce la rama que se está presionando (branch de origen), ¿hay alguna forma de capturar desde el hook de actualización, a qué rama se está enviando el código (branch de destino)? –

Cuestiones relacionadas