Dynamische Benutzerkonfiguration für Git mit Wrapper-Skript?

Dynamische Benutzerkonfiguration für Git mit Wrapper-Skript?

Wir sind dabei, von anderen Methoden der Quellcode-/Versionskontrolle auf Git umzusteigen. Da ich keine wirkliche Erfahrung mit Git habe (abgesehen vom Festlegen einiger user.*-Variablen), möchte ich fragen, ob dies ein gangbarer Weg ist, bevor ich mich auf diesen Weg einlasse.

Die Lösung in "Ist es möglich, die .gitconfig-Datei des Benutzers (für „git config --global“) dynamisch festzulegen?" kam für mich nahe heran, behob aber nicht eine Situation, die ich bei der Verwendung gemeinsam genutzter Dienstkonten entdeckt hatte (und die möglicherweise auch für Root besteht).

Ich habe festgestellt, dass sich Benutzer1 verbinden und /home/serviceaccount/.gitconfigeingestellt werden würde, dann würde sich Benutzer2 verbinden und das überschreiben: Eine Ausführung von git config --global user.namein einer der beiden Sitzungen würde Details zu Benutzer2 zurückgeben, was darauf hindeutet, dass bei jedem Aufruf auf die Datei verwiesen wird. Da ich kein Root bin, weiß ich nicht, ob dieses Problem für zwei Benutzer besteht, die sich mit sudo als Root anmelden und dabei die Lösung von @oXiVanisher befolgen.

Um dies für gemeinsam genutzte Servicekonten dynamisch zu gestalten, wird ein Wrapper-Skript entsprechend .gitconfigdem Benutzer, der es ausführt, eingefügt. Der Kern davon ist:

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

Wenn zwei Benutzer mit dem gemeinsamen Dienstkonto verbunden sind, git config --global user.namewird der korrekte Name für jeden Benutzer gemeldet. Auf den ersten Blick sieht es so aus, als könnte Git dadurch dynamischer werden, wenn alle Benutzer ein Konto gemeinsam nutzen und keine Umgebungsvariablen gefunden werden können.

Aber wie mache ich Dinge kaputt? Was sehe ich noch nicht?

Danke schön.

Antwort1

Es scheint, als ob Ihre Lösung Race Conditions (was passiert bei mehreren gleichzeitigen Aufrufen von git?) sowie andere Probleme (wie die falsche Verwendung von $*anstelle von ) aufweisen würde "$@".

Warum verwenden Sie stattdessen nicht einfach $GIT_CONFIGin der Umgebung jedes Benutzers eine andere Datei?

verwandte Informationen