Есть ли способ запретить git менять разрешения и владельца при извлечении?

Есть ли способ запретить git менять разрешения и владельца при извлечении?

Каждый раз, когда я делаю 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, сохраняя при этом разрешения на файлы, установленные для пользователя веб-сервера.

См. также тот же вопросздесь.

Связанный контент