Neulich bin ich beim Durchsehen von Backups auf ein altes Git-Repository gestoßen, dessen Inhalt ich auf meinen privaten Git-Server übertragen wollte. Doch als ich mir das Repo genauer ansah erkannte ich, dass es sich dabei um ein so so genanntes Bare-Repository handelte.
Bare vs. Working – die Unterschiede
Der auf den ersten Blick offensichtlichste Unterschied zwischen einem Bare- und Working-Repository ist die Dateistruktur: Während bei einem Working-Repo sämtliche Git-spezifischen Dateien im Unterordner .git zu finden sind, befinden sich diese Dateien bei einem Bare-Repo direkt im Hauptverzeichnis.
Zudem beinhaltet ein Working-Repository grundsätzlich den so genannten „Working Tree“ bzw. die ausgecheckten Kopien der Projektdateien. Etwas was dem Bare-Repository auf den ersten Blick fehlt. Aber keine Sorge: Die Projektdateien sind selbstverständlich vorhanden, eben nur nicht in editierbarer Form. Außerdem gibt es eine Konvention die besagt, dass der Ordnername eines Bare-Repos grundsätzlich die Endung .git tragen sollte, damit die Art des Repository sofort abgeleitet werden kann.
Der aber mit Abstand wichtigste Unterschied zwischen einem Bare- und Working-Repository ist der Einsatzzweck. Dieser lässt sich – zumindest teilweise – von der Bezeichnung selbst ableiten: Mit Working wird gearbeitet und mit Bare kollaboriert und geteilt. Oder anders ausgedrückt: Ein Bare-Repository stellt immer die Instanz (auf einem Server) dar, von der gecloned und gepullt bzw. zu der gepushed wird, während das Working-Repository hingegen die lokale Kopie ist.
Konvertierung von Bare zu Working
Die Umwandlung eines Bare- in ein Working-Repository kann über unterschiedliche Wege durchgeführt werden. Die wohl bekanntes und meistbenutzte Methode hierfür ist git clone. Hierbei kann das Bare-Repository sowohl lokal als auch von einem Git-Server (wie z.b. GitHub, GitLab, etc.) geklont werden:
> git clone https://github.com/user/repository.git |
Was aber, wenn kein Git-Server zur Verfügung steht und ihr das Bare-Repository nur lokal vorliegen habt? Mit dem Flag -l ist es möglich ein lokales Bare-Repository zu klonen:
> git clone -l bare-repository.git/ working-repository |
Als dritte Möglichkeit gibt es zudem noch den manuellen Weg. Dieser kann hilfreich sein, wenn es sich um ein sehr großes Repository handelt und ihr nur über begrenzten Speicherplatz verfügt. Dabei wird das Bare-Repository nicht über den clone Befehl dupliziert, sondern direkt umgewandelt – was Speicherplatz spart:
> cd bare-repository.git |
> mkdir .git |
> mv HEAD branches config description hooks index info objects refs .git/ |
> git config --local --bool core.bare false |
> git reset --hard |
Warnung: Bei der Verwendung der letzten Variante solltet ihr für den Fall der Fälle ein Backup des Repositories vorliegen haben!