Imposta git per tirare e spingere tutti i rami


616

Vorrei spingere e tirare tutti i rami per impostazione predefinita, compresi quelli appena creati.

C'è un'impostazione che posso definire per questo?

Altrimenti, quando aggiungo un nuovo ramo, localmente e voglio estrarlo dal server, qual è il modo più semplice per farlo?

Ho creato un nuovo ramo con lo stesso nome e ho provato a estrarlo ma non funziona. Mi chiede per tutta la configurazione remota del ramo. Come lo imposto.


4
"e ho provato a tirare ma non funziona". Dettagli per favore. Mostraci quale comando hai provato a usare.
Jakub Narębski,

Risposte:


1298

Il modo più semplice è fare:

git push --all origin

Questo spingerà tag e rami.


10
Tra dozzine di risposte che ho trovato su SO e in altri luoghi, questo è il modo più semplice per spingere un ramo locale appena creato, senza toccare la configurazione. Grazie!
András Szepesházi,

174
E se aggiungi -uuna volta, ad esempio git push --all origin -u, il monitoraggio è impostato e successivamente puoi semplicemente utilizzarlo git push.
Alec,

23
Per la versione 1.7.12.3 di git ho dovuto usare git push --tags origintutti i tag.
thisgeek,

17
Guarda anche "--mirror" invece di "--all" questa spinta più roba
Loda

21
ATTENZIONE: se si dispone di un sacco di rami LOCALI che non sono stati ripuliti (funzionalità, hotfix) o che non sono stati ripuliti correttamente (me), questo inonderà il telecomando. Dannazione. E abbiamo appena fatto una potatura. Non sono sicuro del perché il mio locale avesse lasciato così tante filiali.
Jack

147

