Tooling Laravel

Laravel Forge: Kein Branch- oder Remote-Wechsel möglich

Chris
Geschäftsführer, PHP Senior-Entwickler
Aktualisiert:
Laravel Forge.

Beim Wechsel des Git-Remotes oder des deployten Branches über Laravel Forge tritt regelmäßig ein hartnäckiges Problem auf: Das auf dem Server geklonte Repository erkennt den neuen Branch nicht.

Das Deployment schlägt fehl oder verwendet weiterhin den alten Branch. Die Ursache liegt in einer zu eng gesetzten remote.origin.fetch-Konfiguration.

Die offizielle Laravel-Forge-Dokumentation erwähnt diesen Fall nicht und behandelt den Branch-Wechsel als reine Dropdown-Auswahl.

Wann tritt das Problem auf?

  • Sie haben in Forge das Repository oder den Branch der Site umgestellt.

  • Das Deployment-Script meldet Fehler wie "pathspec did not match any file(s) known to git" oder Forge zieht weiterhin Commits aus dem alten Branch.

  • Ein manueller git fetch auf dem Server zieht keine anderen Branches als den ursprünglich konfigurierten.

Warum erkennt der Server den neuen Branch nicht?

Forge legt das Repository auf dem Server häufig mit einer eingeschränkten Refspec an, die nur den ursprünglich gewählten Branch berücksichtigt. Diese Refspec wird in der lokalen .git/config als remote.origin.fetch hinterlegt. Wenn Sie später über die Forge-Oberfläche den Branch oder das Remote umstellen, passt Forge die Site-Konfiguration an.

Die Fetch-Regel im Repository auf dem Server bleibt jedoch unverändert. Das Ergebnis: git fetch holt nichts außer dem ursprünglich konfigurierten Branch.

Wie prüfen Sie die aktuelle Konfiguration?

Verbinden Sie sich per SSH mit dem Forge-Server, wechseln Sie in das Verzeichnis der Site und prüfen Sie die aktuell gesetzte Refspec:

git config --get remote.origin.fetchLanguage:shell

Ein eingeschränktes Setup gibt zum Beispiel folgende Zeile zurück:

+refs/heads/private_dev_branch:refs/remotes/origin/private_dev_branchLanguage:shell

In diesem Fall fetcht git ausschließlich den ursprünglich gewählten Branch. Alle weiteren Branches des Repositories bleiben für den Server unsichtbar.

Wie beheben Sie das Problem?

Setzen Sie die Refspec auf das Standard-Pattern, das alle Branches einschließt:

git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"Language:shell

Anschließend prüfen Sie das Ergebnis:

git config --get remote.origin.fetchLanguage:shell

Erwartete Ausgabe:

+refs/heads/*:refs/remotes/origin/*Language:shell

Ein abschließender git fetch origin --prune aktualisiert alle Branches. Danach lässt sich der neue Branch über das Deployment in Forge oder direkt per git checkout <branch-name> auswählen.

Wie lässt sich das künftig vermeiden?

Falls absehbar ist, dass die Site mehrere Branches benötigt oder das Remote später wechselt, lohnt es sich, die Refspec direkt nach dem Provisionieren auf das Standard-Pattern zu setzen.

Das verhindert genau dieses Problem im weiteren Lebenszyklus des Servers. Bei längerfristig betriebenen Projekten dokumentieren wir den Schritt zusammen mit den weiteren Server-Konfigurationen, damit er auch bei Übergaben nicht verloren geht.