每次我執行git pull
或 時git reset
,git
都會重置我對權限和所有權所做的更改。你自己看:
#!/usr/bin/env bash
rm -rf 1 2
mkdir 1
cd 1
git init
echo 1 > 1 && git add 1 && git ci -m 1
git clone . ../2
cd $_
chmod 0640 1
chgrp http 1
cd ../1
echo 12 > 1 && git ci -am 2
cd ../2
stat 1
git pull
stat 1
輸出:
$ ./1.sh 2>/dev/null | grep -F 'Access: ('
Access: (0640/-rw-r-----) Uid: ( 1000/ yuri) Gid: ( 33/ http)
Access: (0664/-rw-rw-r--) Uid: ( 1000/ yuri) Gid: ( 1000/ yuri)
有辦法解決嗎?
我想讓一些檔案/目錄可供網頁伺服器寫入。
答案1
這聽起來像是您正在運行的用戶將預設群組設為yuri
。您可以這樣確認:
$ id -a
uid=1000(saml) gid=1000(saml) groups=1000(saml),10(wheel),989(wireshark)
您帳戶的 UID 是這樣的:uid=1000(saml)
而預設群組是git=1000(saml)
,其後的任何輔助群組都是。
筆記:如果您希望 git 克隆具有特定的所有權,那麼您至少有 2 個選擇。
選項1
根據需要設定具有權限的父目錄,如下所示:
$ mkdir topdir
$ chgrp http topdir
$ chmod g+s topdir
$ cd topdir
$ git clone ....
這迫使目錄topdir
強制其下面的任何子目錄套用該群組http
。這在很大程度上可以工作,但可能會導致問題,因為如果將檔案移至此 git 克隆工作區中,這些檔案將不會透過上述變更強制執行其群組。
選項#2
在開始工作之前,將預設群組變更為http
如下所示:
$ newgrp http
$ git clone ...
此方法將強制建立的任何新檔案將其群組設為 ,http
而不是正常的預設群組yuri
,但這只有在您記得newgrp
在此工作區中工作之前執行 a 操作時才有效。
其他選項
如果這些看起來都不可接受,您可以嘗試在 git 工作區目錄上使用 ACL。這些問題在本網站的多個問答中進行了討論,例如標題為:在 Linux 上取得新檔案繼承群組權限。
答案2
我使用的解決方案是以使用者身分執行命令具有您想要保留的權限:
sudo -u user command
這可以防止權限發生變更。我在更新 VPS 上的 git 儲存庫時使用它,同時將檔案權限設定為網頁伺服器使用者。
另請參閱同一問題這裡。