it-swarm.com.de

So rufen Sie alle Git-Zweige ab

Ich habe ein Git-Repository geklont, das ungefähr fünf Zweige enthält. Wenn ich jedoch git branch mache, sehe ich nur einen von ihnen:

$ git branch
* master

Ich weiß, dass ich git branch -a ausführen kann, um alle die Zweige anzuzeigen, aber wie würde ich alle Zweige lokal abziehen, wenn ich git branch ausführen würde, wird Folgendes angezeigt?

$ git branch
* master
* staging
* etc...
1277
David542

Sie können alle Zweige von allen Remotes wie folgt abrufen:

git fetch --all

Es ist im Grunde ein Power Move .

fetch aktualisiert lokale Kopien von Remote-Zweigen, sodass dies für Ihre lokalen Zweige immer sicher ist ABER:

  1. fetch aktualisiert keine lokalen Zweige (die remote verfolgen Geäst); Wenn Sie Ihre lokalen Niederlassungen aktualisieren möchten, müssen Sie immer noch jede Niederlassung ziehen.

  2. fetch erstellt keine lokalen Zweige (die die Ferne verfolgen Zweige), müssen Sie dies manuell tun. Wenn Sie alle entfernten Zweige auflisten möchten: git branch -a

So aktualisieren Sie lokale Zweige, die entfernte Zweige verfolgen:

git pull --all

Dies kann jedoch immer noch unzureichend sein. Es funktioniert nur für Ihre lokalen Niederlassungen, die entfernte Niederlassungen verfolgen. Um alle entfernten Zweige zu verfolgen, führen Sie diesen Oneliner VORgit pull --all aus:

git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#Origin/}" "$remote"; done

TL; DR-Version

git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#Origin/}" "$remote"; done
git fetch --all
git pull --all

(Es scheint, dass pull alle Zweige von allen Fernbedienungen abruft, aber ich rufe immer zuerst ab, nur um sicherzugehen.)

Führen Sie den ersten Befehl nur aus, wenn auf dem Server Remotezweige vorhanden sind, die von Ihren lokalen Zweigen nicht verfolgt werden.

P.S. AFAIK git fetch --all und git remote update sind gleichwertig.



Kamil Szots Kommentar , was die Leute nützlich fanden.

Ich musste benutzen:

