有沒有辦法阻止 git 更改拉取時的權限和所有權?

有沒有辦法阻止 git 更改拉取時的權限和所有權?

每次我執行git pull或 時git resetgit都會重置我對權限和所有權所做的更改。你自己看:

#!/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 儲存庫時使用它,同時將檔案權限設定為網頁伺服器使用者。

另請參閱同一問題這裡

相關內容