Configuração dinâmica de usuário para git com script wrapper?

Configuração dinâmica de usuário para git com script wrapper?

Estamos no processo de mudança de outros métodos de controle de origem/versão para o git e, como não tenho nenhuma experiência real com o git (exceto definir algumas variáveis ​​user.*), gostaria de perguntar se essa é uma direção viável para tomar antes de me comprometer por esse caminho.

A solução em "É possível definir os usuários .gitconfig (para git config --global) dinamicamente?"chegou perto de mim, mas não resolveu uma situação que descobri usando contas de serviço compartilhado (e que pode existir para root também).

Descobri que o Usuário1 se conectaria e /home/serviceaccount/.gitconfigseria configurado, então o Usuário2 se conectaria e sobrescreveria isso: uma execução em git config --global user.namequalquer sessão retornaria detalhes do Usuário2, sugerindo que o arquivo é referenciado em cada chamada. Como eu não faço root, não sei se esse problema existe para dois usuários que fazem sudo para fazer root seguindo a solução do @oXiVanisher.

Para tornar isso dinâmico para contas de serviço compartilhado, um script wrapper é implementado apropriadamente .gitconfigcom base no usuário que o executa. O núcleo disso é:

#!/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
!

Quando dois usuários estão conectados à conta de serviço compartilhada, git config --global user.nameinforma o nome adequado de cada usuário. À primeira vista, parece que isso poderia tornar o git dinâmico para todos os usuários que compartilham uma conta onde variáveis ​​de ambiente não podem ser encontradas.

Mas como estou quebrando as coisas? O que ainda não estou vendo?

Obrigado.

Responder1

Parece que sua solução teria condições de corrida (o que acontece durante múltiplas invocações simultâneas de git?), bem como outros problemas (como o uso incorreto de $*em vez de "$@".

Em vez disso, por que não usar apenas set $GIT_CONFIGno ambiente de cada usuário para um arquivo diferente?

informação relacionada