Подтвердить что ты не робот

Как сделать репозиторий git только для чтения?

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

Эти голые репозитории были инициализированы --shared=group, поэтому устанавливаются разрешения файлов на 660 для всех файлов, достаточно хороших, чтобы разрешить доступ к SSH, но запретить запись? Или есть более простой способ?

Приветствия.

4b9b3361

Ответ 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>