Eu tenho um repositório Git local que gostaria de enviar para um novo repositório remoto (novo repositório configurado no Beanstalk, se isso importa).
Meu repositório local possui algumas ramificações e tags e gostaria de manter toda a minha história.
Parece que eu basicamente só preciso fazer um git push
, mas isso apenas carrega o master
ramo.
Como envio tudo para obter uma réplica completa do meu repositório local no controle remoto?
Respostas:
Para enviar todas as suas ramificações , use (substitua REMOTE pelo nome do controle remoto, por exemplo "origem"):
Para enviar todas as suas tags :
Finalmente, acho que você pode fazer isso tudo em um comando com:
No entanto, além disso
--mirror
, também enviará seus controles remotos, portanto, isso pode não ser exatamente o que você deseja.fonte
--all
em vez de*:*
parece mais amigávelgit push REMOTE --all
retornou semNo refs in common and none specified;
fazer nada., Enquantogit push REMOTE "*:*
na verdade empurrava todos os ramos para o controle remoto.git clone --mirror old-remote-url; cd repo.git; git push --mirror new-remote-url
.No caso como eu, você adquiriu um repo e agora está mudando a origem remota para um repo diferente, um novo vazio ...
Portanto, você tem seu repositório e todos os ramos dentro, mas ainda precisa fazer check-out desses ramos para que o
git push --all
comando efetue o envio deles também.Você deve fazer isso antes de pressionar:
Seguido por
fonte
git push '*:*'
empurrou todos os galhos.git push -all
apenas empurrou o mestre. Eu estava transportando repositórios do github para o bitbucket.--track remotes/$remote
vez de--track $remote
. Aqui está a linha de comando completa:for remote in `git branch -r | grep -v master `; do git checkout --track remotes/$remote ; done
Aqui está outra opinião sobre a mesma coisa que funcionou melhor para a situação em que eu estava. Ele resolve o problema em que você tem mais de um controle remoto, gostaria de clonar todos os ramos do controle remoto
source
para o controle remoto,destination
mas sem precisar verificar todos eles previamente.(O problema que tive com a solução de Daniel era que ele se recusaria a efetuar o check-out de uma filial de rastreamento a partir do
source
controle remoto, se eu já tivesse feito a verificação anteriormente, ou seja, não atualizaria minha filial local antes do envio)isso empurrará todas as ramificações remotas
source
para uma ramificação principaldestination
, possivelmente fazendo um empurrão não rápido. Você ainda precisa enviar tags separadamente.fonte
remote
para outro. Obrigado!git push destination +refs/remotes/source/\*:refs/heads/\*
--prune
opção.--mirror
parâmetro usual que todos recomendam. Funciona perfeitamente para cenários em que você apenas deseja manter dois controles remotos sincronizados para fins de automação ou auditoria.Esta é a maneira mais concisa que encontrei, desde que o destino esteja vazio. Mude para uma pasta vazia e, em seguida:
Substitua
https://...
porfile:///your/repo
etc., conforme apropriado.fonte
A página de manual
git-push
vale uma leitura. Combinado com este site , escrevi o seguinte no meu.git/config
:Os
push = :
meios "enviam qualquer ramificação 'correspondente' (ou seja, ramificações que já existem no repositório remoto e possuem uma contraparte local)", enquantopush = refs/tags/*
significa "enviam todas as tags".Então agora só tenho que correr
git push
para enviar todos os ramos e tags correspondentes.Sim, isso não é exatamente o que o OP queria (todos os ramos a serem enviados já devem existir no lado remoto), mas pode ser útil para aqueles que encontrarem essa pergunta enquanto pesquisam "como faço para enviar ramos e tags ao mesmo tempo" Tempo".
fonte
No meu caso, o que funcionou foi.
fonte
origin
é um alias para o repositório Git de URL remoto.Espelhando um Repositório
Crie um clone simples do repositório.
Envio de espelho para o novo repositório.
Remova o repositório local temporário que você criou na etapa 1.
Espelhando um repositório que contém objetos Git Large File Storage
Crie um clone simples do repositório. Substitua o nome de usuário de exemplo pelo nome da pessoa ou organização que possui o repositório e substitua o nome de repositório de exemplo pelo nome do repositório que você deseja duplicar.
Navegue para o repositório que você acabou de clonar.
Puxe os objetos Git Large File Storage do repositório.
Envio de espelho para o novo repositório.
Envie os objetos Git Large File Storage do repositório para o seu espelho.
Remova o repositório local temporário que você criou na etapa 1.
As instruções acima são da Ajuda do Github: https://help.github.com/articles/duplicating-a-repository/
fonte
Eu encontrei as respostas acima ainda têm algumas coisas pouco claras, o que enganará os usuários. Primeiro, é certo que,
git push new_origin --all
egit push new_origin --mirror
não é possível duplicar todas as ramificações de origem, basta duplicar as ramificações locais existentes para o new_origin.Abaixo estão dois métodos úteis que testei:
1, duplicado por clone repo bare.
git clone --bare origin_url
, digite a pasta egit push new_origin_url --mirror
. Dessa forma, você também pode usar osgit clone --mirror origin_url
dois--bare
e--mirror
fará o download de um repositório simples, sem incluir o espaço de trabalho. por favor consulte isto2, Se você possui um repositório git usando
git clone
, o que significa que possui um espaço de trabalho vazio para repositório e git, pode usargit remote add new_origin new_origin_url
, e entãogit push new_origin +refs/remotes/origin/\*:refs/heads/\*
e, em seguida ,git push new_origin --tags
Dessa forma, você obterá um ramo principal adicional, o que não faz sentido.
fonte
Para enviar ramificações e tags (mas não controles remotos):
Isso seria equivalente a combinar as opções
--tags
e--all
paragit push
, que o git não parece permitir.fonte
+refs/remotes/source/*
Baseado na resposta @Daniel, eu fiz:
fonte
| grep -v master
pode ser substituído por| sed 's/\*//'
(suponho que você tenha excluídomaster
para evitar o pouco desagradável*
anexado ao ramo atualmente selecionado), que permite incluirmaster
e evitar problemas quandomaster
o ramo não estiver selecionado no momento. Também pena de necroposting, é só que esta resposta me ajudou hoje e eu queria partilhar a minha alteração, se pode ajudar os outros na minha posição ...Descobri que nada disso parecia funcionar corretamente para mim. Sinta-se à vontade para exterminar isso, mas, por algum motivo, não conseguiu que as outras opções funcionassem corretamente.
O resultado esperado foi um repo "clonado" para outro controle remoto (ou seja, do Github para outro provedor):
O principal problema que eu estava vendo era que todas as ramificações remotas não foram recriadas no novo controle remoto. Se um comando o fez, o novo controle remoto não tinha o histórico da ramificação (por exemplo, fazer um
git checkout branch; git log
não mostraria as confirmações esperadas da ramificação).Notei que
git checkout -b branchname
NÃO é o mesmo quegit checkout branchname
(sendo este último o que eu precisava). Percebogit checkout --track branchname
que não parece ter puxado o histórico do ramo.Minha solução (baseada em PowerShell):
fonte
O comando abaixo empurrará todos os ramos ( incluindo aqueles que você nunca efetuou check-out, mas que estão presentes no seu repositório git, você pode vê-los
git branch -a
)git push origin '*:*'
fonte
Eu estava no processo de alternar de um serviço de controle de versão para outro e precisava clonar todos os repositórios, incluindo todos os ramos, tags e histórico.
Para alcançar acima, eu fiz a seguir:
git push origin '*:*'
Script .sh usado para fazer check-out de todas as ramificações no repositório local:
fonte