У меня есть репозиторий Git на промежуточном сервере, к которому должны иметь доступ несколько разработчиков. git-init
похоже, есть флаг, очень близкий к тому, что я ищу: --shared
, за исключением того, что я бы хотел, чтобы несколько человек также подключились к этому репозиторию. В git-clone
с --shared
flag делает совсем другое.
Какой самый простой способ изменить разрешения существующего репозитория?
Разрешения - это вредитель.
По сути, вам нужно убедиться, что все эти разработчики могут писать обо всем в репозитории git.
Перейдите к The New-Wave Solution, чтобы узнать о превосходном методе предоставления группе разработчиков возможности писать.
Если объединить всех разработчиков в специально созданную группу, можно в принципе просто:
chgrp -R <whatever group> gitrepo
chmod -R g+swX gitrepo
Затем измените umask
для пользователей 002
, чтобы новые файлы создавались с разрешениями на запись для группы.
Проблем с этим масса; если вы используете дистрибутив, предполагающий umask
из 022
(например, наличие общего users
группа, в которую по умолчанию входят все), это может вызвать проблемы с безопасностью в другом месте. И рано или поздно что-то испортит вашу тщательно созданную схему разрешений, выведя репо из строя, пока вы не получите root
получить доступ и исправить это (т.е. повторно запустить вышеуказанные команды).
Лучшее решение - хотя и менее понятное и требующее немного большей поддержки ОС / инструментов - это использование расширенных атрибутов POSIX. Я приехал в эту область совсем недавно, поэтому мои знания здесь не такие горячие, как могло бы быть. Но в основном расширенный ACL - это возможность устанавливать разрешения не только для трех слотов по умолчанию (пользователь / группа / другое).
Итак, еще раз создайте свою группу, затем запустите:
setfacl -R -m g:<whatever group>:rwX gitrepo
find gitrepo -type d | xargs setfacl -R -m d:g:<whatever group>:rwX
Это устанавливает расширенный ACL для группы, чтобы члены группы могли читать / записывать / получать доступ к любым файлам, которые уже есть (первая строка); затем также сообщите всем существующим каталогам, что к новым файлам должен применяться тот же ACL (вторая строка).
Надеюсь, это поможет вам.
если вы создали репозиторий (или клонировали новое голое репо из существующего) с помощью
$ git init --shared=group
или
$ git init --shared=0NNN
Предполагается, что Git будет обрабатывать разрешения сверх того, что предоставляет ваша маска по умолчанию. Наконец-то это верно для моей версии Git (1.6.3). Конечно, это предполагает, что ваши пользователи находятся в одной группе.
Однако, если бы мне нужно было управлять пользователями в нескольких группах с разной степенью чтения / записи, я бы выбрал gitosis. Я также слышал упоминания о гитолите (http://github.com/sitaramc/gitolite), вилка gitosis, которая, как предполагается, предоставляет разрешения на уровне ветки, не могу сказать, что каждый использовал ее лично.
Об этом не было сказано, поэтому я хочу быстро это добавить.
Чтобы убедиться, что проблемы с разрешениями не обрезают свою уродливую голову, обязательно установите следующее в конфигурационном файле общего репозитория git:
[core]
sharedRepository = true
Это обеспечит соблюдение настроек umask вашей системы.
В Руководство пользователя Git описывает, как поделиться репозиторием несколькими способами.
Более сложные, но полнофункциональные способы совместного использования репозиториев:
Мы используем GitHub для команды из 6 разработчиков.
Также посмотрите на гитолит для размещения вашего репозитория git. Гитоз, по-видимому, больше не разрабатывается.
Один из способов исправить разрешения в общем репозитории, чтобы у пользователей не было проблем с разрешениями при отправке, - это создать скрипт перехвата после обновления, который будет делать именно это. Это должно работать в любой версии git.
Предположим, у вас есть общий репозиторий в /myrepo.git. Все файлы в этом репозитории принадлежат к мояредгруппа. Все пользователи, нажимающие на этот репозиторий, должны принадлежать мояредгруппа также. Теперь создайте следующий файл (изменив мояредгруппа на ваши предпочтения):
/myrepo.git/hooks/post-update
#!/bin/sh
chmod -R g+w . 2>/dev/null
chgrp -R mysharedgroup . 2>/dev/null
Чтобы обобщить полезные советы из различных других ответов и комментариев по настройке нового репо:
Если вы настраиваете новое репо myrepo
в /srv/git
для группы mygroup
, вот что вы хотите:
mkdir /srv/git/myrepo.git
chgrp mygroup /srv/git/myrepo.git
git init --bare --shared /srv/git/myrepo.git
mygroup
core.bare = true
: сделать это репоcore.sharedrepository = 1
(такой же как core.sharedrepository = group
): каталог репо и все каталоги, созданные в нем позже, будут управляться git, чтобы разрешить mygroup
права на чтение, запись и выполнение (также с установленным битом sgid - для работы с пользователями, для которых mygroup
не их основная группа)receive.denyNonFastforwards = 1
: запретить отправку репо без перемотки впередЕсли вы хотите настроить права пользователя, группы или других пользователей, используйте --shared=0NNN
, где NNN
стандартный пользователь, группа и другие биты для файлы (биты execute и sgid на каталоги будет соответствующим образом управляться git). Например, это разрешает пользователю доступ для чтения и записи, а также доступ только для чтения к группе (и без доступа для других):
git init --bare --shared=0640 /srv/git/myrepo.git
Это обеспечивает доступ для чтения и записи для пользователя и группы (и без доступа для других):
git init --bare --shared=0660 /srv/git/myrepo.git
Это обеспечивает доступ для чтения и записи для пользователя и группы, а также доступ только для чтения для других:
git init --bare --shared=0664 /srv/git/myrepo.git
Обратите внимание: если вы не собираетесь разрешать доступ для записи группе, обязательно сначала используйте chown
чтобы установить владельца репо, а затем запустить git init
от имени этого пользователя (чтобы убедиться, что репо инициализировано с правильным владельцем для всех исходных файлов и подкаталогов).
Вы можете использовать git-daemon для совместного использования репозитория. Прочтите документацию для git-daemon Чтобы получить больше информации.
РЕДАКТИРОВАТЬ:
Также проверьте эту статью 8 способов поделиться своим репозиторием git.
Это сработало для меня для существующего репозитория. Это требует советов из нескольких ответов и комментариев ранее:
Из родительского каталога вашего репозитория на сервере:
chgrp -R <whatever group> gitrepo
chmod -R g+wX gitrepo
cd gitrepo
find . -type d -exec chmod g+s {} +
git config core.sharedRepository group
Ответ @stevek_mcc - это тот, который я искал, когда гуглил этот вопрос
git clone --config core.sharedRepository=true