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

11

Каждый раз , когда я делаю 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)

Есть ли способ обойти это?

Я хочу сделать некоторые файлы / каталоги доступными для записи веб-сервером.

х-юри
источник

Ответы:

4

Похоже, что у пользователя, с которым вы работаете, установлена ​​группа по умолчанию 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 .

SLM
источник
Во-первых, вы должны иметь в виду newgrp. Тогда, это меняет группу только для текущей оболочки? И наконец, цель состояла в том, чтобы сделать только определенные файлы / каталоги доступными для записи веб-сервером. В конце концов, мне, вероятно, следует починить их вручную или установить какой-нибудь gitкрючок ...
x-yuri
@ х-юри - да извини, сейчас 5 утра, а я иду спать 8-). Да, это сохраняется только для текущей оболочки, так что это будет недостатком этого подхода. Если вы хотите получить только определенный доступ к веб-серверу, это будет непросто, и тогда вы, вероятно, захотите использовать ACL. Также вы можете захотеть добавить эти данные в свой вопрос. Поскольку это неясно, какова ваша цель, поэтому я могу ответить вам только в неконкретных терминах.
SLM
1
@ x-yuri - ловушка для пост-обновления, подобная этой, может быть более подходящей: stackoverflow.com/questions/9613545/…
slm
1
@ х-юри - контроль прав доступа обсуждается в мерзавца книге под крючками: git-scm.com/book/en/Customizing-Git-Git-Hooks
ОДС
На самом деле, я не вижу, как изменение группы только для текущей оболочки может быть недостатком, если честно. Я был обеспокоен тем, чтобы это не изменило работу остальных приложений.
x-yuri
2

Решение, которое я использую, состоит в том, чтобы запустить команду как пользователь , у которого есть разрешения, которые вы хотите сохранить:

sudo -u user command

Это удерживает разрешения от изменения. Я использую его при обновлении git-репозиториев на моем VPS, сохраняя права доступа к файлам, установленные для пользователя веб-сервера.

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

Deleet
источник