Wie klone ich einen einzelnen Zweig in Git?

799

Ich habe ein lokales Git-Repository namens "Skeleton", das ich zum Speichern von Projektskeletten verwende. Es gibt einige Niederlassungen für verschiedene Arten von Projekten:

casey@agave [~/Projects/skeleton] git branch
* master
  rails
  c
  c++

Wenn ich den Hauptzweig nach einem neuen Projekt durchsuchen möchte, kann ich dies tun

casey@agave [~/Projects] git clone skeleton new
Initialized empty Git repository in /Users/casey/Projects/new/.git/

und alles ist so wie ich es will. Insbesondere zeigt der neue Hauptzweig auf den Hauptzweig des Skeletts, und ich kann drücken und ziehen, um Änderungen am grundlegenden Projekt-Setup zu verschieben.

Was jedoch nicht funktioniert, ist, wenn ich einen anderen Zweig klonen möchte. Ich kann es nicht bekommen, so dass ich nur den gewünschten Zweig ziehe, zum Beispiel den railsZweig, und dann hat das neue Repository einen Zweig, der standardmäßig masterzum railsZweig des Skelett-Repositorys pusht und von diesem zieht .

Gibt es einen guten Weg, dies zu tun? Oder vielleicht möchte Git nicht, dass ich die Dinge so strukturiere, und dafür bin ich auf jeden Fall offen. Vielleicht sollte ich mehrere Repositorys haben, wobei das Ruby on Rails-Skelett-Repository das Master-Skelett-Repository verfolgt? Und jedes einzelne Projekt, das das Ruby on Rails-Skelett-Repository klont.

Casey Rodarmor
quelle
Was git branch -azeigt?
Jakub Narębski
3
Würde git checkout -b newbranch origin/branchiwantbesser funktionieren? (ohne die --trackOption)
VonC
3
Ich denke, was Sie dort versuchen, ist eine schlechte Idee. Verwenden Sie unterschiedliche Repositorys für unterschiedliche Projekte. Zweige sind etwas ganz anderes.
InnaM
@Manni, ich dachte das irgendwie, da git nicht zu mögen schien, was ich tue. Kannst du erklären warum? Liegt es daran, dass Zweige nicht lange leben sollten?
Casey Rodarmor
1
@rodarmor Ich denke, was Sie dort versuchen, ist eine gute Idee, und ich hatte genau diese Frage.
Paul Du Bois

Antworten:

863

Hinweis: Mit git1.7.10 (April 2012) können Sie tatsächlich nur einen Zweig klonen :

# clone only the remote primary HEAD (default: origin/master)
git clone --single-branch

as in:
git clone <url> --branch <branch> --single-branch [<folder>]

Sie können es sehen in t5500-fetch-pack.sh:

test_expect_success 'single branch clone' '
  git clone --single-branch "file://$(pwd)/." singlebranch
'

Tobu kommentiert :

Dies ist implizit, wenn ein flacher Klon erstellt wird.
Dies ist git clone --depth 1der einfachste Weg, um Bandbreite zu sparen.

Und seit Git 1.9.0 (Februar 2014) unterstützen flache Klone die Datenübertragung (Push / Pull), sodass diese Option jetzt noch nützlicher ist.
Weitere Informationen finden Sie unter " Ist git clone --depth 1(flacher Klon) nützlicher als es sich herausstellt? ".


Das "Rückgängigmachen" eines flachen Klons wird unter " Konvertieren eines flachen Klons in einen vollständigen Klon " (git 1.8.3+) beschrieben.

# unshallow the current branch
git fetch --unshallow

