У меня есть Git-репозиторий на промежуточном сервере, к которому должны иметь возможность работать несколько разработчиков. git-init
кажется, что флаг очень близок к тому, что я ищу: --shared
, за исключением того, что я хотел бы, чтобы несколько человек тоже подключились к этому хранилищу. git-clone
's --shared
флаг делает что-то совершенно другое.
Какой самый простой способ изменить разрешения существующего репозитория?
Разрешения являются вредителями.
По сути, вам нужно убедиться, что все эти разработчики могут писать обо всем в репозитории git.
Перейдите к Решению New-Wave для превосходного метода предоставления возможности записи группе разработчиков.
Если вы поместите всех разработчиков в специально созданную группу, вы в принципе можете просто:
chgrp -R <whatever group> gitrepo
chmod -R g+swX gitrepo
Затем измените umask
для пользователей на 002
, чтобы новые файлы создавались с правами на запись в группы.
Проблемы с этим легион; если вы находитесь в дистрибутиве, который предполагает umask
of 022
(например, наличие общей группы users
, которая по умолчанию включает всех), это может открыть проблемы безопасности в других местах. И рано или поздно что-то испортит вашу тщательно разработанную схему разрешений, выводя репо из строя до тех пор, пока вы не получите root
доступ и не исправите его (то есть повторно запустите вышеуказанные команды).
Лучшее решение - хотя и менее понятное и требующее немного большей поддержки ОС/инструментов - это использование расширенных атрибутов POSIX. Я только недавно пришел в эту область, поэтому мои знания здесь не такие горячие, как могли бы быть. Но в основном расширенный ACL - это возможность устанавливать разрешения не только для 3-х слотов по умолчанию (пользователь/группа/другое).
Итак, еще раз, создайте свою группу, затем запустите:
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 должен обрабатывать разрешения сверх того, что предоставляет ваш umask по умолчанию. Наконец, это верно для моей версии Git (1.6.3). Конечно, это предполагает, что ваши пользователи находятся в одной группе.
Однако, если бы мне нужно было управление пользователями в нескольких группах с разной степенью чтения/записи, я бы пошел на хитоз. Я также слышал упоминание о gitolite ( http://github.com/sitaramc/gitolite ), развилке gitosis, которая, как предполагается, предоставляет разрешения на уровне ветвей, не могу сказать, что каждый использовал ее хотя лично.
Этого не было сказано, поэтому я хочу быстро добавить его.
Чтобы убедиться, что проблемы с разрешениями не обрезают их уродливую голову, убедитесь, что в файле конфигурации общего репозитория git установлено следующее:
[core]
sharedRepository = true
Это обеспечит соблюдение настроек umask вашей системы.
Руководство пользователя Git описывает, как открыть репозиторий несколькими способами.
Более сложные, но полнофункциональные способы обмена репозиториями:
Мы используем GitHub для команды из 6 разработчиков.
Также посмотрите gitolite для размещения вашего git-репозитория. Гитоз, по-видимому, больше не развивается.
Один из способов исправить разрешения в общем репозитории, чтобы у пользователей не возникало проблем с разрешениями при нажатии, - это создать скрипт перехвата после обновления, который будет делать именно это. Это должно работать в любой версии git.
Предположим, у вас есть общий репозиторий в /myrepo.git. Все файлы в этом хранилище принадлежат, скажем mysharedgroup. Все пользователи, отправляющие в этот репозиторий, также должны принадлежать к mysharedgroup. Теперь создайте следующий файл (изменив mysharedgroup на ваши предпочтения):
/ myrepo.git/Крючки/пост-обновление
#!/bin/sh
chmod -R g+w . 2>/dev/null
chgrp -R mysharedgroup . 2>/dev/null
Чтобы собрать воедино полезные советы из разных ответов и комментариев о создании нового репо:
Если вы настраиваете новое репо myrepo
in /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