¿Cómo puedo evitar bashs no rápidos de twigs seleccionadas en git?

Me gustaría proteger mi repository de git para que solo se sobrescriban las twigs no maestras. ¿Hay alguna manera de proteger solo las twigs seleccionadas?

Puede usar GitEnterprise para configurar los permissions por twig (admin) para bloquear impulsos no rápidos usando permissions de acceso detallados.

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

Aquí hay un gancho de actualización (copy to hooks / update) que escribí para mi propio uso. Esta secuencia de commands por defecto niega todas las actualizaciones que no avanzan rápido, pero les permite las twigs 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 twigs excepto para la twig principal.

 #!/bin/sh # # A hook script to block non-fast-forward updates for branches that haven't # been explicitly configunetworking 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 

Puede evitar actualizaciones que no sean de avance rápido configurando denyNonFastForwards

 git config --system receive.denyNonFastForwards true 

Pero aplica para todas las twigs. Para get más información, consulte ProGit

Esta respuesta SO le dará lo que está buscando. Simplemente edítelo para aplicar a la twig 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 

Actualizar:
Esto evitará todos los envíos a la twig principal, incluido el avance rápido.

Creo que depende de lo que uses en el server para acceder a tu repository. Hay algunas aplicaciones de server que admiten permissions por twig, como Gerrit o Gitlab (sin embargo, no estoy seguro de si Gitlab admite su uso). Gerrit lo admite, ya que utilizo un flujo de trabajo similar en mi empresa.

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

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

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

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