Eu tenho os seguintes controles remotos configurados:
$ git remote
korg
rorg
E os seguintes ramos:
$ 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
Agora , desejo enviar todas as ramificações remotas korg
para o rorg
controle remoto. Como faço isso?
De preferência, sem fazer uma ramificação local para cada primeiro, se isso for evitável.
git
git-branch
git-push
git-remote
Bjarke Freund-Hansen
fonte
fonte
Respostas:
Um teste rápido que faz alguns repositórios temporários mostra que você pode construir um refspec que pode fazer isso:
Origem / BRANCHNAME: refs / heads / BRANCHNAME
Verificando no meu
rorg
controle remoto:fonte
git push rorg origin/one:one
(semrefs/heads/
) em vez disso?refs/heads/
prefixo que você está empurrando ramificada remoto que não precisa ser checkouted em umone
Eu encontrei este:
E empurrou todos os meus ramos remotos do korg para o rorg (mesmo sem cópias locais dos ramos). Veja a saída abaixo:
E então você pode fazer o mesmo push para
tags
refs:fonte
Everything up-to-date
no git 2.10.0 sem que nada aconteça, enquanto faz o mesmo em ramificações individuais.HEAD
. Mas isso pode ser excluído.git push rorg :HEAD
git push rorg refs/tags/*:refs/tags/*
. Que é o mesmo quegit push rorg --tags
, mas é bom para entender o que essas coisas estão fazendo :)Para complementar a resposta do patthoyt , aqui está um breve script de shell que empurra todos os ramos de um controle remoto para outro:
Para resumir, para cada ramificação remota no controle remoto de origem (excluindo ramificações "indicadoras" como HEAD), empurre essa referência para o controle remoto de destino. (O
${a//$SRC_REMOTE\/}
bit retira o nome remoto da origem do nome do ramo, ou seja,origin/master
se tornamaster
.)fonte
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)
Isso funciona no Zsh
fonte
Para qualquer script que sugiro que você execute, seria recomendável ocultar ou confirmar todas as suas alterações.
Eu precisava empurrar vários galhos de um controle remoto para outro. Essas respostas exigiram que as filiais locais existissem anteriormente
Apenas mude origin1 para o controle remoto de origem e origin2 para o controle remoto de destino. Copie isso para "remoteBranchCloner.sh" e chame-o usando "sh callBranchCloner.sh".
Pode haver uma maneira melhor , que não faça várias tentativas.
Se você usa meu código, provavelmente deseja usar o cache de credenciais, caso contrário , precisará digitar suas credenciais vezes no servidor.
Para janelas :
Nota: Este script é para linux . Se você o executar no "git bash", o script funcionará, mas você não poderá executá-lo no console nativo sem ter instalado algo especial.
Para linux
Onde [--global] significa opcionalmente adicionar --global
Se você deseja definir o rastreamento remoto para todas as filiais para um novo controle remoto:
Armazenado como um arquivo .sh e executado com "sh filename.sh", todos os upstreams serão rastreados para rastrear 'remotename' remoto
fonte
Como o
HEAD
ramo extra foi criado na resposta anterior , a maneira mais limpa de fazer isso é clonar em um repositório vazio e enviar todos os ramos para o controle remoto da seguinte maneira:fonte