2009-11-02 20 views
39

Mam niektóre repozytoriów git dostęp zdalnie za pośrednictwem SSH i chcę niektóre z nich tylko do odczytu, aby zapobiec więcej popycha. Niektórzy ludzie mają piloty wskazujące na te repozytoria.Jak utworzyć repozytorium git tylko do odczytu?

Te nagie repozytoria zostały zainicjowane jako --shared=group, tak więc ustawiono uprawnienia do plików na 660 dla wszystkich plików wystarczająco dobrych, aby nadal zezwalać na dostęp SSH, ale zabronione są zapisy? A może jest łatwiejszy sposób?

Pozdrawiam.

Odpowiedz

39

Istnieje więcej niż jeden sposób, aby to zrobić.

  • Jeśli użytkownicy dysponują konto shell (być może ograniczony), a każdy z nich uzyskuje dostęp do repozytoriów git poprzez własny rachunek, można użyć prawa dostępu kontrolować SSH dostęp do repozytorium git. W systemie Unix będą to uprawnienia do zapisu w katalogach , być może za pomocą tworzenia grupy i określonych uprawnień dla grupy (z ustawionym identyfikatorem "identyfikatora grupy").

  • Pushing wymaga git-receive-pack się w $ PATH z użytkownikiem, a być wykonywalny dla nich ... chociaż nie jestem pewien, jak to możliwe podejście to będzie.

  • Można użyć update lub pre-receive hak zrobić kontrolę dostępu do repozytorium, na przykład stosując przykład hak update-paranoid z contrib/hooks w źródłach git.

  • Z większej liczby użytkowników mogłoby być lepiej z użyciem narzędzie do zarządzania dostępem do repozytoriów git, jak Gitosis (w Pythonie, wymaga setuptools) lub Gitolite (w Perl).

  • uzyskać dostęp tylko do odczytu można skonfigurować git daemon zapewnić tylko do odczytu anonimowy (a nieautoryzowany) dostęp za pośrednictwem protokołu git:// zamiast dostęp za pośrednictwem protokołu SSH.

    Zobacz dokumentację zmiennej konfiguracyjnej url.<base>.insteadOf, aby ułatwić przejście z protokołu SSH na GIT.


Patrz także Rozdział 4. "Git on the Server" z Pro Git książki Scott Chacon (CC-BY-NC-SA licencją).

+2

Należy pamiętać, że dla uprawnień systemu plików można użyć polecenia chmod, zgodnie z sugestią Pat Notz. –

+8

Dzięki za pomysły (wszyscy). Zainspirowany przez przykład aktualizacji-paranoi, mam teraz hak w moich repozytoriach, który po prostu robi "echo" Closed for all pushes "; exit 1' –

+1

@SteveFolly Jeśli twój komentarz był odpowiedzią, zagłosowałbym na to zamiast zaakceptowanej odpowiedzi. Twoja jest krótka, do rzeczy i działa. –

3

Ponieważ git polega głównie na systemie plików do kontroli dostępu, to zadziała. Pamiętaj, że w twoich uprawnieniach świat nie ma dostępu do pliku, ale użytkownik i grupa mają dostęp do odczytu i zapisu. Jeśli chcesz, aby były czytelne dla całego świata, Twoje uprawnienia powinny wynosić 0444.

Możesz wykonać dokładniejszą kontrolę, ustawiając uprawnienia repo jako 0664, gdzie użytkownik jest nobody, a grupa jest podobna do gitdevs. Wtedy tylko ludzie z grupy gitdevs będą mieli możliwość zapisu na repozytorium, ale świat może z niego odczytać.

Follow-upHere is a link który obejmuje różne sposoby udostępniania repo i pokrowce pochodzą Pro & zalety i funkcje kontroli dostępu.

+0

666 to pliki do odczytu i zapisu na świecie. 776 jest czytelny na całym świecie, nadaje się do odczytu i zapisu, a inni użytkownicy czytają i piszą. Nie wiesz, gdzie masz numery, które polecasz, ale na ogół są niebezpieczne. – Dustin

+0

Dzięki, poprawiłem moją odpowiedź. Za dużo pisania, za mało myślenia. – jheddings

0

Inną możliwością jest protokół git, ale wymaga on uruchomienia demona git.

1

Jeśli potrzebujesz kontroli dostępu, sprawdź też gitosis. Całkiem łatwe w konfiguracji i możesz użyć prostego skryptu, aby kontrolować, kto może robić co.

+1

Lub gitolite: http://github.com/sitaramc/gitolite –

9
chmod -R a-w /path/to/repo.git 
+0

"Zrób kilka z nich tylko do odczytu, aby zapobiec większej ilości popychaczy" - to uniemożliwiłoby ciągnięcie, prawda? – user3175580

7

Haczyk, który po prostu drukuje komunikat informacyjny i wychodzi z niezerowym stanem, wykonuje zadanie.

Zakładając umieścić kilka istotnych informacji w wiadomości, ale również zmniejszają zapytań od sfrustrowanych użytkowników pyta, dlaczego nie może wypchnąć:

#!/bin/bash 
echo "==================================================" 
echo "This repository is no longer available for pushes." 
echo "Please visit blah blah yadda yadda ...." 
echo "==================================================" 
exit 1 
0

Ostatnio użyłem ograniczenie dostępu do ścieżki „/ repo. git/git-receive-pack "do osiągnięcia wyniku, że repozytorium jest przeznaczone do odczytu i zapisu dla niektórych użytkowników i tylko do odczytu dla niektórych innych. W konfiguracji httpd wygląda to następująco:

<Location /repo.git/> 
      Require group developers developers-ro 
    </Location> 

    <Location /repo.git/git-receive-pack> 
      Require group developers 
    </Location> 
Powiązane problemy