Der flache Git-Klon (Klon - Tiefe) verfehlt entfernte Zweige

97

Nach dem Klonen eines Remote-Repositorys wird keine Remote-Verzweigung mit der Option -a angezeigt. Was könnte das Problem sein? Wie kann ich es debuggen? In diesem Snippet werden zwei der entfernten Zweige nicht angezeigt:

$ git clone --depth 1 git://git.savannah.gnu.org/pythonwebkit.git
$ cd pythonwebkit
$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
$ git --version
git version 1.8.3.1

Versuchte den gleichen Befehl auf einem anderen Computer, es funktioniert gut:

$ git clone --depth 1 git://git.savannah.gnu.org/pythonwebkit.git
Receiving objects: 100% (186886/186886), 818.91 MiB | 3.44 MiB/s, done.
$ cd pythonwebkit/
$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/debian
  remotes/origin/master
  remotes/origin/python_codegen
$ git --version
git version 1.7.1

Versucht auch ein anderes Repo zu klonen, es funktioniert gut. Ich kann es zwar noch einmal auf dieser Maschine versuchen, aber es wäre besser zu wissen, was los ist.

Anregungen oder Hinweise sind herzlich willkommen.

Bearbeiten: Antwortzusammenfassung: Seit Git-Version 1.8.3.2 müssen "--depth" und "--no-single-branch" zusammen verwendet werden, um das gleiche Verhalten wie zuvor zu erzielen. Dies wird als Fehlerbehebung angesehen.

Minghua
quelle
3
masterist Ihre lokale Niederlassung. remotes/origin/masterist der entsprechende Remote-Zweig. Was genau ist die Frage?
Michas
1
Hast du vielleicht die Ausführlichkeit vergessen? Versuchen Siegit branch -avv
bis
Zu michas usw .: Wir bezeichnen den Meister normalerweise nicht als Zweig, entschuldigen Sie die Verwirrung. hinzugefügt "zwei entfernte Zweige werden nicht angezeigt". Zu jthill: Danke für die Erinnerung, Sie haben Recht.
Minghua
1
Vielen Dank für die Einführung git clone --depth=1 --no-single-branch, das ist es, was ich in den meisten Fällen brauche.
Alireza Mohamadi

Antworten:

62

Das Verhalten ist korrekt. Nach der letzten Überarbeitung ist der Hauptzweig (da dies der HEAD der primären Fernbedienung ist) der einzige Fernzweig im Repository:

florianb$ git branch -a
        * master
          remotes/origin/HEAD -> origin/master
          remotes/origin/master

Der vollständige Klon bietet neue (alle) Zweige:

florianb$ git branch -a
        * master
          remotes/origin/HEAD -> origin/master
          remotes/origin/debian
          remotes/origin/master
          remotes/origin/python_codegen

Flache Klone

Aufgrund der flachen Beschreibung in der technischen Dokumentation führt ein git-clone --depth 20 repo[...] Ergebnis zu Festschreibungsketten mit einer Länge von höchstens 20. Ein flacher Klon sollte daher die angeforderte Tiefe der Commits von der Spitze eines Zweigs enthalten.

Wie - zusätzlich - beschreibt die Dokumentation git clonefür die --single-branchOption:

"Klonen Sie nur den Verlauf, der zur Spitze eines einzelnen Zweigs führt, entweder angegeben durch die --branchOption oder durch die HEADPunkte der primären Verzweigungsfernbedienung . Wenn Sie einen flachen Klon mit der --depthOption erstellen , ist dies die Standardeinstellung, es --no-single-branchsei denn, Sie geben den Verlauf in der Nähe des an Tipps aller Branchen. "

Daher ist ein flacher Klon ( mit der Tiefe -option) nur holt nur einen einzigen Zweig (in Ihrer gewünschten Tiefe).


Leider waren beide Optionen ( --depthund --single-branch) in der Vergangenheit fehlerhaft und die Verwendung von flachen Klonen führt zu ungelösten Problemen (wie Sie in dem oben veröffentlichten Link lesen können), die durch das gegebene Umschreiben des Verlaufs verursacht werden. Dies führt in besonderen Fällen insgesamt zu einem etwas komplizierten Verhalten.

