2010-04-13 7 views
24

que tienen un gancho posterior a la actualización de mi servidor, de tal manera que cuando¿Qué usuario ejecuta el git hook?

git push 

que hace un tirón en el directorio web en vivo. Sin embargo, mientras que la inserción siempre tiene éxito, el gancho post-actualización a veces falla.

El gancho es bastante simple:

#!/bin/sh 
# 
# An example hook script to prepare a packed repository for use over 
# dumb transports. 
# 
# To enable this hook, rename this file to "post-update". 
cd /var/www 
env -i git pull 

estoy empujando actualizaciones de una variedad de lugares, pero a veces tengo que iniciar sesión como root en el servidor y Manuall hacer un

env -i git pull 

Sin embargo, solo tengo que hacerlo el 20% del tiempo. ¿Alguna idea de por qué fallaría al azar? Además, ¿cómo lo haría para registrar los mensajes de error, ya que podría estar ejecutándose como alguien que no puede escribir en el sistema de archivos?

+0

¿Estás presionando de la misma manera desde todos esos lugares? Es decir, ¿la URL remota es la misma para todos ellos? (en particular, la porción user @ hostname) – Cascabel

+0

Además, cuando dice que falla, ¿realmente quiere decir que falla con un error de permiso denegado que indica que se está ejecutando como un usuario con privilegios insuficientes? ¿O está fallando por algún motivo completamente ajeno, no tiene nada que ver con que el uid lo ejecute? – Cascabel

+0

En realidad, estoy presionando desde diferentes lugares: a veces es user1 @ hostname, othertimes, user2 @ hostname, etc. (aunque todos tienen este problema). Falla sin un mensaje de error que puedo ver, y no estoy seguro de cómo obtener uno. En mi actualización posterior, agregué,> echo $ USER> /log.txt, pero no se escribió nada allí (ni se creó el archivo). Esto me hace pensar que el usuario empuja, no tiene permisos. Pero si ni siquiera puedo escribir un mensaje de error, ¿cómo lo sabré? – ash

Respuesta

18

Los ganchos se ejecutan mientras el usuario realiza el empuje. Si tiene algún tipo de configuración prefabricada, puede ser un usuario como git o gitosis, o puede ser usted. Solo mira cómo tienes configurado el control remoto. (git remote show <remote-name> o simplemente examine .git/config si no lo sabe) Es de suponer que está presionando a través de SSH, y hay un nombre de usuario @ hostname en la URL.

P.S. Es bastante rápido para demostrar esto: simplemente clone un repositorio localmente, inserte un gancho post-actualización con un echo $USER o algo similar, y trate de empujar como usted o un usuario diferente (directamente oa través de ssh).

2

decidí poner a prueba esta en mi servidor gitlab 6 mediante la creación de un pre-recibir gancho y haciéndose eco de la información del usuario

$ cat /home/git/repositories/foo/foo.git/hooks/pre-recieve 
#!/bin/bash 
set -x 
echo -e "The user the hook is run as is $USER" 
echo -e "Just to doublecheck, the user is $(whoami)" 
exit 1 

Parece que se ejecuta como el usuario git

$ git push 
Counting objects: 3, done. 
Delta compression using up to 8 threads. 
Compressing objects: 100% (2/2), done. 
Writing objects: 100% (3/3), 269 bytes | 0 bytes/s, done. 
Total 3 (delta 1), reused 0 (delta 0) 
remote: + echo -e 'The user the hook is run as is' 
remote: The user the hook is run as is 
remote: ++ whoami 
remote: + echo -e 'Just to doublecheck, the user is git' 
remote: Just to doublecheck, the user is git 
remote: + exit 1 
+0

La razón es que todos estos servidores configuran un usuario de Unix para aceptar las conexiones ssh entrantes a través del archivo '~ git/.ssh/authorized_keys'. Ese archivo delega tales conexiones a una secuencia de comandos que luego se ocupa de los datos entrantes. Para tales servidores uno puede derivar el nombre de la persona que hace el empuje, p. asumiendo que es la misma persona que hizo el compromiso más reciente. Sin embargo, esto puede no ser cierto en absoluto. Depende del modelo de trabajo de los usuarios. Mejor simplemente verificar o reportar el autor/committer en commits individuales. – cfi