Wie rufe ich nur einen Zweig eines Remote-Git-Repositorys ab?

246

Ich möchte einen einzelnen Zweig (nicht alle) eines Remote-Repositorys abrufen und einen lokalen Tracking-Zweig erstellen, der weitere Aktualisierungen dieses Remote-Zweigs verfolgen kann. Die anderen Zweige im Remote-Repository sind sehr groß, daher möchte ich vermeiden, sie abzurufen. Wie mache ich das?

Bearbeiten: Ich habe das selbst herausgefunden, aber StackOverflow weigert sich, mich die Antwort als Antwort geben zu lassen, also werde ich sie stattdessen hier in die Frage einfügen.

Sie verwenden die Option -t, um Remote Add zu aktivieren, z.

git remote add -t remote-branch remote-name remote-url

Sie können mehrere " -t branch" Optionen verwenden, um mehrere Zweige zu erfassen.

mellis
quelle
3
Ein Git-Klon ruft das gesamte Repository ab, einschließlich aller Zweige. Sie können flache Kopien erstellen, aber damit können Sie nur die Anzahl der Revisionen angeben, nicht die Zweige.
Ikke
Sicher können Sie Ihre eigene Frage beantworten, warum können Sie nicht?
CharlesB
2
Ich denke, das OP bedeutete, dass er es damals nicht beantworten konnte. StackOverflow legt eine Mindestzeit fest, die vergehen muss, bevor Sie Ihre eigene Frage beantworten können.
Lars Nordin
1
Hallo OP, es könnte jetzt schön sein, jetzt deine Antwort hinzuzufügen. Auf diese Weise können wir darüber abstimmen (und mit anderen Antworten vergleichen)
lulalala
3
Ihr Befehl git remote add fügt einen Remote-Zweig hinzu, was nichts mit dem Abrufen eines Zweigs zu tun hat!
Chris Halcrow

Antworten:

220
git fetch <remote_name> <branch_name>

Hat für mich gearbeitet.

Abdulsattar Mohammed
quelle
13
Ich habe gerade erfahren, dass der abgerufene Zweig wie FETCH_HEADnach dem Abrufen verfügbar ist . Vielen Dank!
Christoph
4
dann git checkout FETCH_HEADzur Kasse
d9k
Simpel und einfach.
Gsumk
Wie bekomme ich <Remote_Name>?
Mrgloom
@mrgloom in den meisten Fällen remote_nameist origin. zB:git fetch origin <branch_name>
Saahithyan Vigneswaran
67

Ein Weg ist der folgende:

git fetch <remotename> <remote branch>:refs/remotes/<remotename>/<local branch>

Dies richtet jedoch kein Tracking ein.

Weitere Informationen finden Sie in der Dokumentation zu git fetch .

EDIT : Wie @ user1338062 Hinweise unten : Wenn Sie nicht bereits über einen lokalen Klon des Repository, in dem Sie den neuen Zweig hinzufügen möchten, aber Sie wollen ein neues lokales Repository erstellen, dann die git clone --branch <branch_name> --single-branch <repo_url>bietet eine kürzere Lösung.

hcs42
quelle
1
Danke, das macht, was die Operation verlangt hat. Um einen Tracking-Zweig Git Checkout zu machen -t <Remote-Zweig> / <Zweig Name> <Zweig Name>
Ken
7
Wenn ich das einfach mache git checkout <branchname>, sehe ich, dass git den Tracking-Zweig automatisch einrichtet, wenn der einzige Zweig mit diesem Namen der Remote-Zweig ist.
Bukzor
1
Dies war das einzige, was für mich funktioniert hat. Obwohl die Konfiguration so eingestellt war, dass nur Refs für einen einzelnen Zweig abgerufen werden, wurden Refs mit Fetch oder Pull in alle Zweige gezogen. Dieser Befehl zog nur den Zweig, den ich wollte, so dass das Repo nur 500 KB und nicht 5 MB groß war. Vielen Dank.
Herostwist
1
Diese Antwort ist wahrscheinlich veraltet. git cloneJetzt unterstützt --branchund --single-branchOptionen, habe ich eine Antwort mit Demonstration gepostet .
user1338062
3
@ user1338062 Dies ist immer noch gültig, wenn Sie nur einen neuen Zweig (nicht alle Zweige mit Git Fetch) nach dem Klonen
abrufen möchten
35

