Как сделать репозиторий git только для чтения?
У меня есть несколько репозиториев git, доступ к которым удаленно через SSH, и я хочу сделать некоторые из них доступными только для чтения, чтобы предотвратить большее количество нажатий. У некоторых людей есть пульты, указывающие на эти репозитории.
Эти голые репозитории были инициализированы --shared=group
, поэтому устанавливаются разрешения файлов на 660 для всех файлов, достаточно хороших, чтобы разрешить доступ к SSH, но запретить запись? Или есть более простой способ?
Приветствия.
Ответы
Ответ 1
Существует несколько способов сделать это.
-
Если у ваших пользователей есть учетная запись оболочки (возможно, ограничена), и каждый из них обращается к репозиториям git через свою собственную учетную запись, вы можете использовать разрешения файловой системы для управления доступом SSH к git репозитории. В Unix это будут права на запись в каталогах, возможно, с помощью создания группы и конкретных разрешений для группы (с набором "липких идентификаторов групп" ).
-
Для нажатия git-receive-pack
требуется $PATH пользователя и будет выполняться для них... хотя я не уверен, насколько это возможно.
-
Вы можете использовать update
или pre-receive
hook для управления доступом к репозиторию, например, используя update-paranoid примерный крючок из contrib/hooks
в git источниках.
-
С большим количеством пользователей вы могли бы лучше использовать инструмент для управления доступом к репозиториям git, например Gitosis (в Python требуется setuptools) или Gitolite (в Perl).
-
Для доступа только для чтения вы можете настроить git daemon, чтобы предоставлять анонимный (и неавторизованный) доступ только для чтения через протокол git://
вместо доступа по протоколу SSH.
См. документацию для переменной url.<base>.insteadOf
config для облегчения перехода от SSH к протоколу git.
См. также главу 4. " git на сервере " Pro Git от Scott Chacon (лицензия CC-BY-NC-SA).
Ответ 2
chmod -R a-w /path/to/repo.git
Ответ 3
A pre-receive
hook, который просто печатает информативное сообщение и выходит с ненулевым статусом, выполняет задание.
Предполагая, что вы помещаете какую-либо значимую информацию в свое сообщение, она также сокращает запросы от разочарованных пользователей, спрашивая, почему они не могут нажать:
#!/bin/bash
echo "=================================================="
echo "This repository is no longer available for pushes."
echo "Please visit blah blah yadda yadda ...."
echo "=================================================="
exit 1
Ответ 4
Так как git полагается в первую очередь на файловую систему для контроля доступа, это будет работать. Обратите внимание, что в ваших разрешениях мир не имеет доступа к файлу, но пользователь и группа имеют доступ на чтение/запись. Если вы хотите читать по всему миру, ваши разрешения должны быть 0444
.
Вы можете сделать более мелкомасштабный контроль, установив разрешения репо как 0664
, где пользователь nobody
, а группа - как gitdevs
. Тогда только люди из группы gitdevs
будут иметь возможность писать в репо, но мир может читать из него.
Последующее наблюдение Вот ссылка, в которой описаны различные способы обмена репо и обложки. минусов и функций контроля доступа.
Ответ 5
Если вам нужен контроль доступа, проверьте gitosis. Довольно проста в настройке, и вы можете использовать простой script для управления тем, кто может что-то сделать.
Ответ 6
Другая возможность - это протокол git, но для этого требуется демон git.
Ответ 7
Недавно я использовал ограничение доступа к пути /repo.git/ git-receive-pack, чтобы достичь результата, который репозиторий читает-пишет для некоторых пользователей и доступен только для чтения для некоторых других. В httpd config это выглядит так:
<Location /repo.git/>
Require group developers developers-ro
</Location>
<Location /repo.git/git-receive-pack>
Require group developers
</Location>