Назад | Перейти на главную страницу

Как поделиться репозиторием Git с несколькими пользователями на машине?

У меня есть репозиторий 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
  1. первая строка создает каталог репо
  2. вторая строка устанавливает свою группу в mygroup
  3. третья строка инициализирует голое репо со следующей конфигурацией:
    1. core.bare = true: сделать это репо
    2. core.sharedrepository = 1 (такой же как core.sharedrepository = group): каталог репо и все каталоги, созданные в нем позже, будут управляться git, чтобы разрешить mygroup права на чтение, запись и выполнение (также с установленным битом sgid - для работы с пользователями, для которых mygroup не их основная группа)
    3. 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