for remote in `git branch -r`; do git branch --track ${remote#Origin/} $remote; done

weil Ihr Code lokale Zweige mit dem Namen Origin/branchname erstellt hat und ich "refname 'Origin/branchname' erhielt, ist es mehrdeutig, wann immer ich darauf hinwies.

1723
Wookie88

So listen Sie entfernte Zweige auf:
git branch -r

Sie können sie als lokale Filialen auschecken mit:
git checkout -b LocalName Origin/remotebranchname

607
Learath2

Sie müssen lokale Zweige erstellen, die entfernte Zweige verfolgen.

Angenommen, Sie haben nur eine Fernbedienung mit dem Namen Origin, dann erstellt dieses Snippet lokale Zweige für alle Fernverfolgungszweige:

for b in `git branch -r | grep -v -- '->'`; do git branch --track ${b##Origin/} $b; done

Danach aktualisiert git fetch --all alle lokalen Kopien von Remote-Zweigen.

git pull --all aktualisiert auch Ihre lokalen Verfolgungszweige. Abhängig von Ihren lokalen Festschreibungen und der Einstellung der Option 'Zusammenführen' kann es jedoch zu einem Zusammenführungsfestschreiben, einem schnellen Vorlauf oder einem Fehler kommen.

178
Michael Renner

Wenn Sie tun:

git fetch Origin

dann werden sie alle vor Ort sein. Wenn Sie dann durchführen:

git branch -a

sie werden als Remotes/Origin/Branch-Name aufgelistet. Da sie vor Ort sind, können Sie mit ihnen machen, was Sie wollen. Zum Beispiel:

git diff Origin/branch-name 

oder

git merge Origin/branch-name

oder

git checkout -b some-branch Origin/branch-name
108
GoZoner
$ git remote update
$ git pull --all

Dies setzt voraus, dass alle Zweige verfolgt werden.

Wenn dies nicht der Fall ist, können Sie dies in Bash abfeuern:

for remote in `git branch -r `; do git branch --track $remote; done

Führen Sie dann den Befehl aus.

60
Johnno Nolan

Die Bash for -Schleife hat bei mir nicht funktioniert, aber sie hat genau das getan, was ich wollte. Alle Zweige meines Ursprungs werden lokal mit demselben Namen gespiegelt.

git checkout --detach
git fetch Origin '+refs/heads/*:refs/heads/*'

Siehe Mike DuPont s Kommentar unten. Ich denke, ich habe versucht, dies auf einem Jenkins-Server zu tun, der es im Modus für getrennte Köpfe belässt.

47
Tim Lum

Verwenden Sie git fetch && git checkout RemoteBranchName.

Es funktioniert sehr gut für mich ...

45
Regis Zaleman

Wenn Sie ein Repository klonen, werden alle Informationen der Zweige tatsächlich heruntergeladen, die Zweige jedoch ausgeblendet. Mit dem Befehl

$ git branch -a

sie können alle Zweige des Repositorys und mit dem Befehl anzeigen

$ git checkout -b branchname Origin/branchname

sie können sie dann einzeln manuell herunterladen.


Es gibt jedoch einen viel saubereren und schnelleren Weg, auch wenn dieser etwas kompliziert ist. Sie benötigen drei Schritte, um dies zu erreichen:

  1. Erster Schritt

    erstellen Sie einen neuen leeren Ordner auf Ihrem Computer und klonen Sie eine Spiegelkopie des .git-Ordners aus dem Repository:

    $ cd ~/Desktop && mkdir my_repo_folder && cd my_repo_folder
    $ git clone --mirror https://github.com/planetoftheweb/responsivebootstrap.git .git
    

    das lokale Repository im Ordner my_repo_folder ist noch leer. Es gibt nur noch einen versteckten .git-Ordner, den Sie mit dem Befehl "ls -alt" vom Terminal aus sehen können.

  2. Zweiter Schritt

    wechseln Sie dieses Repository von einem leeren (nackten) Repository in ein reguläres Repository, indem Sie den booleschen Wert "bare" der Git-Konfigurationen auf "false" setzen:

    $ git config --bool core.bare false
    
  3. Dritter Schritt

    Holen Sie sich alles, was sich im aktuellen Ordner befindet, und erstellen Sie alle Zweige auf dem lokalen Computer, sodass dies ein normales Repo ist.

    $ git reset --hard
    

Jetzt können Sie einfach den Befehl git branch eingeben und sehen, dass alle Zweige heruntergeladen wurden.

Dies ist die schnelle Methode, mit der Sie ein Git-Repository mit allen Zweigen auf einmal klonen können, aber Sie möchten dies nicht für jedes einzelne Projekt auf diese Weise tun.

32
FedericoCapaldo

Sie können alle Zweige abrufen, indem Sie:

git fetch --all

oder:

git fetch Origin --depth=10000 $(git ls-remote -h -t Origin)

Der Parameter --depth=10000 kann hilfreich sein, wenn Sie ein flaches Repository haben.


Um alle Zweige zu ziehen, verwenden Sie:

git pull --all

Wenn oben nicht funktioniert, stellen Sie dem obigen Befehl Folgendes voran:

git config remote.Origin.fetch '+refs/heads/*:refs/remotes/Origin/*'

da remote.Origin.fetch beim Abrufen nur einen bestimmten Zweig unterstützen konnte, insbesondere, wenn Sie Ihr Repo mit --single-branch geklont haben. Überprüfen Sie dies mit: git config remote.Origin.fetch.

Danach sollten Sie in der Lage sein, jede Filiale auszuchecken.

Siehe auch:


Um alle Zweige auf die Fernbedienung zu übertragen, verwenden Sie:

git Push --all

schließlich --mirror, um alle Referenzen zu spiegeln.


Wenn Sie ein Repository duplizieren möchten, lesen Sie: Duplizieren eines Repositorys Artikel bei GitHub.

25
kenorb

Normalerweise benutze ich nichts anderes als Befehle wie diesen:

git fetch Origin
git checkout --track Origin/remote-branch

Eine etwas kürzere Version:

git fetch Origin
git checkout -t Origin/remote-branch
24
marioosh

Ich glaube, Sie haben das Repository geklont durch:

git clone https://github.com/pathOfrepository

Wechseln Sie nun mit cd in diesen Ordner:

cd pathOfrepository

Wenn Sie git status eingeben, sehen Sie alle:

   On branch master
Your branch is up-to-date with 'Origin/master'.
nothing to commit, working directory clean

So zeigen Sie alle ausgeblendeten Zweigarten an:

 git branch -a

Es werden alle entfernten Branchen aufgelistet.

Wenn Sie jetzt einen bestimmten Zweig auschecken möchten, geben Sie einfach Folgendes ein:

git checkout -b localBranchName Origin/RemteBranchName
15

Wenn Sie hier nach einer Lösung suchen, um alle Zweige abzurufen und dann alles auf einen anderen Git-Server zu migrieren, habe ich den folgenden Prozess zusammengestellt. Wenn Sie nur alle Zweige lokal aktualisieren möchten, halten Sie an der ersten leeren Zeile an.

git clone <ORIGINAL_Origin>
git branch -r | awk -F'Origin/' '!/HEAD|master/{print $2 " " $1"Origin/"$2}' | xargs -L 1 git branch -f --track 
git fetch --all --Prune --tags
git pull --all

git remote set-url Origin <NEW_Origin>
git pull
<resolve_any_merge_conflicts>
git Push --all
git Push --tags
<check_NEW_Origin_to_ensure_it_matches_ORIGINAL_Origin>
14
ingyhere

Nachdem Sie das Master-Repository geklont haben, können Sie es einfach ausführen

git fetch && git checkout <branchname>
12
Davidacce

Looping schien bei mir nicht zu funktionieren und ich wollte Origin/Master ignorieren. Hier ist, was für mich gearbeitet hat.

git branch -r | grep -v HEAD | awk -F'/' '{print $2 " " $1"/"$2}' | xargs -L 1 git branch -f --track

Nachdem:

git fetch --all
git pull --all
9
poxion

Stellen Sie sicher, dass alle Remote-Zweige in der Datei .git/config abrufbar sind.

In diesem Beispiel kann nur der Zweig Origin/production abgerufen werden, auch wenn Sie versuchen, git fetch --all auszuführen. Es wird jedoch nur der Zweig production abgerufen:

[Origin]
fetch = +refs/heads/production:refs/remotes/Origin/production

Diese Zeile sollte ersetzt werden durch:

[Origin]
fetch = +refs/heads/*:refs/remotes/Origin/*

Führen Sie dann git fetch etc ... aus.

9
Ahmad

Nur diese drei Befehle erhalten alle Zweige:

git clone --mirror repo.git  .git     (gets just .git  - bare repository)

git config --bool core.bare false

git reset --hard
7

Ich habe ein kleines Skript geschrieben, um das Klonen eines neuen Repos zu verwalten und lokale Zweige für alle Remote-Zweige zu erstellen.

Sie finden die neueste Version hier :

#!/bin/bash

# Clones as usual but creates local tracking branches for all remote branches.
# To use, copy this file into the same directory your git binaries are (git, git-flow, git-subtree, etc)

clone_output=$((git clone "[email protected]" ) 2>&1)
retval=$?
echo $clone_output
if [[ $retval != 0 ]] ; then
    exit 1
fi
pushd $(echo $clone_output | head -1 | sed 's/Cloning into .\(.*\).\.\.\./\1/') > /dev/null 2>&1
this_branch=$(git branch | sed 's/^..//')
for i in $(git branch -r | grep -v HEAD); do
  branch=$(echo $i | Perl -pe 's/^.*?\///')
  # this doesn't have to be done for each branch, but that's how I did it.
  remote=$(echo $i | sed 's/\/.*//')
  if [[ "$this_branch" != "$branch" ]]; then
      git branch -t $branch $remote/$branch
  fi
done
popd > /dev/null 2>&1

Um es zu verwenden, kopieren Sie es einfach in Ihr Git-Bin-Verzeichnis (für mich ist das C:\Program Files (x86)\Git\bin\git-cloneall) und dann in der Befehlszeile:

git cloneall [standard-clone-options] <url>

Es wird wie gewohnt geklont, es werden jedoch lokale Verfolgungszweige für alle Remote-Zweige erstellt.

4
tstone2077

So rufen Sie alle Git Branches ab, die eine einzelne Fernbedienung verfolgen

Dies wurde getestet und funktioniert unter Red Hat und Git Bash unter Windows 10.


TLDR:

for branch in `git branch -r|grep -v ' -> '|cut -d"/" -f2`; do git checkout $branch; git fetch; done;

Erklärung:

Der eine Liner checkt aus und holt dann alle Zweige außer HEAD.

Listen Sie die Remote-Tracking-Zweige auf.

git branch -r

Ignoriere HEAD.

grep -v ' -> '

Nehmen Sie den Filialnamen von den Remote-Computern ab.

cut -d"/" -f2

Kasse aller Filialen, die eine einzige Fernbedienung verfolgen.

git checkout $branch

Abrufen für ausgecheckten Zweig.

git fetch

Technisch ist der Abruf für neue lokale Zweige nicht erforderlich.

Dies kann entweder für fetch oder pull Zweige verwendet werden, die sowohl neu sind als auch Änderungen in Remote (s) aufweisen.

Stellen Sie nur sicher, dass Sie nur ziehen, wenn Sie zum Zusammenführen bereit sind.


Test Setup

Checken Sie ein Repository mit einer SSH-URL aus.

git clone [email protected]

Vorher

Überprüfen Sie die Filialen vor Ort.

$ git branch
* master

Befehle ausführen

Führen Sie den einen Liner aus.

for branch in `git branch -r|grep -v ' -> '|cut -d"/" -f2`; do git checkout $branch; git fetch; done;

Nachher

Überprüfen Sie, ob lokale Zweige Remote-Zweige enthalten.

$ git branch
  cicd
  master
* preprod
3
Greg Weigner

Folgendes würde ich für robust halten:

  • Aktualisiert die Fernverfolgung für vorhandene Filialen nicht
  • Versucht nicht, HEAD zu aktualisieren, um Origin/HEAD zu verfolgen
  • Ermöglicht andere als Origin genannte Fernbedienungen
  • Richtig Shell zitiert
for b in $(git branch -r --format='%(refname:short)'); do
  [[ "${b#*/}" = HEAD ]] && continue
  git show-ref -q --heads "${b#*/}" || git branch --track "${b#*/}" "$b";
done
git pull --all

Es ist nicht erforderlich, git fetch --all als Übergabe -all an git pull zu übergeben, um diese Option an das interne fetch zu übergeben.

Dank an diese Antwort .

3
Tom Hale

Hier ist eine Perl-Version des Einzeilers in der akzeptierten Antwort:

git branch -r | Perl -e 'while(<>) {chop; my $remote = $_; my ($local) = ($remote =~ /Origin\/(.*)/); print "git branch --track $local $remote\n";}' > some-output-file

Sie können die Ausgabedatei als Shell-Skript ausführen, wenn Sie möchten.

Wir haben aus Versehen unser Projektarchiv "Stash" gelöscht. Zum Glück hatte jemand kurz vor dem Unfall eine Gabel angelegt. Ich habe die Gabel zu meinem Einheimischen geklont (ich werde die Details darüber weglassen). Sobald ich die Gabel voll in meinem Lokal hatte, fuhr ich einen Einzeiler. Ich habe die URL der Fernbedienung (in meinem Fall Origin) so geändert, dass sie auf das Ziel-Repository verweist, in das wir die Wiederherstellung durchgeführt haben:

git remote set-url Origin <remote-url>

Und schob schließlich alle Zweige zu Origin wie folgt:

git Push --all Origin

und wir waren wieder im Geschäft.

2
Jose Quijada

Für Windows-Benutzer, die PowerShell verwenden:

git branch -r | ForEach-Object {
    # Skip default branch, this script assumes
    # you already checked-out that branch when cloned the repo
    if (-not ($_ -match " -> ")) {
        $localBranch = ($_ -replace "^.*/", "")
        $remoteBranch = $_.Trim()
        git branch --track "$localBranch" "$remoteBranch"
    }
}
git fetch --all
git pull --all
2
kiewic

Wir können alle Zweig- oder Tag-Namen in eine temporäre Datei einfügen und dann für jeden Namen/Tag einen Git-Pull durchführen:

git branch -r | grep Origin | grep -v HEAD| awk -F/ '{print $NF}' > /tmp/all.txt
git tag -l >> /tmp/all.txt
for tag_or_branch in `cat /tmp/all.txt`; do git checkout $tag_or_branch; git pull Origin $tag_or_branch; done
1
anhlc

Um die Fehlermeldung "fatal: Ein Zweig mit dem Namen" Origin/master "existiert bereits." Zu vermeiden, benötigen Sie Folgendes:

git branch -r | grep -v '\->'  | grep -v `git branch | awk '/\*/ { print $2; }'`| while read remote; do git branch --track "${remote#Origin/}" "$remote"; done
1
HaxtraZ

Wenn Sie Probleme mit fetch --all haben, verfolgen Sie Ihren Remote-Zweig:

git checkout --track Origin/%branchname%
1

Für Visual Studio-Benutzer auf der Package Manager-Konsole:

git Branch | % {git fetch upstream; git merge upstream/master}

0
Jose Ortega

Basierend auf der Antwort von Learath2 habe ich Folgendes getan, nachdem ich git clone [...] und cd- in das erstellte Verzeichnis eingegeben habe:

git branch -r | grep -v master | awk {print\$1} | sed 's/^Origin\/\(.*\)$/\1 &/' | xargs -n2 git checkout -b

Hat für mich gearbeitet, aber ich kann nicht wissen, dass es für dich funktionieren wird. Achtung.

0
erikano

Habe viele Möglichkeiten ausprobiert, nur diese ist einfach und funktioniert bei mir.

for branch in $(git ls-remote -h [email protected]<your_repository>.git | awk '{print $2}' | sed 's:refs/heads/::')
do
  git checkout "$branch"
  git pull
done
0
PageNotFound
git remote add Origin https://yourBitbucketLink

git fetch Origin

git checkout -b yourNewLocalBranchName Origin/requiredRemoteBranch (use tab :D)

Jetzt vor Ort ist Ihr yourNewLocalBranchName Ihr requiredRemoteBranch.

0
chhotu sardar