Come recuperare tutti i rami Git


1507

Ho clonato un repository Git, che contiene circa cinque rami. Tuttavia, quando lo faccio git branchvedo solo uno di loro:

$ git branch
* master

So che posso fare git branch -aper vedere tutti i rami, ma come potrei tirare tutti i rami localmente, quindi quando lo faccio git branch, mostra quanto segue?

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


2
Questa domanda mostra come ottenere tutti i rami dopo aver usato l' --single-branchimpostazione durante la clonazione: stackoverflow.com/questions/17714159/… ( git fetch --allnon funzionerà mai se hai specificato solo un ramo!)
Matthew Wilcoxson,

2
Non vedrai mai quell'output perché l'asterisco rappresenta il ramo attualmente in fase di checkout. Dal momento che è possibile effettuare il checkout di un solo ramo alla volta, è possibile avere un solo asterisco a sinistra dell'elenco dei rami.
Robino,

5
Ho visto molte risposte, ma nessuna di queste ha menzionato quello che penso sia probabilmente il modo più semplice per fare quello che vuoi: git clone --bare <repo url> .git (nota che devi aggiungere "--bare" e ".git" alla fine per clonare il repository come repository "bare"), quindi git config --bool core.bare false(imposta il flag "bare" su false), quindi git reset --hard(sposta HEAD sull'HEAD corrente sul repository). Ora, se dovessi git branchvedere tutti i rami del repository che hai clonato.
Gabriel Ferraz,

4
@GabrielFerraz Quindi stai abusando della funzionalità di commento su Stack Overflow. Gli utenti possono votare il tuo commento ma non il voto negativo.
pipe

Risposte:


2051

Puoi recuperare tutti i rami da tutti i telecomandi in questo modo:

git fetch --all

È fondamentalmente una mossa di potere .

fetchaggiorna le copie locali delle filiali remote, quindi è sempre sicuro per le filiali locali MA :

  1. fetchnon aggiornerà le filiali locali (che tengono traccia delle filiali remote); se vuoi aggiornare le tue filiali locali devi comunque estrarre tutte le filiali.

  2. fetchnon creerà filiali locali (che tengono traccia delle filiali remote), devi farlo manualmente. Se si desidera elencare tutti i rami remoti: git branch -a

Per aggiornare le filiali locali che tengono traccia delle filiali remote:

git pull --all

Tuttavia, questo può essere ancora insufficiente. Funzionerà solo per le filiali locali che tracciano filiali remote. Per tenere traccia di tutti i rami remoti, eseguire questo oneliner PRIMA git pull --all :

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

TL; versione DR

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

(Sembra che pull recuperi tutti i rami da tutti i telecomandi, ma cerco sempre prima solo per essere sicuro.)

Esegui il primo comando solo se sul server sono presenti filiali remote che non sono tracciate dalle filiali locali.

PS AFAIK git fetch --alle git remote updatesono equivalenti.



Il commento di Kamil Szot , che la gente ha trovato utile.

Ho dovuto usare:

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

perché il tuo codice ha creato filiali locali denominate origin/branchnamee ho ricevuto "refname 'origin / branchname' è ambiguo ogni volta che mi riferivo ad esso.


42
Scusate. Non riesco a immaginare che questo sia ciò che l'OP vuole davvero. Il comando 'pull' è 'fetch + merge' e la parte di unione sovrapporrà tutti i rami uno sopra l'altro, lasciando un casino gigantesco.
GoZoner,

10
quel recupero non creerebbe un nuovo ramo remoto con cui devi ancora verificarlogit checkout -b localname remotename/remotebranch
Learath2

125
Ho dovuto usarlo for remote in `git branch -r`; do git branch --track ${remote#origin/} $remote; done perché il tuo codice ha creato filiali locali denominate origin / branchname e stavo ottenendo "refname 'origin / branchname' è ambiguo ogni volta che mi riferivo ad esso.
Kamil Szot

22
Non so se sto usando una versione diversa di GIT, ma ho dovuto modificare lo script in git pull --all; for remote in `git branch -r | grep -v \>`; do git branch --track ${remote#origin/} $remote; done. La modifica rimuove HEAD.
kim3er,

16
Per la gente di Windows:for /F %remote in ('git branch -r') do ( git branch --track %remote) && git fetch --all && git pull --all
Max

719

Per elencare le filiali remote:
git branch -r

Puoi verificarli come filiali locali con:
git checkout -b LocalName origin/remotebranchname


88
Questo è esattamente quello che stavo cercando quando ho trovato la domanda sopra. Ho il sospetto che molte persone che cercano come estrarre un ramo remoto sicuramente non vogliono unire il ramo nella loro copia di lavoro corrente, ma vogliono un ramo locale identico a quello remoto.
Frug

12
Anche se il ramo non è visibile localmente, posso farlo git checkout remotebranchnamee funziona. qual è la differenza con la tua soluzione?
François Romain,

12
Il suo comportamento predefinito ora. Non era il caso delle versioni precedenti di git. Usando git checkout remotebranchnameusato solo per creare un nuovo ramo non correlato che si chiama remotebranchname .
Learath2,

12
La risposta accettata fa qualcosa di fondamentalmente diverso e ad essere sincero non capisco nemmeno perché sia ​​la risposta accettata
Learath2

8
L'OP ha chiesto tutte le filiali. Questa risposta fa solo una.
Ted Bigham,

193

Sarà necessario creare filiali locali che tengono traccia delle filiali remote.

Supponendo che tu abbia un solo telecomando chiamato origin, questo frammento creerà filiali locali per tutti quelli di localizzazione remota:

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

Successivamente, git fetch --allaggiornerà tutte le copie locali delle filiali remote.

Inoltre, git pull --allaggiornerà i rami di tracciamento locali, ma a seconda dei commit locali e del modo in cui è impostata l'opzione di configurazione "Unisci", potrebbe creare un commit di unione, avanzamento rapido o errore.


5
Questo rafforza la soluzione contro i nomi di rami contenenti metacaratteri di shell (come da commento di pinkeen sull'altra risposta) ed evita un output di errore spurio: git branch -r | grep -v - '->' | mentre leggi il telecomando; do git branch --track "$ {remote # origin /}" "$ remote" 2> & 1 | grep -v 'esiste già'; fatto
Daira Hopwood l'

6
Sei sicuro che git pull --allaggiornerà tutti i rami di localizzazione locali? Per quanto ne so, aggiorna solo il ramo corrente da tutti i telecomandi.
Andy,

3
Fatto. Le filiali locali corrispondenti alle filiali remote non sono state create. Qual è il comando git che dice semplicemente "estrarre tutti i rami remoti creando quelli locali se non esistono?"
JosephK,

@JosephK forse il tuo telecomando non viene chiamato origin? Vedi questa risposta che funzionerà su tutti i nomi remoti.
Tom Hale,

@TomHale Era "origine", ma grazie per la risposta, anche se pazzo è necessario molto per fare quello che dovrebbe essere una o forse due bandiere. Ora sto provando gitless, per cercare di evitare la follia di alcuni aspetti di git.
JosephK,

116

Se fate:

git fetch origin

allora saranno tutti lì a livello locale. Se poi esegui:

git branch -a

li vedrai elencati come telecomandi / origine / nome-ramo. Dal momento che sono lì a livello locale, puoi fare qualsiasi cosa tu voglia con loro. Per esempio:

git diff origin/branch-name 

o

git merge origin/branch-name

o

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

5
Ho appena trovato questa pagina su Google ... questo era il tipo di risposta che stavo cercando. Ho provato il primo comando ma ho ricevuto un errore: [$ git fetch --all origine fatale: fetch --all non accetta un argomento repository] --- L'uso di "git fetch --all" sembra fare il trucco. Grazie per il vantaggio!
Longda,

1
Risolto (eliminato --all)
GoZoner

12
git fetch -allrecupera tutti i rami di tutti i telecomandi. git fetch originrecupera tutti i rami del telecomando origin. Il secondo è quello che l'OP stava chiedendo.
GoZoner,

3
--allsignifica "tutti i telecomandi", non "tutti i rami di un dato telecomando". Quest'ultimo è implicito da qualsiasi recupero da un telecomando.
spaziatore

2
Questo non è il modo di trascinare tutti i rami nel repository locale, dal repository remoto.
Vladimir Despotovic,

69
$ git remote update
$ git pull --all

Ciò presuppone che tutti i rami siano tracciati.

Se non lo sono, puoi sparare in Bash:

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

Quindi eseguire il comando.


3
Quando provo a ottenere lo stesso risultato di cui sopra.
David542,

4
Lo stesso di @JacobLowe, ho ricevuto l'errore, ma ha funzionato comunque; 'fatale: esiste già un ramo chiamato' origine / maestro '.
AnneTheAgile,

Questo è brutto in quanto proverà a creare un ramo per il ->quale probabilmente esisterà nell'output di git branch -r`origin / HEAD -> origin / master`
Tom Hale,

Inoltre, non funziona. Ottengo l'output: Branch 'origin/quote-filenames' set up to track local branch 'master'. L'output desiderato è: Branch 'quote-filenames' set up to track remote branch 'quote-filenames' from 'origin'. Questo è all'indietro , impostando l'origine per seguire il telecomando. Vedi questa risposta per una correzione.
Tom Hale,

proprio quello di cui avevo bisogno. Da quando ho cambiato Mac, anche dopo aver clonato il repository non sono stato in grado di verificare altri rami remoti e git fetchnon funzionava. Quindi la lezione qui è che è necessario tenere traccia dei rami remoti. Gracias!
Victor Ramos,

58

Il forloop Bash non funzionava per me, ma questo ha fatto esattamente quello che volevo. Tutti i rami della mia origine rispecchiavano localmente lo stesso nome.

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

Vedi il commento di Mike DuPont di seguito. Penso che stavo provando a farlo su un server Jenkins che lo lascia in modalità testa staccata.


6
Questo produce fatal: Refusing to fetch into current branch refs/heads/master of non-bare repositorydopo un semplice clone. Devi prima staccare la testa. L'ho fatto congit checkout <SHA>
brannerchinese il

6
La mia soluzione con questo è git checkout --detach # detach the heade poigit fetch origin \'+refs/heads/*:refs/heads/*
Mike DuPont,

1
Questo ha funzionato per me, tranne per il fatto che utilizzo anche il parametro --tags. Vorrei che ci fosse un front-end standard e semplice per git, il numero di cose semplici in git che hanno bisogno di oltre 10 risposte di overflow dello stack è ridicolo!
kristianp,

1
@kristianp Hai verificato Ungit o GitKraken?
dragon788,

@ dragon788 Sto usando SourceTree per una GUI git, ma stavo davvero parlando di una riga di comando più semplice per le attività di scripting.
kristianp,

51

Usa git fetch && git checkout RemoteBranchName.

Funziona molto bene per me ...


6
Questa è la nuova migliore risposta, tutti voi. Non so se forse questo non fosse possibile prima, ma le versioni recenti di Git noteranno almeno che stai provando a fare il checkout di un ramo remoto e configureranno automaticamente il ramo di tracciamento locale per te (e non hai bisogno per specificare origin/branch; basta dire solo branch).
Neil Traft,

9
Questo non risponde alla domanda originale: "Come potrei tirare tutti i rami localmente?" Li sta tirando uno per uno, che non è scalabile.
ingyhere

Questa è stata l'unica risposta che mi ha permesso di estrarre filiali remote in ogni situazione che ho incontrato
Emmanuel Buckshi,

38

Quando si clona un repository, tutte le informazioni sui rami vengono effettivamente scaricate ma i rami vengono nascosti. Con il comando

$ git branch -a

puoi mostrare tutti i rami del repository e con il comando

$ git checkout -b branchname origin/branchname

è quindi possibile "scaricarli" manualmente uno alla volta.


Tuttavia, c'è un modo molto più pulito e veloce, anche se è un po 'complicato. Sono necessari tre passaggi per ottenere questo risultato:

  1. Primo passo

    crea una nuova cartella vuota sul tuo computer e clona una copia speculare della cartella .git dal repository:

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

    il repository locale all'interno della cartella my_repo_folder è ancora vuoto, ora c'è solo una cartella nascosta .git che puoi vedere con un comando "ls -alt" dal terminale.

  2. Secondo passo

    cambia questo repository da un repository vuoto (bare) a un repository regolare impostando il valore booleano "bare" delle configurazioni git su false:

    $ git config --bool core.bare false
    
  3. Terzo passo

    Prendi tutto ciò che si trova nella cartella corrente e crea tutti i rami sul computer locale, rendendolo quindi un normale repository.

    $ git reset --hard
    

Quindi ora puoi semplicemente digitare il comando git branche puoi vedere che tutti i rami sono stati scaricati.

Questo è il modo rapido in cui puoi clonare un repository git con tutti i rami contemporaneamente, ma non è qualcosa che vuoi fare per ogni singolo progetto in questo modo.


1
Votato per menzione di rami nascosti. mi ha aiutato a comprendere immensamente il monitoraggio delle filiali locali.
mburke05,

È una buona risposta, ma la domanda implica qualcosa per l'uso quotidiano. Non è pratico clonare il repository ogni volta.
Z. Khullah

Perché il reset crea tutti i rami localmente?
Z. Khullah

@ Z.Khullah non è il reset che crea tutti i rami, ma il clone --mirror. Sfortunatamente per noi, ciò crea anche un repository nudo, che è ciò che cambiano i passaggi 2 e 3.
ScottJ,

29

Puoi recuperare tutti i rami:

git fetch --all

o:

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

Il --depth=10000parametro può essere utile se hai un repository con superficiale.


Per tirare tutti i rami, utilizzare:

git pull --all

Se above non funziona, precede il comando precedente con:

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

poiché remote.origin.fetchpotrebbe supportare solo un ramo specifico durante il recupero, specialmente quando hai clonato il tuo repository con --single-branch. Controllare questo: git config remote.origin.fetch.

Dopodiché dovresti essere in grado di verificare qualsiasi filiale.

Guarda anche:


Per inviare tutti i rami al telecomando, utilizzare:

git push --all

eventualmente --mirrorper rispecchiare tutti i riferimenti.


Se il tuo obiettivo è duplicare un repository, consulta: Duplicazione di un articolo di repository su GitHub.


1
Fantastico ... ho provato tutto il resto prima della tua soluzione in questa pagina. Molte grazie!
Sujoy

2
Ho usato shallow cloning ( depth=1) e la configurazione ha anche specificato un ramo specifico per fetch- il depth=1000parametro era la correzione che mi ha aiutato a fare il checkout di un ramo remoto specifico
Sandra,

2
pull --allnon tira tutti i rami, ma tutti i telecomandi
Z. Khullah

Bel trucco con la configurazione, però! Li prenderei tutti, sempre
Z. Khullah

Ho controllato la configurazione come hai scritto, funziona ancora solo con il ramo corrente. Sembra che tutte le risposte qui non funzionino per me ...
Alexei Martianov,

25

Di solito non uso altro che comandi come questo:

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

Una versione un po 'più corta:

git fetch origin
git checkout -t origin/remote-branch

17

Credo che tu abbia clonato il repository da:

git clone https://github.com/pathOfrepository

Ora vai a quella cartella usando cd:

cd pathOfrepository

Se digiti git statuspuoi vedere tutto:

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

Per vedere tutti i tipi di rami nascosti:

 git branch -a

Elencherà tutti i rami remoti.

Ora se vuoi fare il checkout su un ramo particolare, digita:

git checkout -b localBranchName origin/RemteBranchName

16

Se stai cercando una soluzione per ottenere tutte le filiali e quindi migrare tutto su un altro server Git, ho messo insieme il processo seguente. Se vuoi solo aggiornare tutti i rami localmente, fermati alla prima riga vuota.

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>

3
Molto utile; esattamente quello di cui avevo bisogno. L'unica cosa che dovevo cambiare era nella seconda riga, ho aggiunto virgolette singole intorno a "HEAD" e "master"; probabilmente perché sto usando zsh. Grazie!
sockmonk,

Questo sta fondamentalmente nel modo seguente: (1) Ottenere i nomi attuali dei rami remoti [non head, non master]; (2) Dire completamente a Git di seguirli [non tutte le soluzioni fanno questo]; (3) Recupero e estrazione di tutto da questi rami [compresi i tag]; (4) Impostare una nuova origine e camminare spingendo assolutamente tutto verso l'alto. Ancora una volta, la maggior parte delle altre soluzioni non riesce a spostare tutti i pezzi. Questo fa tutto.
ingyhere il

1
Ho rimosso l'antipasto di eseguire grep quindi awk e ho condensato i comandi grep nel comando awk. Grazie triplo !
ingherequi

Leggi questo e non scrivere mai git fetch git pull stackoverflow.com/a/292359/1114926
Green

Git pullfa davvero un fetchprimo, ma è più facile dire se il problema proviene dalla fetchparte pullo dalla mergeparte successiva di pullquando fetchviene eseguita in modo indipendente.
ingyhere

12

Dopo aver clonato il repository principale, puoi semplicemente eseguire

git fetch && git checkout <branchname>

1
semplice. e ha lavorato per ottenere un ramo da origini remote
sirvon,

3
Questo non risponde alla domanda originale: "Come potrei tirare tutti i rami localmente?" Li sta tirando uno per uno, che non è scalabile. Considera il caso di 100 filiali.
ingyhere

10

Assicurarsi che tutti i rami remoti siano inseribili nel .git/configfile.

In questo esempio, origin/productionè possibile accedere solo al ramo, anche se si tenta di non fare git fetch --allnulla, se non recuperare il productionramo:

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

Questa riga dovrebbe essere sostituita da:

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

Quindi eseguire git fetchecc ...


3
Per ispezionare: git config --get remote.origin.fetche poi per (distruttivamente) impostarlo:git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'
qneill

o modifica il file di testo di configurazione nella directory .git, ha funzionato per me
FDIM,

9

Il looping non sembrava funzionare per me e volevo ignorare origin / master. Ecco cosa ha funzionato per me.

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

Dopo di che:

git fetch --all
git pull --all

1
Una variazione di questa è la risposta corretta, ma questa non funziona in tutti i casi limite. Inoltre, i nomi delle filiali possono essere funky. Quindi ho fatto quanto segue: git branch -r | grep -v HEAD | grep –v master | awk -F'origin / '' {print $ 2 "" $ 1 "origin /" $ 2} '| xargs -L 1 git branch -f --track; git fetch --all; git pull --all; E CHE FATTO IL TRUCCO!
ingherequi

3
Un miglioramento stilistico per evitare l' grep | awk antipasto : git branch -r | awk -F 'origin/' '!/HEAD|master/{...
tripleee

7

Solo questi tre comandi otterranno tutti i rami:

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

git config --bool core.bare false

git reset --hard

Questa è in realtà la radice del problema di OP. Se clonato bene, non avrebbe bisogno di fare un pull --all. Ma se è ancora necessario, allora l'altra risposta di @Johnno Nola, supponendo che tutti i rami siano tracciati, mescolati con questa risposta, è la strada da percorrere.
Dr Beco,

7

Perché nessuno risponde alla domanda dei ragazzi e spiega cosa sta succedendo?

  1. Assicurati di tenere traccia di tutti i rami remoti (o di quelli che desideri monitorare) .
  2. Aggiorna i tuoi rami locali per riflettere i rami remoti.

Traccia tutti i rami remoti:

Tieni traccia di tutti i rami esistenti nel repository remoto.

Fallo manualmente:

Sostituiresti <branch>con un ramo che viene visualizzato dall'output di git branch -r.

git branch -r
git branch --track <branch>

Fallo con uno script bash

for i in $(git branch -r | grep -vE "HEAD|master"); do git branch --track ${i#*/} $i; done

Aggiorna le informazioni sulle filiali remote sul tuo computer locale:

In questo modo vengono recuperati gli aggiornamenti sulle filiali dal repository remoto che si sta monitorando nel repository locale. Ciò non altera le filiali locali. Il repository git locale ora è a conoscenza di ciò che è accaduto sui rami dei repository remoti. Un esempio potrebbe essere che un nuovo commit è stato inviato al master remoto, facendo un recupero ora ti avviserà che il tuo master locale è indietro di 1 commit.

git fetch --all

Aggiorna le informazioni sulle filiali remote sul tuo computer locale e aggiorna le filiali locali:

Esegue un recupero seguito da un'unione per tutti i rami dal ramo remoto a quello locale. Un esempio potrebbe essere che un nuovo commit è stato inviato al master remoto, facendo un pull aggiornerà il tuo repository locale sulle modifiche nel ramo remoto e poi le unirà nel tuo ramo locale. Questo può creare un bel casino a causa della fusione dei conflitti.

git pull --all

4

Ho scritto una piccola sceneggiatura per gestire la clonazione di un nuovo repository e creare filiali locali per tutte le filiali remote.

Puoi trovare l'ultima versione qui :

#!/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 "$@" ) 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

Per usarlo, basta copiarlo nella directory di git bin (per me, cioè C:\Program Files (x86)\Git\bin\git-cloneall), quindi, dalla riga di comando:

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

Clona come al solito, ma crea filiali di tracciamento locali per tutte le filiali remote.


4

Come recuperare tutti i rami Git Tracciamento di un singolo telecomando.

Questo è stato testato e funziona su Red Hat e Git Bash su Windows 10.


TLDR:

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

Spiegazione:

L'unico liner verifica e quindi recupera tutti i rami tranne HEAD.

Elencare i rami di tracciamento remoto.

git branch -r

Ignora TESTA.

grep -v ' -> '

Rimuovere il nome della filiale dai telecomandi.

cut -d"/" -f2

Verifica tutti i rami che seguono un singolo telecomando.

git checkout $branch

Scarica per ramo estratto.

git fetch

Tecnicamente il recupero non è necessario per le nuove filiali locali.

Questo può essere usato per entrambi fetch opull rami che sono entrambi nuovi e hanno cambiamenti nei telecomandi.

Assicurati di tirare solo se sei pronto a unire.


Configurazione di prova

Dai un'occhiata a un repository con URL SSH.

git clone git@repository.git

Prima

Controlla le filiali in locale.

$ git branch
* master

Esegui comandi

Eseguire un solo liner.

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

Dopo

Verifica che le filiali locali includano filiali remote.

$ git branch
  cicd
  master
* preprod

4

Per utenti Windows che usano PowerShell:

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

Funziona con i rami con / nel nome: 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" } }
Markus

3

Ecco qualcosa che considererei robusto:

  • Non aggiorna il monitoraggio remoto per le filiali esistenti
  • Non tenta di aggiornare HEADper tenere tracciaorigin/HEAD
  • Consente telecomandi denominati diversi da origin
  • Shell correttamente citato
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

Non è necessario git fetch --allil passaggio -alla git pullpassa questa opzione all'internofetch .

Ringraziamo questa risposta .


2

Ecco una versione Perl del one-liner fornita nella risposta accettata:

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

Se lo desideri, puoi eseguire il file di output come script Shell.

Abbiamo cancellato il nostro repository del progetto Stash per caso. Fortunatamente qualcuno aveva creato un fork proprio prima della perdita accidentale. Ho clonato il fork al mio locale (tralascerò i dettagli di come l'ho fatto). Una volta che ho avuto la forchetta completamente nel mio locale, ho fatto funzionare una linea. Ho modificato l'URL del telecomando (origine nel mio caso) per puntare al repository di destinazione in cui ci stavamo ripristinando:

git remote set-url origin <remote-url>

E infine ha spinto tutti i rami all'origine in questo modo:

git push --all origin

e siamo tornati in affari.


1

Possiamo mettere tutti i nomi di ramo o tag in un file temporaneo, quindi eseguire git pull per ogni nome / tag:

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

Se hai problemi con fetch --allquindi traccia il tuo ramo remoto:

git checkout --track origin/%branchname%

1

Per evitare il messaggio di errore "fatale: esiste già un ramo chiamato" origine / master ".

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

0

Sulla base della risposta di Learath2, ecco cosa ho fatto dopo aver fatto git clone [...]e cdinserito nella directory creata:

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

Ha funzionato per me ma non posso sapere che funzionerà per te. Stai attento.


0
git remote add origin https://yourBitbucketLink

git fetch origin

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

Ora a livello locale sei yourNewLocalBranchNametuo requiredRemoteBranch.


0

Per gli utenti di Visual Studio, sulla console di Package Manager:

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


0

Ho provato molti modi, solo questo è semplice e funziona per me.

for branch in $(git ls-remote -h git@<your_repository>.git | awk '{print $2}' | sed 's:refs/heads/::')
do
  git checkout "$branch"
  git pull
done

0

Imposta alias: (basato sulla risposta principale)

git config --global alias.track-all-branches '!git fetch --all && for remote in `git branch -r`; do git branch --track ${remote#origin/} $remote; done && git fetch --all'

Ora per tracciare tutti i rami:

git track-all-branches

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.