27
Jan
09

Berechtigungen für ein zentrales Git Repository

Mein erstes Git Repository auf dem Server war schnell erstellt:sudo mkdir -p /var/git/netzpiraten.gitcd /var/git/netzpiraten.gitgit –bare init –shared=group… und schon konnte ich loslegen …

git clone ssh://www.netzpiraten.ch/var/git/netzpiraten.gitcd netzpiratentouch testgit add testgit commit -a -m "Adding first file"git push origin master

… und hatte wirklich nie irgend welche Probleme mit dem zentralen Repository auf dem Server.Ein paar Monate später wurden auch in der Firma alle Subversion Repositories auf Git umgestellt und das lief auch ein Weilchen ohne Probleme, bis eines Tages folgende Fehlermeldung aufgetreten ist:

Counting objects: 31, done.Compressing objects: 100% (20/20), done.Writing objects: 100% (22/22), 239.64 KiB, done.Total 22 (delta 7), reused 0 (delta 0)error: unable to write sha1 filename ./objects/1c/1d505f3a585b9e7d298eb9477ab07c5ea79aea: Permission deniedfatal: failed to write objecterror: unpack failed: unpacker exited with error codeTo ssh://git.screenconcept.ch/var/git/repository.git ! [remote rejected] master -> master (n/a (unpacker error))

Also nichts wie auf den Server um das Repository etwas genauer zu inspizieren.Zum Glück konnte der Fehler schnell gefunden werden: Ich hatte vergessen auf den Git Repositories das Setgid Flag zu setzten, womit neue Dateien nicht der Git Gruppe gehörten sondern der Hauptgruppe des Benutzers. Klar das eine anderer Benutzer diese nun nicht einfach so überschreiben kann.Also schnell den Missstand korrigieren:

sudo chown -R :git /var/git
sudo find /var/git -type d | xargs chmod ug+rwx,g+s

… und jetzt kann wieder gemeinsam gearbeitet werden.

Man merke sich also folgendes für das Erstellen eines zentralen Git Repository:
  • Git Repository Verzeichnis erstellen
  • Das Verzeichnis der Gruppe ‘git’ zuweisen
  • Auf dem Verzeichnis das Setgid Flag setzten
  • Git Repository initialisieren

oder anders formuliert

sudo mkdir /var/git/repository.git
sudo chown :git /var/git/repository.git
sudo chmod ug+rwx,g+s /var/git/repository.git
sudo git init --bare /var/git/repository.git

… und nicht vergessen, Git macht am meisten Spass, wenn man auf GitHub teilt.




5 Kommentare zu “Berechtigungen für ein zentrales Git Repository”



  1. Gravatar-Bild 1 Lukas Eppler 29. Jan 2009 um 9:45

    Nach meiner Erfahrung braucht es noch einen Schritt mehr. Remote-Zugriffe erstellen neue Files mit der falschen umask (d.h. nicht schreibbar von anderen Gruppenmitgliedern).

    Die Lösung ist ein /etc/gitconfig mit folgendem Inhalt:

    [core]
    sharedRepository = group

    Das hat damals mein Problem gelöst.

  2. Gravatar-Bild 2 michi 29. Jan 2009 um 9:51

    Danke für den Hinweis, das werde ich gleich ausprobieren!

  3. Gravatar-Bild 3 michi 29. Jan 2009 um 10:01

    Man sollte hat öfters die Hilfe besser studieren:

    git init –help

    --shared[={false|true|umask|group|all|world|everybody|0xxx}]
    Specify that the git repository is to be shared amongst several users. This allows users belonging to the
    same group to push into that repository. When specified, the config variable "core.sharedRepository" is
    set so that files and directories under $GIT_DIR are created with the requested permissions. When not
    specified, git will use permissions reported by umask(2).
    
    group (or true): Make the repository group-writable, (and g sx, since the git group may be not the
    primary group of all users).
    

    Also die globale Konfiguration welche Lukas vorgeschlagen hat, kann man also auch beim Initialisieren pro Repository setzte:

    git init –bare –shared=group

    Danke für den Hinweis Lukas!

  4. Gravatar-Bild 4 Christian 14. Feb 2009 um 12:30

    Hi,

    ich nutze dein Ruby Mailconv script.
    Leider läuft das in einen “memory allocation” Fehler.
    Mein logfile ist “etwas” größer.
    Kann man das irgendie beheben ?
    Habe keine andere Möglichkeit gefunden Dich zu kontaktieren.

    Gruß
    Chris

  5. Gravatar-Bild 5 michi 17. Feb 2009 um 0:08

    Versuch einmal eine andere Schlaufe ans, also z.B. anstatt von

    for line in STDIN.read.split("\n") do

    mal mit

    while line = gets

    versuchen. Vielleicht hilfts was…

Kommentare sind zur Zeit deaktiviert.

März 2010
M D M D F S S
« Jun    
1234567
891011121314
15161718192021
22232425262728
293031  

Werbung


Buttonitis