2009-11-02 20 views
39

Ho alcuni repository git accessibili in remoto tramite SSH e voglio renderne alcuni di sola lettura per evitare ulteriori push. Alcune persone hanno telecomandi che puntano a questi repository.Come rendere un repository git di sola lettura?

Questi depositi nude erano inizializzati --shared=group, così sta impostando i permessi dei file a 660 per tutti i file abbastanza buono da permettere ancora l'accesso SSH, ma non consentire scrive? O c'è un modo più semplice?

Cheers.

risposta

39

C'è più di un modo possibile per farlo.

  • Se gli utenti dispongono di un account di shell (forse limitato), e ciascuno di loro l'accesso ai repository git tramite il loro conto proprio, è possibile utilizzare permessi filesystem per controllare l'accesso SSH al repository git. Su Unix quelle sarebbero permessi di scrittura sulle directory , forse con l'aiuto di creare un gruppo e permessi specifici per un gruppo (con l'impostazione "ID gruppo appiccicoso").

  • Spingendo richiede git-receive-pack di essere in $ PATH dell'utente, e di essere eseguibile per loro ... anche se non sono sicuro di come fattibile questo approccio sarebbe.

  • È possibile utilizzare update o pre-receive gancio fare controllo dell'accesso al repository, per esempio usando update-paranoid esempio gancio dal contrib/hooks in sorgenti GIT.

  • Con un maggior numero di utenti si potrebbe essere meglio con l'utilizzo di uno strumento per gestire l'accesso al repository git, come Gitosis (in Python, richiede setuptools) o Gitolite (in Perl).

  • Per l'accesso in lettura solo è possibile impostare git daemon per fornire accesso in sola lettura anonimo (e non autenticato) tramite git:// protocollo, invece di accesso tramite protocollo SSH.

    Consultare la documentazione per la variabile di configurazione url.<base>.insteadOf per un modo per facilitare la transizione da SSH al protocollo GIT.


Vedi anche il capitolo 4. "Git on the Server" di Pro Git libro di Scott Chacon (CC-BY-NC-SA licenza).

+2

Si noti che per le autorizzazioni del filesystem, è possibile utilizzare chmod, come suggerito da Pat Notz. –

+8

Grazie per le idee (tutti). Ispirato al hook di esempio paranoico update, ora ho un hook nei miei repository che semplicemente "echo" Closed for all pushes "; exit 1' –

+1

@SteveFolly Se il tuo commento era una risposta, voterei per questo invece della risposta accettata. Il tuo è breve, al punto, e funziona. –

3

Poiché git si basa principalmente sul filesystem per il controllo degli accessi, funzionerà. Nota che nelle tue autorizzazioni, il mondo non ha accesso al file, ma l'utente e il gruppo hanno accesso in lettura/scrittura. Se vuoi una lettura mondiale, le tue autorizzazioni dovrebbero essere 0444.

È possibile eseguire ulteriori controlli dettagliati impostando le autorizzazioni Repo come 0664 dove l'utente è nobody e il gruppo è qualcosa come gitdevs. Quindi, solo le persone nel gruppo gitdevs avranno la possibilità di scrivere sul repository, ma il mondo può leggerlo.

Follow-upHere is a link che copre vari modi per condividere il vostro pronti contro termine e le coperture vengono di pro & contro e funzioni di controllo di accesso.

+0

666 è un file leggibile e scrivibile in tutto il mondo. 776 è leggibile, scrivibile ed eseguibile dal mondo e dal gruppo e altri utenti leggono e scrivono. Non sei sicuro di dove hai preso i numeri che stai raccomandando, ma sono generalmente pericolosi. – Dustin

+0

Grazie, ho corretto la mia risposta. Troppa digitazione, non abbastanza pensiero. – jheddings

0

Un'altra possibilità è il protocollo git, ma richiede che il daemon git sia in esecuzione.

1

Se è necessario anche il controllo degli accessi, consultare gitosis. Abbastanza facile da configurare e puoi usare un semplice script per controllare chi può fare cosa.

+1

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

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

"fai in modo che alcuni di loro siano di sola lettura per evitare ulteriori spinte" - questo impedirebbe di tirare, vero? – user3175580

7

Un gancio pre-receive che stampa semplicemente un messaggio informativo ed esce con uno stato diverso da zero fa il lavoro.

Supponendo che si mette un po 'di informazioni significative nel messaggio, si riduce anche sulle query degli utenti frustrati che chiedono perché non possono spingere:

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

Recentemente ho usato limitando l'accesso al percorso "/ repo. git/git-receive-pack "per ottenere il risultato che il repository è in lettura e scrittura per alcuni utenti e di sola lettura per altri. In httpd config appare così:

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

    <Location /repo.git/git-receive-pack> 
      Require group developers 
    </Location> 
Problemi correlati