2012-07-16 11 views

Respuesta

4

Usted puede utilizar para configurar GitEnterprise por rama permisos (admin) para bloquear el avance rápido no empuja el uso de permiso de acceso de grano fino.

Y git config --system receive.denyNonFastForwards true simplemente hará el trabajo si necesita bloquear el cambio de historial para todas las ramas.

+0

denyNonFastForwards no es la 'resolución' que deberías usar. Establezca un gancho git para denegar empujes de fuerza ... Esa es la forma correcta de hacerlo. – Eric

+0

@Eric Denegar los empujes no rápidos es en realidad el camino a seguir en GitHub/BitBucket. No se inventaron nuevas bicicletas. –

+0

Si niega todos los accesos no rápidos en cada rama, ¿cómo fusionaría sus ramas de características? – Eric

1

This SO answer le dará lo que está buscando. Basta con modificar para aplicar a la rama principal en su lugar:

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

if [ "$refname" = "refs/heads/master" ] 
then 
    echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" 
    echo "You cannot push to the master branch." 
    echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" 
    exit 1 
fi 
exit 0 

Actualización:
Esto evitará que todo empuja a la rama principal, incluyendo el avance rápido.

+4

Esto evitará que se presione la bifurcación seleccionada. Deben permitirse los empujes rápidos. –

+0

[Aquí, alguien descubrió cómo detectar la fuerza forzada en las secuencias de comandos de actualización.] (Http://stackoverflow.com/a/12258773/444255) Explicación larga, el fragmento final aún debe ser hecho ... –

1

Puede evitar cambios no avance rápido mediante la configuración de denyNonFastForwards

git config --system receive.denyNonFastForwards true 

pero se aplica para todas las ramas. Para más información por favor refiérase ProGit

0

Creo que depende de lo que use en el servidor para acceder a su repositorio. Hay algunas aplicaciones de servidor que admiten permisos por rama, como Gerrit o Gitlab (sin embargo, no estoy seguro si Gitlab admite su uso). Gerrit lo admite, ya que utilizo un flujo de trabajo similar en mi empresa.

Tal vez Gitolite también lo admite (eso es lo que Gitlab usa debajo del capó), que es más fácil de instalar, pero no tiene una interfaz web como Gerrit o Gitlab.

Comentario adicional: GitEnterprise, como se sugiere, también es una buena solución, sin embargo, mis sugerencias son adecuadas, si tiene su propio servidor (que es común en muchas compañías).

5

Aquí hay un gancho de actualización (copiar a ganchos/actualizar) que escribí para mi propio uso. Esta secuencia de comandos por defecto niega todas las actualizaciones que no avanzan rápido, pero les permite ramas configuradas explícitamente. Debería ser lo suficientemente fácil invertirlo para que las actualizaciones de avance rápido estén permitidas para todas las ramas excepto para la rama principal.

#!/bin/sh 
# 
# A hook script to block non-fast-forward updates for branches that haven't 
# been explicitly configured to allow it. Based on update.sample. 
# Called by "git receive-pack" with arguments: refname sha1-old sha1-new 
# 
# Config 
# ------ 
# hooks.branch.<name>.allownonfastforward 
# This boolean sets whether non-fast-forward updates will be allowed for 
# branch <name>. By default they won't be. 

# --- Command line 
refname="$1" 
oldrev="$2" 
newrev="$3" 

# --- Safety check 
if [ -z "$GIT_DIR" ]; then 
     echo "Don't run this script from the command line." >&2 
     echo " (if you want, you could supply GIT_DIR then run" >&2 
     echo " $0 <ref> <oldrev> <newrev>)" >&2 
     exit 1 
fi 

if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then 
     echo "Usage: $0 <ref> <oldrev> <newrev>" >&2 
     exit 1 
fi 

# --- Check types 
# if $newrev is 0000...0000, it's a commit to delete a ref. 
zero="0000000000000000000000000000000000000000" 
if [ "$newrev" = "$zero" ]; then 
     newrev_type=delete 
else 
     newrev_type=$(git cat-file -t $newrev) 
fi 

case "$refname","$newrev_type" in 
     refs/tags/*,commit) 
       # un-annotated tag 
       ;; 
     refs/tags/*,delete) 
       # delete tag 
       ;; 
     refs/tags/*,tag) 
       # annotated tag 
       ;; 
     refs/heads/*,commit) 
       # branch 
       # git rev-list doesn't print anything on fast-forward updates 
       if test $(git rev-list "$newrev".."$oldrev"); then 
         branch=${refname##refs/heads/} 
         nonfastforwardallowed=$(git config --bool hooks.branch."$branch".allownonfastforward) 

         if [ "$nonfastforwardallowed" != "true" ]; then 
           echo "hooks/update: Non-fast-forward updates are not allowed for branch $branch" 
           exit 1 
         fi 
       fi 
       ;; 
     refs/heads/*,delete) 
       # delete branch 
       ;; 
     refs/remotes/*,commit) 
       # tracking branch 
       ;; 
     refs/remotes/*,delete) 
       # delete tracking branch 
       ;; 
     *) 
       # Anything else (is there anything else?) 
       echo "hooks/update: Unknown type of update to ref $refname of type $newrev_type" >&2 
       exit 1 
       ;; 
esac 

# --- Finished 
exit 0 
+1

Sería útil si pudiera modificar la secuencia de comandos para que las actualizaciones sin avance rápido estén permitidas para todas las ramas excepto la principal – Ren

0

Si se le permite modificar su servidor, esto habilitará el reenvío rápido en el servidor.

ssh ip 'echo $"[receive] 
    denyDeletes = false 
    denyNonFastForwards = false" >> /path/to/repo/config' 
#then git push -f origin master 
Cuestiones relacionadas