Layer 8Ehrlicher Tech-Support

git clone --depth: Andere Zweige fehlen, Log hat einen Commit

Nach einem flachen Klon kennt Git nur einen Zweig und einen Commit. Die Option --depth schaltet stillschweigend --single-branch mit ein.

Aufwand:
ca. 10 Min.
Voraussetzung:
Ein Terminal mit git, Netzzugang zum entfernten Repository, Die CI-Konfiguration, falls der Klon dort entstanden ist
Gilt für:
Git 2.54.0 (Dokumentation von git-clone und git-fetch auf git-scm.com, Stand 17.10.2026)

Das Symptom

Ein Repository wurde geklont, der Hauptzweig ist da, der Build läuft. Dann soll ein zweiter Zweig ausgecheckt werden, und Git kennt ihn nicht. git branch -r zeigt genau einen entfernten Zweig. git log endet nach einem Commit, obwohl das Projekt Jahre alt ist. Ein Werkzeug, das die Versionsnummer aus der Zahl der Commits ableitet, meldet Version 1. git fetch ändert nichts daran, und der Kollege sieht in seinem Klon alle Zweige und die ganze Geschichte.

Typischer Fundort: eine CI-Pipeline oder ein Deploy-Skript, in dem irgendwann jemand –depth 1 ergänzt hat, damit der Klon schneller geht. Oder eine Umgebung, die das als Voreinstellung mitbringt.

Die „Layer 8“-Wahrheit

Die Option –depth tut zwei Dinge, von denen nur eines im Namen steht. Die Dokumentation von git clone formuliert es ohne Umschweife: „Create a shallow clone with a history truncated to the specified number of commits. Implies –single-branch unless –no-single-branch is given to fetch the histories near the tips of all branches.“ Wer die Geschichte auf einen Commit kürzt, bekommt also ungefragt auch einen Klon, der nur einen Zweig kennt. Das ist seit Langem so dokumentiert, es liest nur niemand die Beschreibung einer Option, deren Name so eindeutig klingt.

Die zweite Hälfte ist die, die später beißt. –single-branch beschränkt nicht nur den ersten Klon, sondern prägt die Konfiguration des Remotes: „Further fetches into the resulting repository will only update the remote-tracking branch for the branch this option was used for the initial cloning.“ Deshalb bleibt git fetch wirkungslos, wenn es um andere Zweige geht. Der Server hat sie, der Klon fragt nicht danach. Sichtbar wird das in remote.origin.fetch, wo statt des gewohnten Musters mit Stern ein einzelner Zweigname steht.

Für die fehlende Tiefe gibt es ein dokumentiertes Gegenmittel. git fetch –unshallow macht laut Dokumentation von git fetch aus einem flachen Repository ein vollständiges, „removing all the limitations imposed by shallow repositories“, sofern die Quelle selbst vollständig ist. Wer weniger braucht, nimmt –deepen, das die Grenze von der aktuellen flachen Kante aus um eine Anzahl Commits verschiebt, oder –depth, das vom Spitzencommit aus neu zählt. Ein Detail aus derselben Seite, das bei Release-Werkzeugen wichtig wird: Tags für die nachgeholten Commits werden dabei nicht mitgeholt.

Für die fehlenden Zweige gibt es dagegen keinen Schalter, der das Ein-Zweig-Verhalten nachträglich aufhebt. Entweder holt man einzelne Zweige mit einer Refspec, setzt die Fetch-Zeile des Remotes wieder auf das Muster für alle Köpfe, oder man klont neu und gibt diesmal –no-single-branch mit, was die Dokumentation genau für diesen Zweck nennt.

Die eigentliche Lehre steht im ersten Satz des Zitats: Eine Option, die Zeit spart, spart sie, indem sie etwas weglässt. Ein flacher Klon ist zum Bauen gedacht, nicht zum Entwickeln und nicht zum Vergleichen von Zweigen. Wer in der CI damit arbeitet und später einen Vergleich zum Hauptzweig oder eine Versionsnummer aus der Geschichte braucht, holt gezielt nach, was fehlt, statt sich über einen Server zu wundern, der alles hat, was nicht geholt wurde.

Die echte, verifizierte Lösung

