Permissions

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

  • March 15, 2018

每次我執行git pullorgit 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)

有沒有辦法解決它?

我想讓一些文件/目錄可供 Web 伺服器寫入。

這聽起來像您正在執行的使用者將預設組設置為yuri. 您可以這樣確認:

$ id -a
uid=1000(saml) gid=1000(saml) groups=1000(saml),10(wheel),989(wireshark)

您帳戶的 UID 是這樣的:uid=1000(saml)而預設組是git=1000(saml),此後任何輔助組都是。

**注意:**如果您希望 git clone 擁有特定的所有權,那麼您至少有 2 個選項。

選項1

根據需要設置具有權限的父目錄,如下所示:

$ mkdir topdir
$ chgrp http topdir
$ chmod g+s topdir

$ cd topdir
$ git clone ....

這迫使目錄topdir強制其下的任何子目錄http應用該組。這將在很大程度上起作用,但可能會導致問題,因為如果您將文件移動到此 git clone 工作區,這些文件將不會通過上述更改強制執行其組。

選項#2

在開始工作之前,將您的預設組更改為http

$ newgrp http
$ git clone ...

此方法將強制創建的任何新文件將其組設置為,http而不是您的正常預設組yuri,但這只有在您記得newgrp在此工作區中工作之前進行操作時才有效。

其他選項

如果這些看起來都不可接受,您可以嘗試在 git 工作區目錄上使用 ACL。這些在此站點上的多個問答中進行了討論,例如在此問答中,標題為:獲取新文件以繼承 Linux 上的組權限

引用自:https://unix.stackexchange.com/questions/160527