래퍼 스크립트를 사용하는 git의 동적 사용자 구성?

래퍼 스크립트를 사용하는 git의 동적 사용자 구성?

우리는 다른 소스/버전 제어 방법에서 git으로 이동하는 과정에 있으며, git에 대한 실제 경험이 없기 때문에(일부 user.* 변수 설정이 부족함) 이것이 실행 가능한 방향인지 묻고 싶습니다. 이 길을 따라가기 전에 가져가세요.

"의 솔루션사용자 .gitconfig(git config --global의 경우)를 동적으로 설정할 수 있습니까?"라는 질문이 나에게 가까이 다가왔지만 공유 서비스 계정을 사용하여 발견한 상황(루트에도 존재할 수 있음)을 해결하지 못했습니다.

나는 User1이 연결하고 /home/serviceaccount/.gitconfig설정되면 User2가 연결하고 이를 덮어쓴다는 것을 알았습니다. git config --global user.name두 세션 중 하나를 실행하면 User2 세부 정보가 반환되어 각 호출에서 파일이 참조된다는 것을 알 수 있습니다. 나는 루트를 수행하지 않기 때문에 @oXiVanisher의 솔루션에 따라 루트로 sudo를 수행하는 두 명의 사용자에게 이 문제가 존재하는지 알 수 없습니다.

공유 서비스 계정에 대해 이를 동적으로 만들기 위해 래퍼 스크립트는 .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대신, 각 사용자의 환경에서 다른 파일로 설정하여 사용하는 것은 어떨까요 ?

관련 정보