¿Configuración de usuario dinámica para git con script contenedor?

¿Configuración de usuario dinámica para git con script contenedor?

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/.gitconfigse configuraría, luego el Usuario2 se conectaría y lo sobrescribiría: una ejecución en git config --global user.namecualquiera 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 .gitconfigsegú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.nameinforma 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_CONFIGen el entorno de cada usuario un archivo diferente?

información relacionada