Wie alle Remote-Niederlassungen in Git klonen?
-
09-06-2019 - |
Frage
Ich habe eine master
und einen development
Zweig, beide geschoben GitHub . Ich habe clone
d, pull
ed und fetch
ed, aber ich bleibe nicht in der Lage, etwas anderes als der master
Zweig zu kommen.
Ich bin sicher, dass ich etwas offensichtlich fehle bin, aber ich habe das Handbuch gelesen und ich bin immer keine Freude überhaupt.
Lösung
Zuerst klonen eine Remote- Git Repository und cd hinein:
$ git clone git://example.com/myproject
$ cd myproject
Als nächster Blick auf den lokalen Niederlassungen in Ihrem Repository:
$ git branch
* master
Aber es gibt auch andere Zweige in Ihrem Repository zu verstecken! Sie können diese mit der -a
Flagge sehen:
$ git branch -a
* master
remotes/origin/HEAD
remotes/origin/master
remotes/origin/v1.0-stable
remotes/origin/experimental
Wenn Sie nur einen kurzen Blick auf einem vorgeschalteten Zweig nehmen möchten, können Sie es überprüfen direkt:
$ git checkout origin/experimental
Aber wenn Sie auf diesem Zweig arbeiten wollen, müssen Sie einen lokalen Tracking-Zweig erstellen, die automatisch durch getan wird:
$ git checkout experimental
und Sie werden sehen,
Branch experimental set up to track remote branch experimental from origin.
Switched to a new branch 'experimental'
Das letzte Zeile wirft einige Leute: „Neue Niederlassung“ - nicht wahr? Was es wirklich bedeutet, ist, dass der Zweig aus dem Index genommen wird und vor Ort für Sie erstellt. Die zurück Linie ist eigentlich mehr informativ wie es Ihnen sagt, dass der Zweig eingerichtet wird, um den Remote-Zweig zu verfolgen, die in der Regel bedeutet, den Ursprung / branch_name Zweig
Nun, wenn Sie bei Ihrem örtlichen Zweige aussehen, ist es das, was Sie sehen werden:
$ git branch
* experimental
master
Sie können tatsächlich mehr als eine Remote-Repository mit git remote
verfolgen.
$ git remote add win32 git://example.com/users/joe/myproject-win32-port
$ git branch -a
* master
remotes/origin/HEAD
remotes/origin/master
remotes/origin/v1.0-stable
remotes/origin/experimental
remotes/win32/master
remotes/win32/new-widgets
An diesem Punkt sind die Dinge immer ziemlich verrückt, so laufen gitk
, um zu sehen, was los ist:
$ gitk --all &
Andere Tipps
Wenn Sie viele Fern Zweige haben, die Sie auf einmal holen wollen, tun:
$ git pull --all
Jetzt können Sie einen beliebigen Zweig Kasse wie Sie möchten, ohne das Remote-Repository zu treffen.
Das Bash Skript half mir aus:
#!/bin/bash
for branch in $(git branch --all | grep '^\s*remotes' | egrep --invert-match '(:?HEAD|master)$'); do
git branch --track "${branch##*/}" "$branch"
done
Es wird Tracking-Zweig für alle entfernten Niederlassungen erstellen, außer Master (die Sie wahrscheinlich aus dem ursprünglichen Klon-Befehl bekamen). Ich glaube, Sie könnten noch tun müssen,
git fetch --all
git pull --all
sicher sein.
Ein Liner :
git branch -a | grep -v HEAD | perl -ne 'chomp($_); s|^\*?\s*||; if (m|(.+)/(.+)| && not $d{$2}) {print qq(git branch --track $2 $1/$2\n)} else {$d{$_}=1}' | csh -xfs
Wie üblich: Test in Ihrem Setup vor rm -rf Universum zu kopieren, wie wir wissen, dass esCredits für Einzeiler zu Benutzer gehen cfi
die --mirror
Option verwenden, scheint die remote
Tracking-Zweige richtig zu kopieren.
Allerdings setzt sie das Repository als bare Repository, also müssen Sie es zurück in ein normales Repository drehen danach.
git clone --mirror path/to/original path/to/dest/.git
cd path/to/dest
git config --bool core.bare false
git checkout anybranch
Referenz: Git FAQ: Wie klonen ich ein Repository mit allen fern nachgeführt Zweige?
Sie können ganz einfach auf einen Zweig wechseln die fancy "git checkout -b somebranch Herkunft / somebranch" Syntax ohne Verwendung. Sie können einfach tun:
git checkout somebranch
Git wird das Richtige automatisch tun:
$ git checkout somebranch
Branch somebranch set up to track remote branch somebranch from origin.
Switched to a new branch 'somebranch'
Git prüft, ob ein Zweig mit dem gleichen Namen in genau einer entfernten vorhanden ist, und wenn ja, es verfolgt sich die gleiche Art und Weise, als ob Sie explizit angegeben hatten, dass es sich um einen Remote-Zweig ist. Von der git-checkout-man-Seite von Git 1.8.2.1:
Wenn
nicht gefunden, aber es existiert eine Tracking-Zweig in genau Fern ein (nennen wir es ) mit einem passenden Namen, so behandeln, als äquivalent zu $ git checkout -b <branch> --track <remote>/<branch>
In Bezug auf
$ git checkout -b experimentelle Herkunft / experimental
mit
$ git checkout -t origin/experimental
oder die ausführlichere aber leichter merken
$ git checkout --track origin/experimental
könnte besser sein, in Bezug auf eine Remote-Repository zu verfolgen.
Die holen, dass Sie sollten tun, alle Remote-Niederlassungen bekommen, aber es wird nicht Ortsvereine für sie erstellen. Wenn Sie gitk verwenden, sollten Sie die Remote-Filialen als „Fernbedienungen / Herkunft / dev“ oder etwas ähnliches sehen.
Um einen lokalen Zweig zu erstellen, basierend auf einem entfernten Zweig, so etwas wie:
git checkout -b dev refs/remotes/origin/dev
Welche zurückkehren sollte so etwas wie:
Branch dev set up to track remote branch refs/remotes/origin/dev. Switched to a new branch "dev"
Wenn Sie nun auf dem dev Zweig sind „git pull“ Ihre lokale Entwickler auf den gleichen Punkt wie der Remote-dev Zweig aktualisieren. Beachten Sie, dass es alle Zweige holen, aber nur ziehen das Sie auf die Spitze des Baumes sind.
Wenn Sie das tun "git clone git: // Standort", alle Zweige und Tags geholt
.Um auf einem bestimmten Remote-Zweig zu arbeiten, es ist der Ursprung Fern Annahme:
git checkout -b branch origin/branchname
Aliase. Obwohl es keine nativen Einzeiler Git sind, können Sie Ihre eigenen wie
definierengit config --global alias.clone-branches '! git branch -a | sed -n "/\/HEAD /d; /\/master$/d; /remotes/p;" | xargs -L1 git checkout -t'
und verwenden Sie es dann als
git clone-branches
Warum sehen Sie nur "Master"
git clone
Downloads alle Remote-Niederlassungen Fern aber noch hält sie für „remote“, auch wenn die Dateien in Ihrem neuen Repository befinden. Es gibt eine Ausnahme von dieser Regel, die ist, dass das Klonen Prozess einen lokalen Zweig erzeugt von dem entfernten Zweig namens „Master“ genannt „Master“. Standardmäßig zeigt git branch
nur lokale Niederlassungen, weshalb man nur sehen „Master“.
git branch -a
zeigt alle Zweige, einschließlich Remote-Niederlassungen .
Wie lokale Niederlassungen erhalten
Wenn Sie tatsächlich auf einem Zweig arbeiten möchten, werden Sie wahrscheinlich wollen eine „lokale“ Version davon. Um einfach lokalen Niederlassungen zu erstellen von entfernten Filialen (ohne sie überprüft und dadurch Ändern Sie den Inhalt Ihres Arbeitsverzeichnis) , können Sie dies wie folgt tun:
git branch branchone origin/branchone
git branch branchtwo origin/branchtwo
git branch branchthree origin/branchthree
In diesem Beispiel branchone
ist der Name einer lokalen Niederlassung sind die Schaffung Sie basiert auf origin/branchone
; wenn Sie stattdessen lokale Niederlassungen mit unterschiedlichen Namen erstellen möchten, können Sie dies tun:
git branch localbranchname origin/branchone
Wenn Sie eine lokale Niederlassung erstellt haben, können Sie es mit git branch
sehen (denken Sie daran, Sie müssen nicht -a
brauchen Ortsvereine zu sehen).
Das ist nicht zu viel kompliziert, sehr einfach und geradlinig Schritte sind wie folgt:
git fetch origin
Dadurch werden alle entfernten Niederlassungen zu Ihrem lokalen bringen.
git branch -a
Dies zeigt Ihnen alle entfernten Niederlassungen.
git checkout --track origin/<branch you want to checkout>
Überprüfen Sie, ob Sie in den gewünschten Zweig durch den folgenden Befehl sind;
git branch
Der Ausgang wird wie diese;
*your current branch
some branch2
some branch3
Beachten Sie das * Zeichen dafür, dass der aktuellen Zweig bezeichnet.
Besser spät als nie, aber hier ist der beste Weg, dies zu tun:
mkdir repo
cd repo
git clone --bare path/to/repo.git .git
git config --unset core.bare
git reset --hard
An dieser Stelle Sie eine vollständige Kopie des Remote-Repo haben mit all seinen Zweigen (überprüfen mit git branch
). Sie können --mirror
statt --bare
verwenden, wenn die Remote-Repo-Fernbedienungen seiner eigenen hat.
Just dies zu tun:
$ git clone git://example.com/myproject
$ cd myproject
$ git checkout branchxyz
Branch branchxyz set up to track remote branch branchxyz from origin.
Switched to a new branch 'branchxyz'
$ git pull
Already up-to-date.
$ git branch
* branchxyz
master
$ git branch -a
* branchxyz
master
remotes/origin/HEAD -> origin/master
remotes/origin/branchxyz
remotes/origin/branch123
Sie sehen, ‚git clone git: //example.com/myprojectt‘. Holt alles, auch die Zweige, können Sie sie einfach Kasse müssen, dann wird Ihre lokale Niederlassung erstellt werden
Sie müssen nur "git clone" verwenden, um alle Zweige zu erhalten.
git clone <your_http_url>
Auch wenn Sie nur Master-Zweig zu sehen, können Sie mit "git branch -a" verwenden, um alle Zweige zu sehen.
git branch -a
Und Sie können zu jeder Filiale wechseln, die Sie bereits haben.
git checkout <your_branch_name>
Sie, dass sich keine Sorgen, nachdem Sie „git clone“, die Sie nicht mit dem Remote-Repo „git branch -a“ und „git checkout“ anschließen müssen erfolgreich ausgeführt werden, wenn Sie Ihre Wi-Fi schließen. So ist es bewiesen, dass, wenn Sie „git clone“ tun, ist es bereits alle Zweige von der Remote-Repo kopiert hat. Danach brauchen Sie nicht die Remote-Repo, Ihre lokale hat bereits alle Codes Zweige.
Ein git clone
soll das gesamte Repository kopieren. Versuchen Sie es klonen und dann git branch -a
laufen. Es sollte alle Zweige auflisten. Wenn dann möchten Sie Zweig „foo“ statt „Master“ wechseln, verwenden git checkout foo
.
Mit meinem Tool git_remote_branch ( Sie benötigen Rubin auf Ihrem Computer installiert ist). Es wird gebaut speziell entfernten Zweig Manipulationen tot einfach.
machenJedes Mal, es hat eine Operation in Ihrem Namen, es druckt er an der Konsole in rot. Im Laufe der Zeit bleiben sie schließlich ins Gehirn: -)
Wenn Sie nicht wollen, grb Befehle in Ihrem Namen auszuführen, verwenden Sie einfach die ‚erklären‘ Funktion. Die Befehle werden an der Konsole gedruckt werden, anstatt für Sie ausgeführt.
Schließlich werden alle Befehle haben Aliase, Auswendiglernen zu erleichtern.
Beachten Sie, dass dies Alpha-Software ; -)
Hier ist die Hilfe, wenn Sie grb Hilfe ausführen:
git_remote_branch version 0.2.6 Usage: grb create branch_name [origin_server] grb publish branch_name [origin_server] grb rename branch_name [origin_server] grb delete branch_name [origin_server] grb track branch_name [origin_server] Notes: - If origin_server is not specified, the name 'origin' is assumed (git's default) - The rename functionality renames the current branch The explain meta-command: you can also prepend any command with the keyword 'explain'. Instead of executing the command, git_remote_branch will simply output the list of commands you need to run to accomplish that goal. Example: grb explain create grb explain create my_branch github All commands also have aliases: create: create, new delete: delete, destroy, kill, remove, rm publish: publish, remotize rename: rename, rn, mv, move track: track, follow, grab, fetch
alle Antworten, die ich hier gesehen sind gültig, aber es ist ein viel sauberer Weg, um ein Repository zu klonen und alle Zweige auf einmal zu ziehen.
Wenn Sie klonen ein Repository alle Informationen der Zweige tatsächlich heruntergeladen, aber die Zweige sind ausgeblendet. Mit dem Befehl
$ git branch -a
können Sie alle Zweige des Endlagers zeigen, und mit dem Befehl
$ git checkout -b branchname origin/branchname
Sie können dann „Download“ manuell einen nach dem anderen.
Wenn Sie jedoch ein Repo mit vielen Zweigen klonen wollen, dass alle dargestellten Möglichkeiten, oben sind langwierig und mühsam in Bezug auf einen viel sauberen und schnellen Weg, dass ich zeigen werde, obwohl es ein bisschen kompliziert ist. Sie müssen drei Schritte, um dies zu erreichen:
- Erster Schritt
Sie einen leeren Ordner auf Ihrem Computer erstellen und eine gespiegelte Kopie des .git Ordners aus dem Repository klonen:
$ cd ~/Desktop && mkdir my_repo_folder && cd my_repo_folder
$ git clone --mirror https://github.com/planetoftheweb/responsivebootstrap.git .git
das lokale Repository innerhalb des Ordners my_repo_folder noch leer ist, gibt es nur einen versteckten .git Ordner jetzt, dass Sie mit einem „ls -alt“ Befehl vom Terminal sehen.
- Zweiter Schritt
Schalten dieses Repository von einer leeren (blank) Repository in einem regelmäßigen Repository durch den booleschen Wert „nackten“ der GIT-Konfigurationen zu Fehlschaltungen:
$ git config --bool core.bare false
- Dritter Schritt
Schnappen Sie alles, was im aktuellen Ordner und alle Zweige auf der lokalen Maschine erstellen, damit diese einen normalen Repo machen.
$ git reset --hard
So, jetzt können Sie nur den Befehl „git branch“ eingeben und Sie können sehen, dass alle Zweige heruntergeladen werden.
Dies ist der schnelle Weg, in dem Sie ein Git-Repository mit allen Zweigen auf einmal klonen kann, aber es ist nicht etwas, das Sie auf diese Weise für jedes einzelne Projekt tun wollen.
Mit Blick auf eine der Antworten auf die Frage, die ich bemerkt, dass es möglich ist, es zu verkürzen:
for branch in `git branch -r | grep -v 'HEAD\|master'`; do
git branch --track ${branch##*/} $branch;
done
Aber Vorsicht, wenn man von entfernten Filialen wie beispielsweise benannt admin_master es wird nicht heruntergeladen werden!
Vielen Dank für die ursprüngliche Idee bigfish
Cloning von einem lokalen Repo nicht mit git clone arbeiten & git holen: a. Viele branches / tags bleiben nicht abgerufene
Um einen Klon mit allen Zweigen und Tags zu erhalten.
git clone --mirror git://example.com/myproject myproject-local-bare-repo.git
Um einen Klon mit allen Zweigen und Tags zu erhalten, sondern auch mit einer Arbeitskopie:
git clone --mirror git://example.com/myproject myproject/.git
cd myproject
git config --unset core.bare
git config receive.denyCurrentBranch updateInstead
git checkout master
OK , wenn Sie Ihre Repo-Klon, Sie haben alle Zweige dort ...
Wenn Sie nur git branch
tun, sind sie Art von versteckt ...
Also, wenn Sie möchten, dass alle Zweige Namen sehen, einfach nur --all
Flagge wie folgt hinzu:
git branch --all
oder git branch -a
Wenn Sie nur auf die Niederlassung Kasse erhalten Sie alles, was Sie benötigen.
Aber wie wäre es, wenn die Verzweigung erstellt von jemand anderem, nachdem Sie klonen?
In diesem Fall tut nur:
git fetch
und überprüfen Sie alle Zweige wieder ...
Wenn Sie in der gleichen Zeit holen und Kasse, können Sie tun:
git fetch && git checkout your_branch_name
erstellt auch das Bild unten für Sie zu vereinfachen, was ich gesagt:
#!/bin/bash
for branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master `; do
git branch --track ${branch#remotes/origin/} $branch
done
Diese Codes werden alle Remote-Niederlassungen Code zu lokalen Repo ziehen.
Für copy-paste in Befehlszeile:
git checkout master ; remote=origin ; for brname in `git branch -r | grep $remote | grep -v master | grep -v HEAD | awk '{gsub(/^[^\/]+\//,"",$1); print $1}'`; do git branch -D $brname ; git checkout -b $brname $remote/$brname ; done ; git checkout master
Für mehr Lesbarkeit:
git checkout master ;
remote=origin ;
for brname in `
git branch -r | grep $remote | grep -v master | grep -v HEAD
| awk '{gsub(/^[^\/]+\//,"",$1); print $1}'
`; do
git branch -D $brname ;
git checkout -b $brname $remote/$brname ;
done ;
git checkout master
Dies wird:
- Check-out-Master (so dass wir Zweig wir sind auf löschen können)
- wählen Remote zur Kasse (um es zu ändern, was auch immer entfernen Sie haben)
- Schleife durch alle Branchen der Fernbedienung außer Master und HEAD
- Löschen Filiale (so dass wir kraft aktualisiert Zweige überprüfen können)
- Besuche Zweig von der Fern
- Check-out-Master (aus Gründen der es)
von VonC .
Ich brauchte genau das gleiche zu tun. Hier ist meine Ruby- Skript.
#!/usr/bin/env ruby
local = []
remote = {}
# Prepare
%x[git reset --hard HEAD]
%x[git checkout master] # Makes sure that * is on master.
%x[git branch -a].each_line do |line|
line.strip!
if /origin\//.match(line)
remote[line.gsub(/origin\//, '')] = line
else
local << line
end
end
# Update
remote.each_pair do |loc, rem|
next if local.include?(loc)
%x[git checkout --track -b #{loc} #{rem}]
end
%x[git fetch]
Ich schrieb diese kleinen Powershell Funktionen der Lage sein, alle Zweige meiner git zur Kasse, die auf Ursprung entfernt sind.
Function git-GetAllRemoteBranches {
iex "git branch -r" <# get all remote branches #> `
| % { $_ -Match "origin\/(?'name'\S+)" } <# select only names of the branches #> `
| % { Out-Null; $matches['name'] } <# write does names #>
}
Function git-CheckoutAllBranches {
git-GetAllRemoteBranches `
| % { iex "git checkout $_" } <# execute ' git checkout <branch>' #>
}
Weitere git Funktionen können auf meine git Einstellungen gefunden werden Repo
Git in der Regel (wenn nicht angegeben) holt alle Zweige und / oder Tags (Lit. siehe: git ls-refs
) von einem oder mehreren anderen Repositories zusammen mit den Objekten notwendig, um ihre Geschichte abzuschließen. Mit anderen Worten holt es die Objekte, die von den Objekten erreichbar sind, die bereits heruntergeladen werden. Siehe: Was bedeutet git fetch
wirklich tun
Manchmal können Sie branches / tags haben, die nicht direkt mit dem aktuellen verbunden sind, so git pull --all
/ git fetch --all
wird in diesem Fall nicht helfen, aber man kann sie nach:
git ls-remote -h -t origin
und holen sie manuell durch die ref Namen zu kennen.
So holen sie alle , versuchen Sie:
git fetch origin --depth=10000 $(git ls-remote -h -t origin)
Der --depth=10000
Parameter kann helfen, wenn Sie Repository shallowed haben.
Dann lassen Sie Ihre Zweige wieder:
git branch -avv
Wenn oben nicht helfen, müssen Sie Zweige manuell auf die verfolgte Liste hinzufügen fehlen (wie sie irgendwie verloren gegangen ist):
$ git remote -v show origin
...
Remote branches:
master tracked
durch git remote set-branches
wie:
git remote set-branches --add origin missing_branch
, so dass es unter remotes/origin
erscheinen kann nach Abruf:
$ git remote -v show origin
...
Remote branches:
missing_branch new (next fetch will store in remotes/origin)
$ git fetch
From github.com:Foo/Bar
* [new branch] missing_branch -> origin/missing_branch
Fehlerbehebung
Wenn Sie immer noch nichts anderes als der Master-Zweig bekommen, gehen Sie folgende Liste:
- Überprüfen Sie Ihre Fernbedienungen (
git remote -v
), z.B.-
Bestätigen
- , dass
git config branch.master.remote
istorigin
. - Überprüfen Sie, ob
origin
Punkte auf der rechten Seite URL über:.git remote show origin
(siehe diese Post )
- , dass
Keine dieser Antworten schneiden, außer Benutzer niemand auf dem richtigen Weg ist.
Ich hatte Probleme mit einem Repo von einem Server / System zum anderen. Als ich den Repo geklont, ist es nur eine lokale Niederlassung für Master erstellt so, wenn ich auf die neue Fernbedienung gedrückt wird, nur Master-Zweig geschoben wurde.
So fand ich diese beiden Methoden sehr nützlich. Ich hoffe, sie helfen jemand anderes.
Methode 1:
git clone --mirror OLD_REPO_URL
cd new-cloned-project
mkdir .git
mv * .git
git config --local --bool core.bare false
git reset --hard HEAD
git remote add newrepo NEW_REPO_URL
git push --all newrepo
git push --tags newrepo
Methode 2:
git config --global alias.clone-branches '! git branch -a | sed -n "/\/HEAD /d; /\/master$/d; /remotes/p;" | xargs -L1 git checkout -t'
git clone OLD_REPO_URL
cd new-cloned-project
git clone-branches
git remote add newrepo NEW_REPO_URL
git push --all newrepo
git push --tags newrepo
Verwenden Sie Befehle, die Sie
erinnern kannIch bin mit Bitbucket, einem Repository-Hosting-Service von Atlassian. Also versuche ich, ihre Dokumente zu folgen. Und das funktioniert perfekt für mich. Mit den folgenden einfachen und kurzen Befehlen können Sie Ihren Remote-Zweig der Kasse.
Auf den ersten Repository klonen, dann in den Zielordner ändern. Und last but not least holen und Kasse:
git clone <repo> <destination_folder>
cd <destination_folder>
git fetch && git checkout <branch>
Das ist es. Hier ist ein litte mehr reale Welt Beispiel:
git clone https://username@bitbucket.org/team/repository.git project_folder
cd project_folder
git fetch && git checkout develop
Sie werden Detailinformationen über die Befehle in der Dokumentation finden: Clone Befehl , Fetch Befehl Kasse Befehl
Ab Anfang 2017 die Antwort in diesem Kommentar funktioniert:
git fetch <origin-name> <branch-name>
bringt den Zweig für Sie nach unten. Während dies auf einmal ziehen nicht alle Zweige, können Sie einzeln ausführen diese pro-Zweig.
Hier ist ein weiterer kurzer Einzeiler Befehl, schafft lokale Niederlassungen für alle entfernten Niederlassungen:
(git branch -r | sed -n '/->/!s#^ origin/##p' && echo master) | xargs -L1 git checkout
Es funktioniert auch einwandfrei, wenn Tracking-Ortsvereine sind bereits erstellt.
Sie können später nach dem ersten git clone
oder jederzeit aufrufen.
Wenn Sie nicht brauchen master
Zweig haben nach dem Klonen ausgecheckt, verwenden
git branch -r | sed -n '/->/!s#^ origin/##p'| xargs -L1 git checkout
git clone --mirror
auf dem ursprünglichen Repo funktioniert gut für diese.
git clone --mirror /path/to/original.git
git remote set-url origin /path/to/new-repo.git
git push -u origin