# for getting back all the branches (see Peter Cordes' comment)
git config remote.origin.fetch refs/heads/*:refs/remotes/origin/*
git fetch --unshallow

Wie Chris kommentiert:

Die magische Linie, um fehlende Zweige umzukehren, --single-branchlautet (git v2.1.4):

git config remote.origin.fetch +refs/heads/*:refs/remotes/origin/*
git fetch --unshallow  

Mit Git 2.26 (Q1 2020) verwendet " git clone --recurse-submodules --single-branch" jetzt beim Klonen der Submodule dieselbe Option für einzelne Zweige .

Siehe Commit 132f600 , Commit 4731957 (21. Februar 2020) von Emily Shaffer ( nasamuffin) .
(Zusammengeführt von Junio ​​C Hamano - gitster- in Commit b22db26 , 05. März 2020)

clone: pass --single-branch während --recurse-submodules

Abgemeldet von: Emily Shaffer
Bestätigt von: Jeff King

Zuvor führte das Ausführen von " git clone --recurse-submodules --single-branch" dazu, dass Submodule alle Zweige klonierten, obwohl das Superprojekt nur einen Zweig klonierte.

Führen Sie --single-branchdas Submodul-Helfer-Framework durch, um es clonespäter auf " " zu bringen.

VonC
quelle
80
git clone <url> --branch <branch> --single-branch <folder>klappt wunderbar.
Alexander
1
Ja, ich denke, es ist Zeit, die akzeptierte Antwort zu aktualisieren :) Dies funktioniert "wie ein Zauber"
Kumarharsh
5
Dies ist auch implizit, wenn ein flacher Klon erstellt wird. Dies ist clone --depth 1der einfachste Weg, um Bandbreite zu sparen.
Tobu
1
@Tobu und VonC --depth 1sind für den Benutzer unsicher, da sie möglicherweise mit dem neuen Klon tatsächlich drücken / ziehen möchten.
nmr
2
Um die vollständige Korrektur von Peter Cordes zu formulieren, --single-branchlautet die magische Linie, um fehlende Zweige umzukehren, git config remote.origin.fetch +refs/heads/*:refs/remotes/origin/*und git fetch --unshallow(git v2.1.4)
Chris
670

Eine Möglichkeit besteht darin, Folgendes auszuführen.

git clone user@git-server:project_name.git -b branch_name /your/folder

Wo branch_nameist der Zweig Ihrer Wahl und "/ your / folder" ist der Zielordner für diesen Zweig. Es ist wahr, dass dies andere Zweige bringt, die Ihnen die Möglichkeit geben, hin und her zu verschmelzen.

Aktualisieren

Ab Git 1.7.10 können Sie dies jetzt tun

git clone user@git-server:project_name.git -b branch_name --single-branch /your/folder
Alex Nolasco
quelle
36
Dies funktioniert, aber es holt alle Zweige. Siehe @ frerich = raabes Antwort unten.
cdunn2001
3
Danke. füge in meinem Fall nur "-b branch_name" hinzu. Das hat mir viel Zeit gespart.
PhatHV
Ja es funktioniert perfekt ...! Ich bin eher eine TFS-Person und habe für meine persönlichen Projekte Git verwendet. Wrto git branching, ich habe es früher falsch gemacht und gut, diese einfache Methode zu kennen und sie scheint perfekt zu sein! Danke noch einmal! Bereits + 1 würde, wenn möglich würde ich +100 geben :)
k25
11
Sie können auch hinzufügen --single-branch, um nur den diesem Zweig zugeordneten Verlauf anstelle aller im Repository enthaltenen Verlaufsdaten und Tags abzurufen.
Fehler am
1
@AlexNolasco Kannst du bitte die Antwort bearbeiten und sagen, was ist / some / Ordner ? Vielen Dank
Nabin
112

Unter Verwendung von Git Version 1.7.3.1 (unter Windows) mache ich Folgendes ( $BRANCHist der Name des Zweigs, den ich auschecken möchte, und $REMOTE_REPOdie URL des Remote-Repositorys, von dem ich klonen möchte):

mkdir $BRANCH
cd $BRANCH
git init
git remote add -t $BRANCH -f origin $REMOTE_REPO
git checkout $BRANCH

Der Vorteil dieses Ansatzes besteht darin, dass nachfolgende git pull(oder git fetch) Aufrufe auch nur den angeforderten Zweig herunterladen.

Frerich Raabe
quelle
Was ist der Unterschied zwischen Ihrem Skript und dieser Zeile? git clone -b $BRANCH $REMOTE_REPO $BRANCHafik sie sind die gleichen?
Ian Vaughan
12
@ Ian: Ein Unterschied besteht darin, dass git clone -bSie alle Remote-Refs (alle Remote-Zweige und -Tags) wie git branch -agezeigt erhalten. Mit meinem Skript erhalten Sie nur eine einzige Referenz.
Frerich Raabe
1
Wenn ich das oben genannte versuche (sagen wir mit $ BRANCH = "nick"), werde ich 'fatal: Remote Ref Refs / Heads / Nick' konnte nicht gefunden werden. Scheint nicht für mich zu funktionieren ...
Nick
3
Beachten Sie, dass dies -t $BRANCHauch ohne funktioniert -f, was sofort abrufen würde. Dann git fetch originwürde abrufen und git checkout $BRANCHwürde die lokale Niederlassung und Kasse einrichten. Dies ist nützlich, wenn Sie die Fernbedienung vor dem Abrufen konfigurieren müssen, z git config remote.origin.uploadpack=/bin/upload-pack.
cdunn2001
1
Da ich auf einem "alten" Corporate Git (1.6.0.2) bin, bin ich an die obige Lösung gebunden. Ich hatte das gleiche Problem wie @Nick. Ausführen von Git branch -azeigte origin/$BRANCH. Dies wurde git checkout origin/$BRANCHbehoben.
Dr. Jerry
30

Sie können den langatmigen Weg versuchen:

mkdir newrepo.git
cd newrepo.git
git init
git remote add origin file:///path/to/original
git fetch origin branchiwant:refs/remotes/origin/branchiwant
git checkout -b branchiwant --track origin/branchiwant

Was dies tut ist:

  • Erstellen und initiieren Sie ein leeres Git-Repository.
  • Fügt das ursprüngliche Repository als Remote mit dem Namen origin hinzu .
  • Ruft nur den Zweig ab, den Sie von der Fernbedienung namens origin benötigen .
  • Erstellt und checkt einen neuen Zweig aus, der eingerichtet ist, um den gerade geklonten Quellzweig zu verfolgen.

Hoffentlich ist das so etwas wie das, wonach Sie suchen.

jkp
quelle
Die Argumente für git remote add wurden ausgetauscht, aber ich konnte die Kasse dann nicht zum Laufen bringen. "git checkout origin / Rails" gab mir "Fehler: pathspec 'origin / Rails' stimmte nicht mit Dateien überein, die git bekannt sind." und die Alternative gab mir "fatal: Git Checkout: Das Aktualisieren von Pfaden ist nicht kompatibel mit dem Wechseln von Zweigen."
Casey Rodarmor
@rodarmor: habe den git remote befehl korrigiert, danke. Können Sie die Ausgabe von einfügen git branch -r?
JKP
@jkp, git branch -rgibt eigentlich keine Ausgabe.
Casey Rodarmor
@rodarmor: Ich habe das Beispiel korrigiert und das funktioniert definitiv (getestet). HTH (Sie können es akzeptieren, sobald Sie es getestet haben, wie Sie
möchten
Der Schalter -b ist relativ neu. Das letzte Mal, als ich es auf einem Debian Squeeze laufen ließ, war es nicht verfügbar, IIRC
sehe
23

Sie können dies mit dem folgenden Befehl tun:

git clone -b branch_name --single-branch project_url local_folder_to_clone_in
Nosaiba darwish
quelle
2
Hat perfekt funktioniert, ich hatte tatsächlich ein Problem in Source Tree, einen einzelnen Zweig zu klonen, also habe
ich
17

Von der git-clone-Manpage :

--single-branchIst Ihr Freund während des Klonens daran denken, mit zu verwenden, --branch <branch name>oder wird nur der primäre Remote-HEAD geklont (standardmäßig Master)?

Denken Sie immer daran, Ctrl+ zu tun F5, um eine neue Quelle zu lesen, nicht die aus dem Cache :-) (Ich wusste lange Zeit nichts über diese Option.)

Casey
quelle
1
git clone <url> --branch <branch> --single-branch <folder>
Shridutt Kothari
17
git clone <url> --branch <branch> --single-branch

Geben Sie einfach die URL und den Filialnamen ein.

Jitendra
quelle
8

Klonen Sie nur einen Zweig. Dies ist der einfachste Weg:

$ git clone -b BRANCH_NAME --single-branch [email protected]:___/PROJECTNAME.git
Cubiczx
quelle
4

Zum Klonen eines bestimmten Zweigs haben Sie folgende Möglichkeiten:

git clone --branch yourBranchName [email protected]

nPcomp
quelle
3

Verwenden Sie Folgendes, um einen Zweig von Git zu klonen, für den Sie nicht über den öffentlichen Schlüssel verfügen:

git clone -b <branch> <Git repository URL or clone URL you get from Git repository>
Prem S.
quelle
2

Öffnen Sie das cmd.

cd folder_name (Geben Sie den Pfad ein, in den der Zweig geklont werden soll.)

Nur ein Befehl:

git clone url_of_projecturltoclone -b branch_name
dhS
quelle
2

Ein bisschen spät, aber ich wollte die Lösung hinzufügen, mit der ich dieses Problem gelöst habe. Ich habe hier die Lösung gefunden .

Wie auch immer, die Frage scheint zu lauten: Wie kann man ein neues Projekt von einem Zweig eines anderen Repos aus starten?

Die Lösung dafür war, zuerst ein neues Repo in Github oder wo auch immer zu erstellen. Dies dient als Repo für Ihr neues Projekt.

Navigieren Sie auf Ihrem lokalen Computer zu dem Projekt mit dem Zweig, den Sie als Vorlage für Ihr neues Projekt verwenden möchten.

Führen Sie den folgenden Befehl aus:

git push https://github.com/accountname/new-repo.git +old_branch:master

Dadurch wird die old_branch auf new-repo verschoben und zum Hauptzweig des neuen Repos gemacht.

Sie müssen dann nur das neue Repo in das lokale Verzeichnis Ihres neuen Projekts klonen und haben ein neues Projekt in der alten Niederlassung gestartet.

Aaron Pennington
quelle
2

Nehmen wir das Beispiel eines Kolben-Repo. Es hat 3 Zweige zusätzlich zum Master. Lassen Sie uns den Remote-Zweig 1.1.x überprüfen

Klonen Sie das Git Repo

git clone https://github.com/pallets/flask

CD ins Repo.

cd flask

Remote-Zweig abrufen 1.1.x.

git fetch origin 1.1.x

Kasse der Filiale

git checkout 1.1.x

Sie wechseln zum Zweig 1.1.x und verfolgen den Remote-Zweig 1.1.x.

Chaitanya Vardhan
quelle
0

Ähnlich wie @ nosaiba-darwish hier sagte: hier

Das machen wir normalerweise in unserem Unternehmen:

git clone -b <name_of_branch> --single-branch <git_url> folder_to_clone_locally

Aqeeb Imtiaz Harun
quelle
0

Wenn Sie einen flachen Klon möchten, können Sie dies tun mit:

git clone -b mybranch --depth=1 https://example.com/myproject.git localname

--depth=1impliziert --single-branch.

Thakis
quelle
0

Hierfür gibt es hauptsächlich 2 Lösungen:

  1. Sie müssen den Zweigstellennamen mit dem Befehlsschalter -b angeben. Hier ist die Syntax des Befehls zum Klonen des spezifischen Git-Zweigs.

git clone -b <BRANCH_NAME> <GIT_REMOTE_URL>

Beispiel: Git-Klon -b tahir https://github.com/Repository/Project.git

Der folgende Befehl klont den Zweig tahir aus dem Git-Repository. Der obige Befehl klont nur den spezifischen Zweig, ruft jedoch die Details anderer Zweige ab. Sie können alle Verzweigungsdetails mit dem Befehl anzeigen. git branch -a

  1. Sie können das Flag '--single-branch' verwenden, um das Abrufen von Details anderer Zweige wie unten zu verhindern:

git clone -b <BRANCH_NAME> --single-branch <GIT_REMOTE_URL>

Beispiel: Git-Klon -b tahir --single-branch https://github.com/Repository/Project.git

Nun, wenn Sie eine tun git branch -a , wird nur Ihr aktueller einzelner Zweig angezeigt, den Sie geklont haben, und nicht alle Zweige. Es hängt also von Ihnen ab, wie Sie es möchten.

Hoffe es hilft irgendwann jemandem !! ...

Tahir77667
quelle
0

Mit diesem Befehl können Sie einen einzelnen Zweig gitieren und den Ordner umbenennen, wenn Sie den Zweig eigenständig lassen möchten

git clone -b [branch-name] --single-branch [url]  [folder_name]

Beispiel

git clone -b mybranch --single-branch git://github/repository.git  project_mybranch
Elbaz
quelle
0

git clone --branch {branch-name} {repo-URI}

Beispiel: git clone --branch dev https://github.com/ann/cleaningmachine.git

an-apluss
quelle
-1

Kann in 2 Schritten durchgeführt werden

  1. Klonen Sie das Repository

    • git clone <http url>
  2. Kasse der gewünschten Filiale

    • git checkout $BranchName
Pramod Setlur
quelle