Как правильно использовать права доступа к групповым файлам в репозитории git? - PullRequest
25 голосов
/ 28 января 2011

Мы обращаемся к общему git-репозиторию через пути к файлам, по разным причинам, которые я пока опущу, созданные с помощью --shared = group.

У нас есть различные группы Unix, но все они имеют общую группу. Если я запускаю chgrp -R в репозитории git, каждый может читать из него, но если кто-то пишет в него чаще, чем новые, создаются новые файлы, которые не используют общую группу.

Эта проблема, по-видимому, связана с тем, что наша основная группа не является общей, и если мы запускаем newgrp, все, похоже, работает хорошо.

Есть проблемы с этим подходом, хотя; newgrp работает медленно и порождает новую оболочку, что заставляет меня думать, что вызывать ее в .bash_profile было бы плохой идеей, даже не задумываясь о том, хотим ли мы все наши новые файлы использовать общие группа. Однако полагаться на память, чтобы запускать ее перед выполнением какой-либо работы с git, тоже может быть катастрофой.

Итак ... есть предложения?

Ответы [ 5 ]

22 голосов
/ 10 февраля 2012

Существующий репозиторий, который не был создан с помощью --shared, можно использовать совместно с помощью следующих команд:

# make the repository shared
git config core.sharedRepository group # or whatever other sharing option
# fix the setgid bit
find . -type d | xargs chmod g+s
# repair the permissions
chmod -R g+r *
22 голосов
/ 28 января 2011

Вам также необходимо установить setgid bit для группы.

chgrp -R GROUP /path/to/repo
find /path/to/repo -type d -print0 | xargs -0 chmod g+s 
9 голосов
/ 29 января 2011

Это голый репо? Если это чистый репозиторий, и вы использовали --shared, когда создавали его, то этого не должно происходить, поэтому я и спрашиваю.

Если это чистое хранилище, возможно, некоторые каталоги были заменены на g-s, если это произошло, вам нужно либо chmod g+x только для всех каталогов, убедитесь, что вы не делаете это ни с какими файлами. Более простой способ - просто git init --bare --shared=group создать новый репозиторий и отправить контент обратно к нему из клона somebody.

5 голосов
/ 30 января 2014

Мне пришлось использовать комбинацию из приведенных выше ответов:

git config core.sharedRepository group
chgrp -R GROUP /path/to/repo
find /path/to/repo -type d -exec chmod g+rwxs {} \;
4 голосов
/ 12 апреля 2016

После того, как пустой репозиторий имеет флаг shared=group, git позаботится обо всем остальном, поэтому следующее должно быть сделано только один раз. Также setgid не рекомендуется для этого использования. Здесь я копирую / вставляю мой ответ от serverfault :

Предполагается, что repogroup является вашей группой, и у вас есть cd в каталоге репо:

Сначала измените общий флаг на group:

git config core.sharedRepository group 

Примечание: здесь вы должны использовать ключевое слово group, а не имя группы. Это эквивалентно созданию чистого хранилища с опцией --shared=group.

Затем измените группу для всего хранилища:

chgrp -R repogroup .

Чтобы убедиться, что существующие каталоги доступны для записи в группах (g+w), и существующие исполняемые файлы также становятся исполняемыми группами (g+X) Вам также необходимо:

chmod -R g+wX .

После того, как вы это сделаете, git соблюдает флаг shared=group и позаботится о следующих разрешениях для групп, как для существующих, так и для новых файлов, поэтому вам больше никогда не понадобится umask или chgrp.

Я добавлю источник в комментарий, если найду его обратно.

...