web-dev-qa-db-fra.com

Git Push branche d'une télécommande à une autre?

J'ai installé 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 souhaite pousser toutes les branches distantes de korg vers la télécommande de rorg. Comment faire?

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

112

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

So Origin/BRANCHNAME: refs/têtes/BRANCHNAME

Archiver ma télécommande rorg:

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

J'ai trouvé celui-ci:

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

Et cela 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 le même Push pour tags refs:

git Push rorg 'refs/tags/*:refs/tags/*'
198
radistao

Pour compléter 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 sur la télécommande de destination. (Le ${a//$SRC_REMOTE\/} bit supprime le nom distant source du nom de la branche, c'est-à-dire Origin/master devient master.)

14
blahdiblah

Cela fonctionne dans Zsh

git Push rorg 'refs/remotes/korg/*:refs/heads/*'
4
Dongfang Zhu

En raison de la création de la branche supplémentaire HEAD dans la précédente réponse , la manière la plus propre que j'ai trouvée 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
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 succursales 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

Remplacez simplement Origin1 par la télécommande source et Origin2 par la télécommande de destination. Copiez ceci dans "remoteBranchCloner.sh" et appelez-le en utilisant "sh callBranchCloner.sh".

Il peut y avoir une manière meilleure, qui ne fait pas plusieurs pressions.

Si vous utilisez mon code, vous voulez probablement utiliser mise en cache des informations d'identification, sinon vous devez taper vos heures de connexion.

Pour Windows:

Remarque: ce script est pour linux. Si vous exécutez-le dans "git bash" le script fonctionnera, mais vous ne pouvez pas l'exécuter à partir de 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 définir le suivi à distance pour toutes les branches 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 suivront le "nom distant" à distance

0
csga5000