ラッパー スクリプトを使用した Git の動的ユーザー設定?

ラッパー スクリプトを使用した Git の動的ユーザー設定?

私たちは他のソース/バージョン管理方法から git に移行する過程にありますが、git の実際の経験がないため (user.* 変数をいくつか設定した以外は)、この道を進む前に、これが実行可能な方向であるかどうかを尋ねたいと思います。

ユーザーの .gitconfig (git config --global の場合) を動的に設定することは可能ですか?」は私にとっては近いものでしたが、共有サービス アカウントを使用して発見した状況 (ルートにも存在する可能性があります) には対処していませんでした。

/home/serviceaccount/.gitconfigUser1 が接続して設定され、その後 User2 が接続してそれを上書きすることがわかりました。git config --global user.nameどちらのセッションでも を実行すると User2 の詳細が返され、各呼び出しでファイルが参照されていることがわかります。私は root 権限を持たないため、@oXiVanisher のソリューションに従って sudo で root 権限を取得する 2 人のユーザーにこの問題が発生するかどうかはわかりません。

.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
!

2 人のユーザーが共有サービス アカウントに接続している場合、git config --global user.name各ユーザーの正しい名前を報告します。一見すると、環境変数が見つからない 1 つのアカウントを共有するすべてのユーザーに対して、git を動的にできるように見えます。

しかし、私はどのように物事を壊しているのでしょうか? まだ見ていないものは何でしょうか?

ありがとう。

答え1

gitあなたの解決策には、競合状態 ( の複数の同時呼び出し中に何が起こるか) やその他の問題 ($*の代わりにを誤って使用するなど) があるようです"$@"

$GIT_CONFIG代わりに、各ユーザーの環境を別のファイルに設定するだけでよいのではないでしょうか。

関連情報