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.
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
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/*'
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
.)
Cela fonctionne dans Zsh
git Push rorg 'refs/remotes/korg/*:refs/heads/*'
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
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