Florian Breisch
quelle
1
florianb: was ist deine git version? Danke, dass du es ausprobiert hast. Ich habe die --depth 1 auf 1.7.1 gemacht, gerade jetzt werden alle entfernten Zweige angezeigt. hat die Frage damit aktualisiert. +1 zur Überprüfung des Problems.
Minghua
1
@minghua: Ich verwende 1.8.4 - ich werde eine kleine Untersuchung durchführen, wenn es einen Patch zu diesem Problem gibt.
Florian Breisch
1
@minghua: Ich habe bearbeitet, um neue Erkenntnisse über "flache Klone" zu reflektieren.
Florian Breisch
1
Es ist fast perfekt, bis auf eines: Was bedeutet es, wenn man sagt "der Repo-Besitzer hat beschlossen, die anderen Zweige abzuschneiden"? Ich denke, diese Zweige sind immer noch da.
Minghua
2
--no-single-branch klont auch alle Tags. Wir können dies vermeiden, indem wir ein neues Repo erstellen und dieselbe Konfiguration verwenden, um alle Fernbedienungen abzurufen, dh fetch = +refs/heads/*:refs/remotes/origin/*und git fetch --depth 1ohne (ohne --tags). Wir können auch bestimmte Tags hinzufügen, die mit config like abgerufen werden sollen fetch = +refs/tags/v2.0.0:refs/tags/v2.0.0.
Sam Watkins
204

Nachdem Sie einen flachen Klon erstellt haben, um andere Zweige von einem entfernten Standort aus überprüfen zu können ,

  1. Run (danke @jthill):

    git remote set-branches origin '*'
    
  2. Danach machen Sie eine git fetch -v

  3. Schließlich git checkout the-branch-i-ve-been-looking-for


Schritt 1 kann auch manuell durch Bearbeiten ausgeführt werden .git/config.

Ändern Sie beispielsweise die folgende Zeile von:

fetch = +refs/heads/master:refs/remotes/origin/master

zu (ersetzen masterdurch *):

fetch = +refs/heads/*:refs/remotes/origin/*
Marlo
quelle
57
Sie können auch git remote set-branches origin '*'für alle Zweige verwenden, ersetzen Sie den *durch einen Zweignamen für einen.
Bis zum
Danke dir! Das hat mir den Tag gerettet.
Steven Xu
Was -vvvbedeutet in git fetch -vvv? Ich kann keine Informationen darüber in git-fetch doc finden
guo
@guo ist es für die verbosityoder debugProtokollierungsstufe von git. Es ist nicht von der fetchMethode.
Marlo
1
@ kawing-chiu Dies ist nützlich, wenn Sie so viele Filialen haben und die Größe für die 'Internetverbindung' vorher zu groß ist und es sich jetzt leisten könnte, all diese Filialen zu bekommen. :)
Marlo
61

Nach dem Lesen der Antworten und des Kommentars von @jthill war es für mich set-branchesam besten, die Option für den git remoteBefehl zu verwenden:

$ git clone --depth 1 https://github.com/dogescript/dogescript.git
$ git remote set-branches origin 'remote_branch_name'
$ git fetch --depth 1 origin remote_branch_name
$ git checkout remote_branch_name

Dadurch wird die Liste der von der genannten Fernbedienung verfolgten Zweige geändert, sodass nur der erforderliche Zweig abgerufen und ausgecheckt werden kann.

alejandrodnm
quelle
14
Es ist möglicherweise besser git remote set-branches --add origin 'remote_branch_name', den neuen Zweig zusätzlich zu den vorhandenen zu verwenden, als ihn in der Liste der Zweige (oder Verzweigungsmuster) der Fernbedienung zu ersetzen, die in der .git / config-Datei abgerufen werden sollen.
Dumbledad
2
OMG, das einfache Zitat 'ist wichtig ingit remote set-branches --add origin 'remote_branch_name'
Wochenende
@Weekend Ich konnte das nicht zum Laufen bringen, bis ich die einzelnen Anführungszeichen
weggelassen habe
@PandaWood Sie sind wahrscheinlich unter Windows. Das "$" -Zeichen in der Antwort impliziert Bash (unter Unix oder Cygwin / MSYS).
Yongwei Wu