Чи є спосіб запобігти зміні дозволів і прав власності на 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 мав конкретне право власності, у вас є принаймні два варіанти.

Варіант №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перед роботою в цій робочій області.

Інші варіанти

Якщо жодне з них не здається прийнятним, ви можете спробувати використовувати ACL, а не в каталозі робочої області git. Вони обговорюються в декількох запитаннях на цьому веб-сайті, як, наприклад, у цьому запитанні з питань відповідей: Отримання нових файлів для успадкування групових прав на Linux .


По-перше, ви повинні мати сенс newgrp. Тоді, чи змінюється група лише для поточної оболонки? І останнє, справа полягала в тому, щоб зробити доступними для запису лише веб-сервером лише певні файли / каталоги. Зрештою, я, мабуть, повинен би їх виправити вручну, або встановити якийсь gitгачок ...
x-yuri

@ x-yuri - так вибачте, що тут 5 ранку, і я збираюся лягати спати 8-). Так, це зберігається лише для поточної оболонки, так що це буде недоліком цього підходу. Якщо ви маєте намір отримати лише певний доступ до веб-сервера, тоді це стане складним, і ви, швидше за все, захочете використовувати ACL. Також ви, можливо, захочете додати ці деталі до свого запитання Q. Як це незрозуміло, у чому полягає ваша ціль, тому я можу відповісти вам лише в конкретних умовах.
slm

1
@ x-yuri - гачок для оновлення після публікації, подібний до цього, може бути більш слушним: stackoverflow.com/questions/9613545/…
slm

1
@ x-yuri - контроль дозволів обговорюється в книзі git під гачками: git-scm.com/book/en/Customizing-Git-Git-Hooks
slm

Чесно кажучи, я не бачу, як зміна групи лише для поточної оболонки може бути недоліком, якщо чесно. Мене хвилює, чи не змінить спосіб роботи решти додатків.
x-yuri

2

Я використовую рішення - запустити команду як користувача, який має дозволи, які ви хочете зберегти:

sudo -u user command

Це запобігає зміні дозволів. Я використовую його під час оновлення репозиторіїв git на моєму VPS, зберігаючи дозволи файлу, встановлені користувачеві веб-сервера.

Дивіться також те саме питання тут .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.