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

1

Estamos no processo de passar de outros métodos de controle de versão / fonte para o git e, como não tenho experiência com o git (curto de configurar algumas variáveis do usuário. *), gostaria de perguntar se isso é um direção viável para tomar antes de me comprometer nesta estrada.

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 podem existir) para root também).

Descobri que User1 se conectaria e /home/serviceaccount/.gitconfig seria definido, então User2 se conectaria e sobrescreveria: uma execução de git config --global user.name em qualquer sessão retornaria detalhes de User2, sugerindo que o arquivo é referenciado em cada chamada. Porque eu não faço root, eu não sei se este problema existe para dois usuários que sudo para root seguindo a solução do @ oXiVanisher.

Para tornar essa dinâmica para contas de serviço compartilhadas, um script de wrapper é transferido no .gitconfig apropriado com base no usuário que o está executando. 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 compartilhado, git config --global user.name informa o nome adequado para cada usuário. À primeira vista, parece que isso pode tornar o git dinâmico para todos os usuários que compartilham uma conta onde as variáveis de ambiente não podem ser encontradas.

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

Obrigado.

    
por Joe Creighton 13.04.2017 / 21:05

1 resposta

1

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

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

    
por 13.04.2017 / 22:13