¿Cómo se puede bloquear las confirmaciones de git de usuarios no válidos?

Estoy ejecutando un server gitlab git.

La mayoría de mis usuarios ejecutan 1 de 3 versiones de git.

git 1.7.1 (usuarios centos)
git 1.7.9 (todos los demás)
git 1.8.4 (usuarios de mac)

Algunos usuarios han estado cometiendo y presionando accidentalmente el código como usuario raíz. Necesito bloquear las confirmaciones de esos usuarios.

Mi gancho precompromiso se ve así:

#!/bin/bash if [[ $GIT_AUTHOR_NAME == 'root' ]] then echo "If you commit as root, you're gonna have a bad time"; echo "Set 'git config user.name' and try again"; exit 1; fi 

Esto funciona como un enlace precompromiso en 1.7.9 y 1.8.x pero no en 1.7.1

De acuerdo con este blog , los ganchos pre recibir y publicar recibir no tienen ninguna de las variables de entorno que estoy buscando ( GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL, GIT_AUTHOR_DATE, GIT_COMMITTER_NAME, GIT_COMMITTER_EMAIL, GIT_COMMITTER_DATE, EMAIL ).

¿Hay alguna forma de modificar este gancho precompromiso para bloquear usuarios root en versiones anteriores de git?

http://longair.net/blog/2011/04/09/missing-git-hooks-documentation/

¿Por qué no pones el cheque en un gancho pre-recibo, es decir, realizas la authentication en el lado del server cuando el código está a punto de comprometerse con el repository / server central de git?

 #Extract commiter names here. commiters=$(git log --pretty=format:"%cn" $revs) #This should work in all git versions printf "$commiters\n" | while read name; do if [[ $name == "root" ]]; then echo "You are commiting as root user which I don't like. Reveal your identity!" exit 1 fi done 

Configure, por ejemplo, gitolite (debe haber packages para el sistema de su server), y configúrelo para que solo los usuarios aprobados puedan presionar. Si cambian a la raíz, las cnetworkingenciales no coincidirán, y la inserción será rechazada. Te da un control detallado de las twigs a las que cada uno tiene acceso.

Puede alentar a los usuarios a usar el enlace de precompromiso de su lado como mitigación, pero en última instancia tendrá que rechazar los bashs del lado del server para que la política se cumpla plenamente.

Una cosa que puede hacer es emplear un gancho de actualización que rechazará las acometidas de confirmaciones que haya realizado el autor de la raíz. Agregue esto a su .git/hooks/update :

 git log --format="%h %an" ${2}..${3} | while read COMMIT_HASH COMMIT_AUTHOR; do if [ "$COMMIT_AUTHOR" = "root" ]; then echo "Updating ${1} by root is not allowed, offending commit: $COMMIT_HASH" exit 1 fi done 

El fragment analizará todas las confirmaciones entre las revisiones anteriores y la nueva revisión que se envía y rechazará el envío si cualquiera de estas confirmaciones tiene la raíz como autor. ¡Además, asegúrese de que el gancho sea ejecutable!