Vuoi spingere il ramo da un telecomando all'altro?


133

Ho impostato i seguenti telecomandi:

$ git remote 
korg
rorg

E i seguenti rami:

$ git branch -a
* (no branch)
  remotes/korg/gingerbread
  remotes/korg/gingerbread-release
  remotes/korg/honeycomb
  remotes/korg/honeycomb-mr1-release
  remotes/korg/master
  remotes/m/android-2.3.3_r1 -> refs/tags/android-2.3.3_r1a
  remotes/m/gingerbread -> korg/gingerbread

Ora desidero spingere tutti i rami remoti da korgalla rorgdistanza. Come lo faccio?

Preferibilmente senza creare una filiale locale per ogni prima, se ciò è evitabile.


Immagino che la risposta a questa sia paragonabile alla risposta a questa: stackoverflow.com/questions/6922700/… .
Legolas,

Risposte:


52

Un test rapido che effettua alcuni repository temporanei mostra che puoi costruire un refspec che può fare questo:

$ git push rorg origin/one:refs/heads/one
Counting objects: 5, done.
Writing objects: 100% (3/3), 240 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
To /tmp/rorg
 * [new branch]      origin/one -> one

Quindi origine / BRANCHNAME: refs / heads / BRANCHNAME

Verifica nel mio rorgtelecomando:

pat@host /tmp/rorg (BARE:master)
$ git graph --all
* 5750bca (HEAD, master) c
| * 13fd55a (one) b
|/
* 822e0de a

5
Perché no git push rorg origin/one:one(senza refs/heads/) invece?
Ali,

2
@exalted perché con il refs/heads/prefisso stai spingendo le diramazioni remote che non devono essere verificate in unone
ДМИТРИЙ МАЛИКОВ

@patthoyts Ho provato il comando citato che dice tutto aggiornato, ma ho 10 rami nel telecomando A e 6 rami nel telecomando B, quindi puoi dirmi come posso spostare i rami lasciati fuori?
Keshav1234,

219

Ho trovato questo:

git push rorg 'refs/remotes/korg/*:refs/heads/*'

E ha spinto tutti i miei rami remoti da Korg a Rorg (anche senza copie locali dei rami). Vedi l'output di seguito:

Counting objects: 293, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (67/67), done.
Writing objects: 100% (176/176), 48.32 KiB, done.
Total 176 (delta 105), reused 168 (delta 97)
remote: Resolving deltas:  11% (12/105)
To <<MY_REPOSITORY_URL>>
 * [new branch]      korg/gingerbread-> gingerbread
 * [new branch]      korg/gingerbread-release -> gingerbread-release
 * [new branch]      korg/honeycomb-> honeycomb
 * [new branch]      korg/HEAD -> HEAD
 * [new branch]      korg/honeycomb-mr1-release-> honeycomb-mr1-release
 * [new branch]      korg/master -> master

E poi puoi fare la stessa spinta per i tagsref:

git push rorg 'refs/tags/*:refs/tags/*'

2
In abbastanza nuovo (quale versione?) Di git, questa dovrebbe essere la risposta accettata. @ bjarke-freund-hansen desideri modificare la risposta accettata se accetti il ​​beneficio di futuri ricercatori?
Jonah Graham,

1
"Nella versione abbastanza nuova (quale versione?) Di git, questa dovrebbe essere la risposta accettata" come so, questo dovrebbe funzionare per ogni versione pubblica di git, perché quelle firme push e riferimenti jolly sono comuni
radistao

3
Mi dà Everything up-to-datesu git 2.10.0 senza che accada nulla, mentre faccio lo stesso su singoli rami funziona.
user239558

6
Ho solo pensato di chiamarlo fuori: questo metodo sembra creare un ramo reale sul telecomando chiamato HEAD. Ma questo può essere cancellato. git push rorg :HEAD
Mark Stickley,

1
Chi non ha familiarità con la struttura arbitri e chiedendosi come spingere i tag, si vuole questo comando: git push rorg refs/tags/*:refs/tags/*. Che è lo stesso di git push rorg --tags, ma è bene capire cosa stanno facendo queste cose :)
Mark Stickley,

14

Per completare la risposta di Patthoyt , ecco uno script di shell corta che sposta tutti i rami da un telecomando all'altro:

SRC_REMOTE=korg
DST_REMOTE=rorg
for a in $(git branch --list --remote "$SRC_REMOTE/*" | grep -v --regexp='->')
  do git push "$DST_REMOTE" "$a:refs/heads/${a//$SRC_REMOTE\/}"
done

Per riassumere, per ogni ramo remoto sul telecomando sorgente (esclusi i rami "puntatore" come HEAD), spingere quel riferimento sul telecomando di destinazione. (Il ${a//$SRC_REMOTE\/}bit rimuove il nome remoto della sorgente dal nome del ramo, ovvero origin/masterdiventa master.)


3
per quelli di noi che hanno bisogno di farlo in una sola spinta:git push -u $DST_REMOTE $(for a in $(git branch --list --remote "$SRC_REMOTE/*" | grep -v --regexp='->'); do echo "$a:refs/heads/${a//$SRC_REMOTE\/}"; done)
Jayen il


0

Per ogni script che ti suggerisco di eseguire, sarebbe saggio archiviare o eseguire il commit di tutte le modifiche.

Avevo bisogno di spingere diversi rami da un telecomando all'altro. Queste risposte richiedevano l'esistenza in precedenza delle filiali locali

SRC_R=origin1
DEST_R=origin2
for cbranch in $(git branch -r | grep $SRC_R | cut -d '/' -f2,3,4,5 | cut -d ' ' -f1)
do
    git checkout $cbranch
    git push $DEST_R $cbranch
done

Basta cambiare origin1 nel telecomando di origine e origin2 nel telecomando di destinazione. Copia questo in "remoteBranchCloner.sh" e chiamalo usando "sh callBranchCloner.sh".

Potrebbe esserci un modo migliore , che non fa diverse spinte.

Se si utilizza il mio codice, probabilmente si desidera utilizzare la memorizzazione nella cache delle credenziali, altrimenti è necessario digitare i tempi serverali delle credenziali.

Per windows :

Nota: questo script è per Linux . Se lo esegui in "git bash" lo script funzionerà, ma non puoi eseguirlo dalla console nativa senza aver installato qualcosa di speciale.

git config [--global] credential.helper wincred

Per linux

git config [--global] credential.helper cache

Dove [--global] significa facoltativamente aggiungere --global

Se desideri impostare il monitoraggio remoto per tutti i rami su un nuovo telecomando:

DEST_R=remotename
for cbranch in `git branch`
do
    git checkout $cbranch
    git branch -u guru/$cbranch
done

Memorizzato come file .sh ed eseguito con "sh nomefile.sh" imposterà tutti i flussi up per tenere traccia del 'remotename' remoto


0

A causa del HEADramo aggiuntivo creato nella risposta precedente , il modo più pulito che ho trovato per farlo è clonare in un repository nudo e quindi spingere tutti i rami sul telecomando come segue:

git clone --bare <from-repository>
cd <from-repo-dir>
git push --set-upstream <to-repository> --all
git push --set-upstream <to-repository> --tags
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.