我們正在從其他來源/版本控制方法轉向 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 到不同的檔案呢?