У меня есть Git-репозиторий на промежуточном сервере, к которому должны иметь возможность работать несколько разработчиков. git-init
кажется, флаг очень близок к тому, что я ищу: --shared
за исключением того, что я хотел бы, чтобы несколько человек также обращались к этому хранилищу. git-clone
«S --shared
флаг делает что - то совершенно другое.
Какой самый простой способ изменить разрешения существующего репозитория?
permissions
git
users
share
Андрей Федоров
источник
источник
Ответы:
Разрешения являются вредителями.
По сути, вам нужно убедиться, что все эти разработчики могут писать обо всем в репозитории git.
Перейдите к Решению New-Wave для превосходного метода предоставления возможности записи группе разработчиков.
Стандартное решение
Если вы поместите всех разработчиков в специально созданную группу, вы в принципе можете просто:
Затем измените
umask
для пользователей значение002
так, чтобы новые файлы создавались с правами на запись в группы.Проблемы с этим легион; Если вы находитесь в дистрибутиве, в котором предполагается наличие
umask
одного022
(например, наличие общейusers
группы, в которую по умолчанию входят все), это может вызвать проблемы с безопасностью в других местах. И рано или поздно что-то испортит вашу тщательно разработанную схему разрешений, выводя репо из строя до тех пор, пока вы не получитеroot
доступ и не исправите его (то есть повторно запустите вышеуказанные команды).Новая волна Решение
Превосходящее решение - хотя и менее понятное и требующее немного большей поддержки ОС / инструментов - это использование расширенных атрибутов POSIX. Я только пришел в эту область сравнительно недавно, поэтому мои знания здесь не так жарко, как могло бы быть. Но в основном расширенный ACL - это возможность устанавливать разрешения не только для 3-х слотов по умолчанию (пользователь / группа / другое).
Итак, еще раз, создайте свою группу, затем запустите:
Это устанавливает расширенный ACL для группы, чтобы члены группы могли читать / записывать / получать доступ к любым файлам, которые там уже есть (первая строка); затем также скажите всем существующим каталогам, что к новым файлам должен применяться тот же ACL (вторая строка).
Надеюсь, это поможет вам.
источник
chmod -R g+swX
, это сделало Git очень несчастным, и он решил, что это больше не git-репозиторий («репозиторий не является git-репозиторием»). Я должен был chmod gs все файлы . Чтобы просто установить бит setgid для каталогов , попробуйтеfind /path/to/repo -type d -print0 | xargs -0 chmod g+s
. Все еще делаюchgrp -R thegroup /path/to/repo
.chmod -R g+swX gitrepo
будет применять бит setguid к файлам, что представляет угрозу безопасности. Вместо этого вы можете использоватьfind . -type d -exec chmod g+s {} +
его только для каталогов.если вы создали хранилище (или клонировали новое голое хранилище из существующего) с
или же
Git должен обрабатывать разрешения сверх того, что предоставляет ваш umask по умолчанию. Наконец, это верно для моей версии Git (1.6.3). Конечно, это предполагает, что ваши пользователи находятся в одной группе.
Однако, если бы мне нужно было управление пользователями в нескольких группах с разной степенью чтения / записи, я бы пошел на хитоз. Я также слышал упоминание о gitolite ( http://github.com/sitaramc/gitolite ), вилке gitosis, которая, как предполагается, предоставляет разрешения на уровне ветвей, хотя я не могу сказать, что каждый использовал ее лично.
источник
--shared
аргумент принимает восьмеричное, а не шестнадцатеричное значение. Я подтвердил это в источнике Git 1.7.8, и второй пример должен бытьgit init --shared=0NNN
.NNN
такое маска разрешений, номер группы или что-то еще?git init --bare --shared=group myproj
где myproj - это имя вашего репо, а затемchgrp -R mygroup myproj
mygroup - это имя вашей группы.Этого не было сказано, поэтому я хочу быстро добавить его.
Чтобы убедиться, что проблемы с разрешениями не обрезают их уродливую голову, убедитесь, что в файле конфигурации вашего общего git-репозитория установлено следующее:
Это обеспечит соблюдение настроек umask вашей системы.
источник
git config core.sharedRepository true
.git init --shared
isgit clone --config core.sharedRepository=true
. Странно использовать git--shared
для таких разных значений в таких похожих командах.Руководство пользователя Git описывает , как разделить хранилище нескольких способов.
Более сложными, но полнофункциональными способами обмена репозиториями являются:
Мы используем GitHub для команды из 6 разработчиков.
источник
Также посмотрите на gitolite для размещения вашего git-репозитория. Гитоз, по-видимому, больше не развивается.
источник
Один из способов исправить разрешения в общем репозитории, чтобы у пользователей не возникало проблем с разрешениями при нажатии, - это создать скрипт перехвата после обновления, который будет делать именно это. Это должно работать в любой версии git.
Предположим, у вас есть общий репозиторий в /myrepo.git. Все файлы в этом хранилище принадлежат, скажем, mysharedgroup . Все пользователи, загружающие данные в этот репозиторий, также должны принадлежать к mysharedgroup . Теперь создайте следующий файл (изменив mysharedgroup на ваши предпочтения):
/myrepo.git/hooks/post-update
источник
/dev/null
. Пожалуйста, дайте пользователю сначала увидеть эти сообщения, а затем решайте сами.Чтобы собрать воедино полезные советы из различных ответов и комментариев о создании нового репо:
Если вы настраиваете совершенно новый репозиторий
myrepo
в/srv/git
для группыmygroup
, это то , что вы хотите:mygroup
core.bare = true
сделать репоcore.sharedrepository = 1
(так же, какcore.sharedrepository = group
): каталог репо и все последующие созданные в нем каталоги будут управляться git для предоставления разрешений наmygroup
чтение, запись и выполнение (также с установленным битом sgid), чтобы работать с пользователями, для которых ониmygroup
не являются основная группа)receive.denyNonFastforwards = 1
: отрицать не перемотки вперед в репоЕсли вы хотите точно настроить права пользователя, группы или других пользователей, используйте
--shared=0NNN
, гдеNNN
находятся стандартные пользовательские, групповые и другие биты для файлов (биты execute и sgid в каталогах будут соответствующим образом управляться git). Например, это разрешает пользователю доступ для чтения и записи, а также доступ только для чтения к группе (и нет доступа к другим):Это позволяет читать и записывать доступ для пользователя и группы (и не иметь доступа к другим):
Это дает доступ на чтение и запись для пользователя и группы, а также доступ только для чтения к другим:
Обратите внимание, что если вы не собираетесь разрешать доступ для записи в группу, убедитесь, что сначала используете,
chown
чтобы установить владельца репо, а затем выполнитеgit init
команду от имени этого пользователя (чтобы убедиться, что репозиторий инициализирован с правильным владельцем для все исходные файлы и подкаталоги).источник
Вы можете использовать git-daemon для общего доступа к хранилищу. Прочитайте документацию по git-daemon для получения дополнительной информации.
РЕДАКТИРОВАТЬ:
Также проверьте в этой статье 8 способов поделиться своим репозиторием git .
источник
Выполнение именно этого сработало для меня, для существующего хранилища. Для этого нужны советы из нескольких ответов и комментариев:
Из родительского каталога вашего хранилища на сервере:
источник
Ответ @stevek_mcc - тот, который я искал, когда гуглил этот вопрос
источник