我们正在从其他源/版本控制方法转向 git,并且,因为我没有 git 的实际经验(缺乏设置一些 user.* 变量),我想问这是否是一个可行的方向在走上这条路之前先采取行动。
解决方案在“是否可以动态设置用户 .gitconfig (对于 git config --global )?“对我来说很接近,但它没有解决我使用共享服务帐户发现的情况(对于 root 也可能存在)。
我发现 User1 将连接并/home/serviceaccount/.gitconfig
进行设置,然后 User2 将连接并覆盖:在任一会话中执行git config --global user.name
将返回 User2 详细信息,表明每次调用时都会引用该文件。因为我不执行 root 操作,所以我不知道按照 @oXiVanisher 的解决方案 sudo 到 root 的两个用户是否存在此问题。
.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
每个用户的环境中使用 just set 到不同的文件呢?