Git push branch d'une télécommande à une autre?


133

J'ai configuré les télécommandes suivantes:

$ git remote 
korg
rorg

Et les branches suivantes:

$ 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

Maintenant , je veux pousser toutes les branches éloignées de korglarorg télécommande. Comment je fais ça?

De préférence sans faire de branche locale pour chaque premier, si cela est évitable.


Je suppose que la réponse à celle-ci est comparable à la réponse à celle-ci: stackoverflow.com/questions/6922700/… .
Legolas

Réponses:


52

Un test rapide de création de référentiels temporaires montre que vous pouvez construire une refspec qui peut le faire:

$ 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

Donc origine / BRANCHNAME: refs / heads / BRANCHNAME

Enregistrement de ma rorgtélécommande:

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

5
Pourquoi pas git push rorg origin/one:one(sans refs/heads/) à la place?
Ali

2
@exalted parce qu'avec le refs/heads/préfixe, vous poussez une branche distante qui n'a pas besoin d'être one
vérifiée

@patthoyts J'ai essayé la commande mentionnée, elle dit tout à jour, mais j'ai 10 branches dans la télécommande A et 6 branches dans la télécommande B, alors pouvez-vous me dire comment puis-je déplacer les branches laissées de côté?
Keshav1234

219

J'ai trouvé celui-ci:

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

Et il a poussé toutes mes branches distantes de korg à rorg (même sans copies locales des branches). Voir la sortie ci-dessous:

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

Et puis vous pouvez faire la même chose pour les tagsref:

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

2
Dans assez nouveau (quelle version?) De git, cela devrait être la réponse acceptée. @ bjarke-freund-hansen aimeriez-vous changer la réponse acceptée si vous êtes d'accord pour le bénéfice des futurs chercheurs?
Jonah Graham

1
"Dans assez nouveau (quelle version?) De git, cela devrait être la réponse acceptée" comme je le sais, cela devrait fonctionner pour chaque version publique de git, parce que ces jokers de signature push et de références sont courants
radistao

3
Me donne Everything up-to-datesur git 2.10.0 sans que rien ne se passe, tout en faisant de même sur des branches individuelles.
user239558

6
Je pensais juste que je devrais appeler ceci: cette méthode semble créer une branche réelle sur la télécommande appelée HEAD. Mais cela peut être supprimé. git push rorg :HEAD
Mark Stickley

1
Tout le monde ne connaît pas la structure refs et je me demandais comment pousser les balises, vous voulez cette commande: git push rorg refs/tags/*:refs/tags/*. C'est la même chose git push rorg --tags, mais il est bon de comprendre ce que font ces choses :)
Mark Stickley

14

Pour compléter la réponse de patthoyt , voici un court script shell qui pousse toutes les branches d'une télécommande à une autre:

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

Pour résumer, pour chaque branche distante sur la télécommande source (à l'exclusion des branches "pointeur" comme HEAD), poussez cette référence vers la télécommande de destination. (Le ${a//$SRC_REMOTE\/}bit supprime le nom de la source distante du nom de la branche, c'est-à-dire origin/masterdevient master.)


3
pour ceux d'entre nous qui ont besoin de le faire d'un seul coup: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


0

Pour tout script que je vous suggère d'exécuter, il serait sage de cacher ou de valider toutes vos modifications.

J'avais besoin de pousser plusieurs branches d'une télécommande à une autre. Ces réponses exigeaient que les antennes locales existaient auparavant

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

Changez simplement origin1 sur la télécommande source et origin2 sur la télécommande de destination. Copiez ceci dans "remoteBranchCloner.sh" et appelez-le en utilisant "sh callBranchCloner.sh".

Il y a peut-être un meilleur moyen, qui ne fait pas plusieurs poussées.

Si vous utilisez mon code, vous souhaitez probablement utiliser la mise en cache des informations d'identification, sinon vous devez taper vos informations d'identification plusieurs fois.

Pour Windows :

Remarque: ce script est pour Linux . Si vous l' exécutez dans "git bash", le script fonctionnera, mais vous ne pouvez pas l'exécuter depuis la console native sans avoir installé quelque chose de spécial.

git config [--global] credential.helper wincred

Pour Linux

git config [--global] credential.helper cache

Où [--global] signifie éventuellement ajouter --global

Si vous souhaitez configurer le suivi à distance de toutes les succursales sur une nouvelle télécommande:

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

Stocké en tant que fichier .sh et exécuté avec "sh filename.sh", tous les amonts seront configurés pour suivre le 'remotename' distant


0

En raison de la HEADcréation d' une branche supplémentaire dans la réponse précédente , le moyen le plus propre que j'ai trouvé de le faire est de cloner dans un référentiel nu, puis de pousser toutes les branches vers la télécommande comme suit:

git clone --bare <from-repository>
cd <from-repo-dir>
git push --set-upstream <to-repository> --all
git push --set-upstream <to-repository> --tags
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.