1000 % faktenbasiert. Jeder Befehl ist real, jeder Pfad existiert. Schritt für Schritt:

  1. 1.

    Den Zustand des Klons feststellen

    Drei Befehle zeigen, woran man ist. git rev-parse --is-shallow-repository gibt true aus, wenn der Klon flach ist. git branch -r listet die bekannten entfernten Zweige; nach einem Klon mit --depth steht dort meist nur einer. git config --get-all remote.origin.fetch zeigt, welche Zweige ein fetch überhaupt holt; steht dort ein einzelner Zweigname statt eines Musters mit Stern, ist der Remote auf einen Zweig beschränkt. Damit ist klar, dass der Server nichts verbirgt, sondern der Klon so angelegt wurde.

    git rev-parse --is-shallow-repository
    git branch -r
    git config --get-all remote.origin.fetch
    
  2. 2.

    Geschichte vervollständigen

    git fetch --unshallow wandelt den flachen Klon in einen vollständigen um, sofern das Quell-Repository selbst vollständig ist. Danach kennt das Repository alle Commits des bereits konfigurierten Zweigs. Wer nur ein Stück mehr braucht, etwa für einen Vergleich mit dem Stand von vor hundert Commits, nimmt --deepen=100 und vermeidet den vollen Download. Beides betrifft nur die Tiefe; welche Zweige geholt werden, bleibt davon unberührt.

    git fetch --unshallow
    git rev-parse --is-shallow-repository
    
  3. 3.

    Fehlende Zweige holen

    Die Beschränkung auf einen Zweig steckt in der Fetch-Konfiguration des Remotes. Ein einzelner Zweig lässt sich mit einer Refspec gezielt nachholen, ohne die Konfiguration anzufassen. Sollen künftig alle Zweige kommen, muss die Fetch-Zeile des Remotes wieder auf das übliche Muster gesetzt werden, das alle Köpfe unter refs/remotes/origin/ einträgt. Danach holt ein gewöhnliches git fetch alle Zweige, wie es ein normaler Klon von Anfang an täte.

    git fetch origin feature-x:refs/remotes/origin/feature-x
    git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'
    git fetch origin
    
  4. 4.

    Beim nächsten Mal bewusst entscheiden

    Wer die Geschichte kürzen, aber alle Zweige behalten will, gibt beides an: --depth für die Tiefe und --no-single-branch gegen die Zweigbeschränkung. Die Dokumentation nennt diese Kombination ausdrücklich, um die Geschichte nahe der Spitzen aller Zweige zu holen. Für Submodule gilt die Tiefe nicht automatisch; dafür gibt es --shallow-submodules. In CI-Konfigurationen lohnt der Blick, welche Tiefe das Werkzeug voreinstellt, denn dort stammt der flache Klon meist her, ohne dass jemand die Option je getippt hat.

    git clone --depth 50 --no-single-branch <adresse> projekt
    

Häufige Fragen (FAQ)

?Warum zeigt git branch -r nach dem Klonen nur einen einzigen Zweig?

Weil der Klon mit --depth erzeugt wurde, und diese Option laut Dokumentation von git clone mehr tut, als nur die Geschichte zu kürzen: „Create a shallow clone with a history truncated to the specified number of commits. Implies --single-branch unless --no-single-branch is given to fetch the histories near the tips of all branches.“ Ein flacher Klon ist also standardmäßig auch ein Ein-Zweig-Klon. Dass nur ein Zweig sichtbar ist, ist deshalb keine Störung auf dem Server, sondern die dokumentierte Folge der Option, die jemand in die CI-Konfiguration oder das Skript geschrieben hat.

?Ich habe git fetch ausgeführt, die anderen Zweige kommen trotzdem nicht. Warum?

Weil --single-branch nicht nur den ersten Klon betrifft, sondern die Konfiguration des Remotes. Die Dokumentation sagt dazu: „Further fetches into the resulting repository will only update the remote-tracking branch for the branch this option was used for the initial cloning.“ Ein gewöhnliches git fetch holt also weiterhin nur diesen einen Zweig. Wer andere Zweige braucht, muss die Fetch-Konfiguration des Remotes erweitern oder neu klonen; die Option --unshallow allein löst dieses Problem nicht, denn sie betrifft die Tiefe, nicht die Zweigauswahl.

?Wie bekomme ich die vollständige Geschichte zurück?

Mit git fetch --unshallow. Die Dokumentation von git fetch beschreibt die Option so: „If the source repository is complete, convert a shallow repository to a complete one, removing all the limitations imposed by shallow repositories.“ Ist das Quell-Repository selbst flach, holt Git so viel wie möglich, damit beide dieselbe Geschichte haben. Wer nicht alles braucht, kann mit git fetch --deepen=<n> die Grenze um eine Anzahl Commits verschieben oder mit --depth=<n> die Tiefe vom aktuellen Spitzencommit aus neu setzen; laut Dokumentation werden Tags für die nachgeholten Commits dabei nicht mitgeholt.

?Wofür ist --depth dann überhaupt gut?

Für Klone, die nur bauen und nicht entwickeln sollen. Eine CI-Pipeline, die ein Projekt mit zehntausend Commits bei jedem Lauf vollständig klont, verschwendet Zeit und Speicher; ein flacher Klon mit einem Commit genügt zum Bauen. Die Nebenwirkungen sind genau die, um die es hier geht: nur ein Zweig, nur wenige Commits, keine vollständige Geschichte für Werkzeuge, die Versionsnummern aus der Zahl der Commits ableiten oder einen Vergleich zum Hauptzweig ziehen wollen. Wer das in einem Klon braucht, lässt --depth weg oder holt die Geschichte gezielt nach.

Belege

Diese Seite ist gegen die folgenden Primärquellen geprüft – Hersteller, Standard oder Gesetzestext. Wer es nicht glaubt, muss es nicht: Da steht, wo es nachzulesen ist.

Zuletzt geprüft am . Dokumentation altert – ein Datum daneben ist der einzige ehrliche Umgang damit.

Auch zu finden unter

Verwandte Fehler

SWAnfängerfehlerfatal: not a git repository

git: fatal: not a git repository

git meldet 'fatal: not a git repository (or any of the parent directories)'? Du bist im falschen Ordner oder .git fehlt. So kommst du zurück ins Repo.

SWLästigNot possible to fast-forward, aborting.

git pull: Not possible to fast-forward, aborting

git pull bricht ab, sobald eigener und entfernter Zweig auseinandergelaufen sind. Laut Git 2.55 ist --ff-only die Voreinstellung, nicht der Merge.