it-swarm-ru.tech

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

У меня есть Git-репозиторий на промежуточном сервере, к которому должны иметь возможность работать несколько разработчиков. git-init кажется, что флаг очень близок к тому, что я ищу: --shared, за исключением того, что я хотел бы, чтобы несколько человек тоже подключились к этому хранилищу. git-clone 's --shared флаг делает что-то совершенно другое.

Какой самый простой способ изменить разрешения существующего репозитория?

217
Andrey Fedorov

Разрешения являются вредителями.

По сути, вам нужно убедиться, что все эти разработчики могут писать обо всем в репозитории 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 (вторая строка).

Надеюсь, это поможет вам.

193
womble

если вы создали хранилище (или клонировали новое голое хранилище из существующего) с

$ git init --shared=group 

или

$ git init --shared=0NNN

Git должен обрабатывать разрешения сверх того, что предоставляет ваш umask по умолчанию. Наконец, это верно для моей версии Git (1.6.3). Конечно, это предполагает, что ваши пользователи находятся в одной группе.

Однако, если бы мне нужно было управление пользователями в нескольких группах с разной степенью чтения/записи, я бы пошел на хитоз. Я также слышал упоминание о gitolite ( http://github.com/sitaramc/gitolite ), развилке gitosis, которая, как предполагается, предоставляет разрешения на уровне ветвей, не могу сказать, что каждый использовал ее хотя лично.

122
user35117

Этого не было сказано, поэтому я хочу быстро добавить его.

Чтобы убедиться, что проблемы с разрешениями не обрезают их уродливую голову, убедитесь, что в файле конфигурации общего репозитория git установлено следующее:

[core]
    sharedRepository = true

Это обеспечит соблюдение настроек umask вашей системы.

55
Niels Joubert

Руководство пользователя Git описывает, как открыть репозиторий несколькими способами.

Более сложные, но полнофункциональные способы обмена репозиториями:

Мы используем GitHub для команды из 6 разработчиков.

22
jtimberman

Также посмотрите gitolite для размещения вашего git-репозитория. Гитоз, по-видимому, больше не развивается.

9
mt3

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

Предположим, у вас есть общий репозиторий в /myrepo.git. Все файлы в этом хранилище принадлежат, скажем mysharedgroup. Все пользователи, отправляющие в этот репозиторий, также должны принадлежать к mysharedgroup. Теперь создайте следующий файл (изменив mysharedgroup на ваши предпочтения):

/ myrepo.git/Крючки/пост-обновление

#!/bin/sh
chmod -R g+w . 2>/dev/null
chgrp -R mysharedgroup . 2>/dev/null
4
bkmks

Чтобы собрать воедино полезные советы из разных ответов и комментариев о создании нового репо:

Если вы настраиваете новое репо myrepo in /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 команда от имени этого пользователя (чтобы убедиться, что хранилище инициализировано с правильным владельцем для всех исходных файлов и подкаталогов).

3
Justin Ludwig

Вы можете использовать git-daemon для общего доступа к хранилищу. Прочитайте документацию по git-daemon для получения дополнительной информации.

Правка:

Также проверьте эту статью 8 способов поделиться своим репозиторием git .

2
Vihang D

Выполнение именно этого сработало для меня, для существующего хранилища. Для этого нужны советы из нескольких ответов и комментариев:

Из родительского каталога вашего хранилища на сервере:

chgrp -R <whatever group> gitrepo
chmod -R g+wX gitrepo
cd gitrepo
find . -type d -exec chmod g+s {} +
git config core.sharedRepository group
1
Luis de Arquer

Ответ @stevek_mcc - тот, который я искал, когда гуглил этот вопрос

git clone --config core.sharedRepository=true
0
ragerdl