Ich weiß, dass es bereits viele Antworten gibt, aber diese Schritte haben bei mir funktioniert:

  1. git fetch <remote_name> <branch_name>
  2. git branch <branch_name> FETCH_HEAD
  3. git checkout <branch_name>

Diese basieren auf der Antwort von @Abdulsattar Mohammed, dem Kommentar von @Christoph zu dieser Antwort und diesen anderen Fragen zum Stapelüberlauf und ihren Antworten:

MrMadsen
quelle
1
Die nützlichste Antwort hier IMO
Daniel Holmes
31

Um eine vorhandene Fernbedienung zu aktualisieren, um bestimmte Zweige zu verfolgen, verwenden Sie nur:

git remote set-branches <remote-name> <branch-name>

Von git help remote:

set-branches
    Changes the list of branches tracked by the named remote. This can be used to track a subset of the available remote branches
    after the initial setup for a remote.

    The named branches will be interpreted as if specified with the -t option on the git remote add command line.

    With --add, instead of replacing the list of currently tracked branches, adds to that list.
Ikar Pohorský
quelle
1
Erstaunlich, ich war in einem --single-branchRepository und konnte später keine weiteren Zweige herunterladen. Vielen Dank!
Yajo
22

Ein Weg, es zu tun:

In .git / config sollte fetch für das Remote-Repo so eingestellt sein, dass alle Zweige abgerufen werden:

   [remote "origin"]
            fetch = +refs/heads/*:refs/remotes/origin/*

So rufen Sie den Remote-Zweig ab:

git fetch origin branch-name

um einen lokalen Zweig 'Filialname' zu erstellen, der eingerichtet ist, um den 'Zweigstellennamen' des entfernten Zweigs vom Ursprung aus zu verfolgen.

git checkout -b branch-name origin/branch-name

um alle Zweige aufzulisten

git branch -a
klode
quelle
16

Aus dem Beitrag des Autors kopiert:

Verwenden Sie die -tOption git remote add, um z.

git remote add -t remote-branch remote-name remote-url

Sie können mehrere -t branchOptionen verwenden, um mehrere Zweige zu erfassen.

Astronaut
quelle
10
Downvoted, warum antwortest du mit einer vorhandenen Antwort im selben Thread?
Bowen
13

Wenn Sie die Standardeinstellung für "git pull" und "git fetch" so ändern möchten, dass nur bestimmte Zweige abgerufen werden, können Sie .git / config so bearbeiten, dass die Remote-Konfiguration wie folgt aussieht:

[remote "origin"]
  fetch = +refs/heads/master:refs/remotes/origin/master

Dies ruft standardmäßig nur den Master vom Ursprung ab. Weitere Informationen finden Sie unter: https://git-scm.com/book/en/v2/Git-Internals-The-Refspec

BEARBEITEN: Ich habe gerade festgestellt, dass dies dasselbe ist, was die Option -t für git remote add tut. Zumindest ist dies eine gute Möglichkeit, dies nach dem Hinzufügen der Fernbedienung zu tun, wenn Sie die Fernbedienung nicht löschen und mit -t erneut hinzufügen möchten.

ColinM
quelle
1
progit.org/book/ch9-5 Link wurde zu git-scm.com/book/en/Git-Internals-The-Refspec verschoben
hier
8

Der Vollständigkeit halber ist hier ein Beispielbefehl für eine neue Kaufabwicklung:

git clone --branch gh-pages --single-branch git://github.com/user/repo

Wie in anderen Antworten erwähnt, setzt es sich remote.origin.fetchwie folgt zusammen:

[remote "origin"]
        url = git://github.com/user/repo
        fetch = +refs/heads/gh-pages:refs/remotes/origin/gh-pages
user1338062
quelle
5

Git-Version: 2.74

So mache ich es:

git remote add [REMOTE-NAME] [REMOTE-URL]
git fetch [REMOTE-NAME] -- [BRANCH]
Scottalan
quelle
4

Git Version 2.16.1.windows.4

Es reicht aus, nur einen Git-Abruf von remoteRepositoryName branchName durchzuführen (eg: git fetch origin my_local_branch) . Der Abruf wird durchgeführt und ein neuer lokaler Zweig mit demselben Namen wird erstellt, und die Verfolgung wird auf Remote-Zweig gesetzt.

Führen Sie dann git checkout branchName aus

Karthikeyan Mohan
quelle
Der Zweig erscheint erst unter, git branchwenn Sie ihn
auschecken
3

Meine Problemumgehungen:

git fetch --depth=1
git checkout <branch_name>

Wenn Sie keinen lokalen Klon haben:

git clone --depth 1 -b <branch_name> <repo_url>
liy
quelle
3
  1. Wählen <remote_name>Sie eine aus, die Sie verwenden möchten (verwenden Sie sie origin und überspringen Sie Schritt 1.)
  2. git remote add <remote_name> <remote_url>
  3. git fetch <remote_name> <branch>
  4. Wählen <your_local_branch_name>Sie eine aus, die Sie verwenden möchten. Könnte das gleiche sein wie <branch>.
  5. git checkout <remote_name>/<branch> -b <your_local_branch_name>

Hoffentlich hilft das!

Lukasz Czerwinski
quelle
1

Die Antwort hängt tatsächlich von der aktuellen Liste der Tracking-Zweige ab, die Sie haben. Sie können einen bestimmten Zweig git fetch <remote_name> <branch_name> nur dann von Remote abrufen, wenn sich der Zweig bereits in der Liste der Verfolgungszweige befindet (Sie können ihn mit überprüfen git branch -r).

Nehmen wir an, ich habe die Fernbedienung zuvor mit der Option --single-branch geklont, und in diesem Fall ist der einzige Tracking-Zweig, den ich habe, der "geklonte". Ich bin ein wenig verwirrt über die Ratschläge, die Git-Konfiguration manuell zu optimieren sowie git remote add <remote_name> <remote_url>Befehle einzugeben. Da "git remote add" eine neue Fernbedienung einrichtet, funktioniert dies offensichtlich nicht mit dem vorhandenen Remote-Repository. Die Bereitstellung von "-t branch" -Optionen hat mir nicht geholfen.

Falls die Fernbedienung vorhanden ist und der Zweig, den Sie abrufen möchten, in dieser Fernbedienung vorhanden ist:

  1. Überprüfen git branch -rSie, ob Sie diesen Zweig als Tracking-Zweig sehen können. Wenn nicht (wie in meinem Fall mit einem einzelnen Zweigklon), fügen Sie diesen Zweig der Tracking-Zweigliste hinzu, indem Sie "git remote set-branch" mit der Option --add verwenden:

    • git remote set-branches --add <remote_name> <branch_name>
  2. Jetzt können Sie einen bestimmten Zweig abrufen (hier andere Antworten duplizieren):

    • git fetch <remote_name> <branch_name>
  3. Und erstellen und checken Sie einen neuen lokalen Zweig mit "checkout --track", der den gleichen "branch_name" wie ein Tracking-Zweig erhält:

    • git checkout --track <remote_name>/<branch_name>
AlexK
quelle
0

Der einfachste Weg, das zu tun

  git fetch origin <branch> && git checkout <branch>

Beispiel: Ich möchte einen Zweig vom Ursprung abrufen und zu diesem als aktuellem Arbeitszweig wechseln.

   git fetch origin uat && git checkout uat
Amitesh
quelle