Каждый раз, когда я делаю 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 clone, эти файлы не будут иметь принудительно примененных групп из-за изменений, сделанных выше.
Вариант №2
Прежде чем приступить к работе, измените группу по умолчанию следующим http
образом:
$ newgrp http
$ git clone ...
Этот метод принудительно установит для всех новых создаваемых файлов группу http
вместо обычной группы по умолчанию yuri
, но это будет работать только до тех пор, пока вы не забудете сделать это newgrp
перед началом работы в этом рабочем пространстве.
Другие варианты
Если ни один из этих вариантов не кажется приемлемым, вы можете попробовать использовать ACL в каталоге рабочего пространства git. Они обсуждаются в нескольких вопросах и ответах на этом сайте, например, в этом вопросе и ответе под названием:Получение новых файлов для наследования групповых разрешений в Linux.
решение2
Решение, которое я использую, этовыполните команду как пользовательс разрешениями, которые вы хотите сохранить:
sudo -u user command
Это предотвращает изменение разрешений. Я использую его при обновлении репозиториев git на моем VPS, сохраняя при этом разрешения на файлы, установленные для пользователя веб-сервера.
См. также тот же вопросздесь.