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/.gitconfig
seria configurado, então o Usuário2 se conectaria e sobrescreveria isso: uma execução em git config --global user.name
qualquer 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 .gitconfig
com 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.name
informa 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_CONFIG
no ambiente de cada usuário para um arquivo diferente?