2011-01-28 2 views
25

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

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

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

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

Итак ... любые предложения?

+2

Попробуйте 'gitolite', вам понадобится только один пользователь git. – takeshin

+6

Скачивание дополнительного программного обеспечения на самом деле не является для нас вариантом. – rich

ответ

21

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

 
chgrp -R GROUP /path/to/repo 
find /path/to/repo -type d -print0 | xargs -0 chmod g+s 
+7

Никогда не делайте 'chmod -R g + s' git repo, вместо того, чтобы делать только то, что, по вашему мнению, вы сделали, вы только что включили setgid для каждого файла. – Arrowmaster

+0

Ну, это правда, это не лучшая вещь. К счастью, ни один из них не является исполняемым. Я обновил сообщение, чтобы вместо этого использовать только каталоги (что необходимо). –

+2

Хорошо, если вы собираетесь использовать find, вы можете использовать все возможности и использовать -print0 для защиты от любого существа, достаточно сумасшедшего, чтобы использовать пробелы или другие странные символы в именах их ветвей/тегов. – Arrowmaster

7

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

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

19

существующий репозиторий, который не был создан с --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 * 
+1

В моем случае мне пришлось делать «chmod -R g + rw *», потому что группа должна иметь право писать, а не просто читать. В противном случае спасибо за ваш ответ. –

4

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

git config core.sharedRepository group 
chgrp -R GROUP /path/to/repo 
find /path/to/repo -type d -exec chmod g+rwxs {} \; 
3

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

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

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

git config core.sharedRepository group 

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

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

chgrp -R repogroup . 

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

chmod -R g+wX . 

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

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

Смежные вопросы