Con git moderno recuperi sempre tutti i rami (come rami di tracciamento remoto nello refs/remotes/origin/*spazio dei nomi, visibili con git branch -ro git remote show origin).

Per impostazione predefinita (vedere la documentazione della push.defaultvariabile di configurazione) si inviano i rami corrispondenti , il che significa che per prima cosa è necessario fare git push origin branchin modo che git lo spinga sempre attivo git push.

Se vuoi spingere sempre tutti i rami , puoi impostare push refspec. Supponendo che il telecomando sia chiamato originè possibile utilizzare git config :

$ git config --add remote.origin.push '+refs/heads/*:refs/heads/*'
$ git config --add remote.origin.push '+refs/tags/*:refs/tags/*'

o modifica direttamente il .git/configfile per avere qualcosa di simile al seguente:

["origine" remota]
        url = user@example.com: /srv/git/repo.git
        fetch = + refs / heads / *: refs / telecomandi / origin / *
        fetch = + refs / tags / *: refs / tags / *
        push = + refs / heads / *: refs / heads / *
        push = + refs / tags / *: refs / tags / *

3
@Merc: git push --all originva bene per una volta pubblicare tutti i rami e i tag, sebbene l'impostazione predefinita fino alla semantica 'matching' della versione attuale significhi che in seguito spingerai tutti i rami ... a meno che tu non aggiunga un nuovo ramo o tag. L' impostazione su "push [...] tutti i rami di default" è come scritta.
Jakub Narębski,

È possibile migliorare la risposta per aggiungere il modo di riconfigurare Git in questo modo. Ciò è utile per gli utenti che hanno impostato la modalità semplice.
Dereckson,

3
Questo è cambiato da git 2.0. Push predefinito è semplice, non corrisponde più.
mike,

Ho provato questo e ho ricevuto un errore al push: fatal: Invalid refspec ''+refs/heads/*:refs/heads/*'' (Nota: sono su git 2.0. Sto ancora
Brian Lacy,

2
Ora il valore predefinito per push.defaultè simple.
Hasanghaforian,

32

Includere + nella specifica push è probabilmente una cattiva idea, poiché significa che git farà felicemente una spinta non veloce anche senza -f , e se il server remoto è impostato per accettarli, si può perdere la cronologia.

Prova solo questo:

$ git config --add remote.origin.push 'refs/heads/*:refs/heads/*'
$ git config --add remote.origin.push 'refs/tags/*:refs/tags/*'
$ git config --add remote.origin.fetch 'refs/heads/*:refs/remotes/origin/*'
$ git config --add remote.origin.fetch 'refs/tags/*:refs/tags/*'

Puoi anche aggiungere l' --globalopzione a ciascuno di questi per renderlo il valore predefinito globale per tutti i tuoi repository.
Ether

È un peccato che il + sia aggiunto automaticamente da Git quando lo fa git remote add.
Ether

27

Avevo usato i comandi seguenti per migrare tutti i rami nel nuovo repository.

~$ git clone --mirror <url_of_old_repo>
~$ cd <name_of_old_repo>
~$ git remote add new-origin <url_of_new_repo>
~$ git push new-origin master
~$ git push new-origin --mirror

NOTA : durante la clonazione di un repo da Atlassian Stash a AWS CodeCommit (repository vuoto) ho dovuto usare il comando penultimo (ovvero push first first ). Non sono sicuro del motivo, ma dopo aver premuto ( git push new-origin --mirror) il ramo predefinito si riferiva a qualche altro ramo rispetto a master.


1
Perfetto per spostare un repository su un altro host. Grazie!
Pelmered

2
Questo è davvero solo un metodo utile. Usa git push new_origin --allsemplicemente i tuoi attuali rami locali su new_origin, non tutti i rami di origine.
yanzi1225627,

Solo notando che questo rende un --barerepository, che è un po 'diverso da un normale repository, ha solo i .gitfile, non i tuoi file. È abbastanza perfetto se non hai intenzione di lavorarci. Vedi --baree --mirror git-scm.com/docs/git-clone .
Jmmut,

Anche se ha solo i file .git e non il vero codice sorgente, se esegui un aggiornamento remoto recupererà tutto dall'origine alla destinazione.
SanthoshM

Questo è stato un vero toccasana! Questo metodo "master prima del mirror" ha risolto il problema con Bitbucket come destinazione e credendo che un ramo diverso da "master" fosse il ramo principale.
Toddius Zho,

12

Se si stanno spostando i rami in un nuovo repository da uno vecchio e NON si hanno tutti i vecchi repository locali in locale, sarà necessario prima rintracciarli.

for remote in `git branch -r | grep -v '\->'`; do git branch --track $remote; done

Quindi aggiungi il tuo nuovo repository remoto:

git remote add bb <path-to-new-repo>

Quindi puoi inviare tutto usando questo comando:

git push -u bb --all

Oppure puoi configurare il repository usando i comandi git config indicati nelle altre risposte qui se non lo fai una volta o stai solo cercando di spostare i rami locali.

Il punto importante, le altre risposte spingono solo tutti i rami LOCALI. Se i rami esistono solo su un repository REMOTE alternativo, non si sposteranno senza prima rintracciarli. Il ciclo for presentato qui sarà di aiuto.


A proposito, sto usando "bb" al posto di "origin" qui perché presumo che il tuo repository originale / vecchio sia stato chiamato "origin" ed è probabilmente ancora attaccato a quell'etichetta. "bb" è per Bitbucket, dove ho spostato il mio repository originale in, ma puoi chiamarlo qualcosa di più applicabile come "neworigin" se preferisci.
Lance Cleveland,

2
Non ha funzionato per me. Finì con tutti i rami remoti che
tracciavano

2
AFAIK questo non dovrebbe funzionare, come da commento di @jhsowter. il comando giusto per me per tracciare un ramo remoto in un repository appena clonato è git branch --track reponame origin/reponamealtrimenti riceverai tutti i rami remoti tracciati sull'attuale ramo locale
Pioneer Skies,

Ho cambiato lo snippet di raccolta repository in git branch -r | grep -v '\->' | sed 's/ origin\///', che fornisce solo il nome del ramo remoto.
Paul Hicks,

6

Per vedere tutti i rami senza usare git branch -aè necessario eseguire:

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

Ora puoi vedere tutti i rami:

git branch

Per spingere tutti i rami prova:

git push --all

1
λ git fetch --all origin fatal: fetch --all non
accetta

ci stai provando git fetch --all?
tokhi

4

Se si stanno spostando tutti i rami in un nuovo repository da uno precedente, nel proprio repository locale è necessario impostare il rilevamento di ciascun ramo sui rami di origine esistenti, prima di passare al nuovo repository, altrimenti tutti i rami di origine non verranno visualizzati in la nuova origine. Fallo manualmente monitorando o controllando ogni ramo, oppure usa un solo liner:

for remote in `git branch -r | grep -v '\->' | grep -v master`; do git branch --track `echo $remote|sed 's=origin/=='` `echo $remote`; done

Questo comando a una riga si basa sulle versioni di esso in altre risposte in questa pagina, ma è probabilmente migliore perché:

  1. imposta correttamente il tracciamento del ramo, a differenza di alcune vecchie varianti di questo comando in questa pagina che forniscono solo un parametro per --track e quindi ogni ramo finisce per tracciare il master - non va bene
  2. nomina le filiali locali senza il prefisso "origine /" che personalmente non desidero - ed è coerente con ciò che accade quando si verifica un ramo normalmente.
  3. salta il master di monitoraggio poiché ciò sta già accadendo
  4. in realtà non controlla nulla, quindi è veloce
  5. evita di inciampare su -> nell'output di git branch -r

Quindi, se si cambia origine, sostituire il collegamento con l'origine precedente e scegliere un nuovo telecomando. Assicurati di creare prima il nuovo telecomando, usando la GUI di bitbucket / github, ma non aggiungere alcun file ad esso o ci sarà un problema di unione. Per esempio

git remote set-url origin git@bitbucket.org:YOUR/SOMEREPO.git

Adesso spingi. Nota anche il secondo comando è necessario per inviare i tag:

git push -u --all origin
git push --tags origin

0

Soluzione senza hardcoding originin config

Usa quanto segue nel tuo gitconfig globale

[remote]
    push = +refs/heads/*
    push = +refs/tags/*

Questo spinge tutti i rami e tutti i tag

Perché NON dovresti hardcode origin in config?

Se hai hardcode:

  1. Ti ritroverai origincome telecomando in tutti i repository. Quindi non sarai in grado di aggiungere l'origine, ma devi usarloset-url .
  2. Se uno strumento crea un telecomando con un nome diverso, tutte le configurazioni non verranno applicate. Quindi dovrai rinominare il telecomando, ma rinominare non funzionerà perché originesiste già (dal punto 1) ricorda :)

Il recupero è già curato dai git moderni

Secondo la risposta di Jakub Narębski:

Con git moderno recuperi sempre tutti i rami (come rami di tracciamento remoto nello spazio dei nomi ref / remotes / origin / *

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.