Artikelformat

Mehrere Git-Repositorys bei Uberspace

Uberspace ist ja ein toller Hoster. Aber manchmal wünscht man sich doch etwas mehr Konfigurationsmöglichkeiten, so wie man sie von (virtual) dedicated Servern kennt. So wollte ich letztens™ neben der normalen Website (unter /var/www/virtual/username/html) noch ein paar Subdomains haben, in denen ich andere Projekte hoste. Natürlich alle mit Git verwaltet. Eigentlich kein Problem, zumindest wenn man das .git-Verzeichnis zusammen mit den öffentlich sichtbaren Dateien speichert. Also so:

/var/www/virtual/username/html/.git
/var/www/virtual/username/html/index.html
/var/www/virtual/username/html/bild.gif

Nun ist das aber nicht eben gerade die feine englische Art, das .git-Verzeichnis dort mit reinzuwerfen, denn das hat in einem öffentlichen Ordner nichts verloren. Auch die Absicherung per .htaccess gegen Zugriff auf diese Datei macht nur begrenzt Freude.

Also einfach das Verzeichnis eine Ebene höher legen. Blöd nur, daß dieses Verzeichnis ja immer .git heißt und dann spätestens beim zweiten Git-verwalteten Projekt zum Problem wird:

/var/www/virtual/username/html
/var/www/virtual/username/.git
(.git-Ordner aus dem Verzeichnis html)
/var/www/virtual/username/subdomain.domain.tld
/var/www/virtual/username/.git
(.git-Ordner aus dem Verzeichnis subdomain.domain.tld)

Und schon ist die Lösung hinfällig, denn 2 .git-Ordner im selben Verzeichnis sind schwierig zu vereinbaren.

Also was tun? Lange Rede, kurzer Sinn: Die Verzeichnisse müssen umbenannt werden – aber so, daß Git etwas davon mitbekommt und hinterher sein Working Tree wiederfindet (und umgekehrt). Wie das gehen soll, hat mir Christopher vom Uberspace-Support teilweise gezeigt, und den Rest war dann auch schnell getan:

  1. Neues Verzeichnis auf dem Uberspace erstellen. Ich habe im Home-Directory (also unter /home/username) den Ordner repos erstellt.
  2. Die .git-Ordner nacheinander erst umbenennen und dann in das unter (1) erstellte Verzeichnis verschieben. Beispiel:
    /home/username/repos/projekt1.git
    /home/username/repos/projekt2.git
  3. In die eben kopierten Verzeichnisse wechseln und dort die config-Datei bearbeiten. Unter [core] muss eine neue Zeile eingefügt werden, welche den Pfad zum Working Tree angibt. Beispiel:
    worktree = /var/www/virtual/username/html
    Somit weiß Git schonmal, wo der Working Tree ist. Umgekehrt weiß der Working Tree aber noch nicht, wo das Git-Repository ist.
  4. In den Working Tree wechseln und eine Datei .git anlegen. Inhalt ist eine einzelne Zeile mit dem Pfad zum Git-Repository. Beispiel:
    /var/www/virtual/username/html/.git (Dateispeicherort)
    gitdir: /home/username/repos/projekt1.git (Dateiinhalt)
  5. Fertig!

Nun konnte ich in das Verzeichnis /home/username/repos/projekt1.git wechseln und von dort wie gewohnt alle Git-Befehle ausführen, z.B. zum Test ein git log --oneline.

Natürlich hätte ich den ersten Schritt (extra Verzeichnis für alle Repositorys) auch weglassen können und das Repository einfach nur umbenennen und eine Ebene höher schieben können. Aber so ein zentraler Ort ist mir lieber.