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

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

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

195 голосов | спросил Andrey Fedorov 17 J0000006Europe/Moscow 2009, 05:04:08

10 ответов


170

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

В принципе, вам нужно убедиться, что все эти разработчики могут писать все в репозитории git.

Перейдите к New-Wave Solution для превосходного метода предоставления возможности записи групп разработчиков.

Стандартное решение

Если вы разместите всех разработчиков в специально созданной группе, вы можете в принципе просто:

chgrp -R <любая группа> gitrepo
chmod -R g + swX gitrepo

Затем измените umask для пользователей на 002, чтобы новые файлы создавались с разрешениями для групповой записи.

Проблемы с этим - легион; если вы используете дистрибутив, который предполагает umask of 022 (например, с общей группой users, которая включает всех по умолчанию) это может открыть проблемы безопасности в других местах. И рано или поздно что-то испортит вашу тщательно продуманную схему разрешений, поставив репо из строя до тех пор, пока вы не получите доступ к root и не исправите ее (т. Е. Повторите приведенные выше команды).

Новое волновое решение

Отличное решение - хотя и менее понятное, и для которого требуется немного больше поддержки ОС /инструмента - использовать расширенные атрибуты POSIX. Я только недавно пришел в эту область, поэтому мои знания здесь не такие горячие, как это могло бы быть. Но в основном расширенный ACL - это возможность устанавливать разрешения только на 3 слота по умолчанию (пользователь /группа /другой).

Итак, еще раз создайте свою группу, а затем запустите:

setfacl -R -m g: <любая группа>: rwX gitrepo
найти gitrepo -type d | xargs setfacl -R -m d: g: <любая группа>: rwX

Это устанавливает расширенный ACL для группы, чтобы члены группы могли читать /записывать /получать доступ к тем файлам, которые уже есть (первая строка); затем также сообщите всем существующим каталогам, что новые файлы должны иметь тот же самый ACL, который применяется (вторая строка).

Надеюсь, что ты по пути.

ответил womble 17 J0000006Europe/Moscow 2009, 10:00:53
113

, если вы создали репозиторий (или клонировали новое голое репо с существующего) с помощью

$ git init --shared = group

или

$ git init --shared = 0NNN

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

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

ответил 17 FebruaryEurope/MoscowbWed, 17 Feb 2010 08:40:48 +0300000000amWed, 17 Feb 2010 08:40:48 +030010 2010, 08:40:48
50

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

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

[ядро]
    sharedRepository = true

Это гарантирует, что настройки вашей системы «umask» соблюдаются.

ответил Niels Joubert 9 MaramWed, 09 Mar 2011 08:52:09 +03002011-03-09T08:52:09+03:0008 2011, 08:52:09
20

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

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

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

ответил jtimberman 17 J0000006Europe/Moscow 2009, 11:35:50
9

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

ответил mt3 19 Jam1000000amWed, 19 Jan 2011 11:55:31 +030011 2011, 11:55:31
4

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

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

/myrepo.git/hooks/post-update

#! /Bin /ш
chmod -R g + w. 2 > /DEV /нуль
chgrp -R mysharedgroup. 2 > /DEV /нуль
ответил bkmks 27 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 27 Sep 2011 18:35:55 +0400 2011, 18:35:55
2

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

EDIT:

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

ответил Vihang D 17 J0000006Europe/Moscow 2009, 06:58:56
2

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

Если вы создаете новый репо myrepo в /srv /git для группы mygroup, это то, что вы хотите

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

ответил Justin Ludwig 26 Mayam15 2015, 04:24:06
1

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

Из родительского каталога репозитория на сервере:

chgrp -R <любая группа> gitrepo
chmod -R g + wX gitrepo
cd gitrepo
найти . -тип d -exec chmod g + s {} +
Группа git config core.sharedRepository
ответил Luis de Arquer 13 WedEurope/Moscow2017-12-13T15:44:41+03:00Europe/Moscow12bEurope/MoscowWed, 13 Dec 2017 15:44:41 +0300 2017, 15:44:41
0

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

git clone --config core.sharedRepository = true
ответил ragerdl 29 MarpmWed, 29 Mar 2017 22:02:20 +03002017-03-29T22:02:20+03:0010 2017, 22:02:20

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132