Динамическая конфигурация пользователя для git с помощью скрипта-обертки?

Динамическая конфигурация пользователя для git с помощью скрипта-обертки?

Мы находимся в процессе перехода от других методов управления исходным кодом/версиями к git, и поскольку у меня нет реального опыта работы с git (за исключением настройки некоторых переменных user.*), я хотел бы спросить, является ли это жизнеспособным направлением, прежде чем решиться на этот путь.

Решение в "Можно ли динамически задать пользовательский .gitconfig (для git config --global)?" был близок для меня, но он не решает ситуацию, которую я обнаружил при использовании общих учетных записей служб (и которая может существовать также и для root).

Я обнаружил, что User1 подключался и /home/serviceaccount/.gitconfigполучал настройки, затем User2 подключался и перезаписывал это: выполнение git config --global user.nameв любом сеансе возвращало данные User2, предполагая, что файл ссылается на каждый вызов. Поскольку я не являюсь пользователем root, я не знаю, существует ли эта проблема для двух пользователей, которые sudo получают права root, следуя решению @oXiVanisher.

Чтобы сделать эту динамику для учетных записей общих служб, скрипт-обертка сворачивается в .gitconfigсоответствии с пользователем, который его выполняет. Его суть заключается в следующем:

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

Когда два пользователя подключены к общей учетной записи службы, git config --global user.nameсообщает правильное имя для каждого пользователя. На первый взгляд, это выглядит так, как будто это может сделать git динамическим для всех пользователей, разделяющих одну учетную запись, где переменные среды не могут быть найдены.

Но как я все ломаю? Чего я еще не вижу?

Спасибо.

решение1

Похоже, что ваше решение будет иметь условия гонки (что происходит при нескольких одновременных вызовах git?), а также другие проблемы (например, неправильное использование $*вместо "$@".

Вместо этого, почему бы просто не использовать $GIT_CONFIGв среде каждого пользователя отдельный файл?

Связанный контент