Estamos en el proceso de pasar de otros métodos de control de versiones/fuente a git y, debido a que no tengo experiencia real con git (salvo configurar algunas variables user.*), me gustaría preguntar si esta es una dirección viable para tomar antes de comprometerme en este camino.
La solución en "¿Es posible configurar los usuarios .gitconfig (para git config --global) dinámicamente?" estuvo cerca para mí, pero no solucionó una situación que descubrí usando cuentas de servicios compartidos (y que también puede existir para root).
Descubrí que el Usuario1 se conectaría y /home/serviceaccount/.gitconfig
se configuraría, luego el Usuario2 se conectaría y lo sobrescribiría: una ejecución en git config --global user.name
cualquiera de las sesiones devolvería los detalles del Usuario2, lo que sugiere que se hace referencia al archivo en cada llamada. Como no hago root, no sé si este problema existe para dos usuarios que hacen sudo para rootear siguiendo la solución de @oXiVanisher.
Para hacer que esto sea dinámico para las cuentas de servicios compartidos, se ejecuta un script contenedor en el lugar apropiado .gitconfig
según el usuario que lo ejecuta. El núcleo del mismo es:
#!/bin/sh
myuser=`who -m | awk '{ print $1 }'`
HOST=`hostname`
# atomic locking over NFS via https://unix.stackexchange.com/a/22062
LOCKFILE="/local/share/bin/.git.lock"
TMPFILE=${LOCKFILE}.$$
echo "$myuser @ $HOST" > $TMPFILE
if ln $TMPFILE $LOCKFILE 2>&-; then
:
else
echo "$LOCKFILE detected"
echo "Script in use by $(<$LOCKFILE)"
/bin/rm -f $TMPFILE
exit
fi
trap "/bin/rm -f ${TMPFILE} ${LOCKFILE}" 0 1 2 3 15
# find my gitconfig
CFGFILE="/local/share/DOTfiles/DOTgitconfig.$myuser"
if [ ! -s $CFGFILE ]; then
echo "No personal /local/share/DOTfiles/DOTgitconfig found."
exit
fi
# roll it in
cp $CFGFILE $HOME/.gitconfig
# execute git
/usr/bin/git "$@"
# roll it back in case of changes
cp $HOME/.gitconfig $CFGFILE
# zero it out
cat > $HOME/.gitconfig << !
# This file intentionally blank for dynamic use
# The wrapper script is /local/share/bin/git
!
Cuando dos usuarios están conectados a la cuenta de servicio compartido, git config --global user.name
informa el nombre adecuado para cada usuario. A primera vista, esto parece que podría hacer que git sea dinámico para todos los usuarios que comparten una cuenta donde no se pueden encontrar variables de entorno.
¿Pero cómo rompo las cosas? ¿Qué no estoy viendo todavía?
Gracias.
Respuesta1
Parece que su solución tendría condiciones de carrera (¿qué sucede durante múltiples invocaciones simultáneas de git
?), así como otros problemas (como el uso incorrecto de $*
en lugar de "$@"
.
En cambio, ¿por qué no utilizar simplemente configurar $GIT_CONFIG
en el entorno de cada usuario un archivo diferente?