O Git envia o repositório existente para um servidor de repositório remoto novo e diferente?

494

Digamos que eu tenho um repositório no git.fedorahosted.org e quero clonar isso na minha conta no github para ter meu próprio playground, além do repositório mais "oficial" do fedorahosted. Quais seriam as etapas para copiar inicialmente isso? Dentro do github, há esse belo botão "fork", mas não posso usá-lo por razões óbvias.

E como eu acompanharia as mudanças no repositório do fedorahosted no repositório do github?

Heiko Rupp
fonte

Respostas:

751
  1. Crie um novo repositório no github.
  2. Clone o repositório do fedorahosted para sua máquina local.
  3. git remote rename origin upstream
  4. git remote add origin URL_TO_GITHUB_REPO
  5. git push origin master

Agora você pode trabalhar com ele como qualquer outro repositório do github. Para puxar as correções a montante, basta executar git pull upstream master && git push origin master.

Troelskn
fonte
14
Não há motivo para renomear a origem original, basta chamar o novo campo de jogo de outra coisa.
precisa saber é o seguinte
34
@tcaswell Tecnicamente não, mas é uma convenção forte que originaponta para o local remoto canônico. Nesse caso, a localização do github provavelmente seria a canônica.
troelskn
1
Eu consideraria 'a montante' o local canônico, mas acho que isso começa a dividir os cabelos.
tacaswell
3
Talvez eu deva postar uma pergunta diferente, mas acho que vocês estão discutindo o que eu quero. Gostaria de adicionar um novo controle remoto, não substituir o existente, para poder continuar retirando do repositório antigo, mas enviando as alterações para o novo.
ThatAintWorking
13
@ThatAintWorking Você provavelmente deve abrir uma nova pergunta, mas resumindo - você pode adicionar qualquer número de controles remotos com o comando git remote add. Você pode enviar para um deles informando explicitamente o controle remoto git push. Por exemplo, git push foobar masterpara enviar a ramificação atual para o mastercontrole remoto foobar.
troelskn
108

Há uma resposta excluída para esta pergunta que possui um link útil: https://help.github.com/articles/duplicating-a-repository

A essência é

0. create the new empty repository (say, on github)
1. make a bare clone of the repository in some temporary location
2. change to the temporary location
3. perform a mirror-push to the new repository
4. change to another location and delete the temporary location

Exemplo do OP:

Na sua máquina local

$ cd $HOME
$ git clone --bare https://git.fedorahosted.org/the/path/to/my_repo.git
$ cd my_repo.git
$ git push --mirror https://github.com/my_username/my_repo.git
$ cd ..
$ rm -rf my_repo.git
multidão
fonte
5
Qual é o benefício do clone nu e do espelho empurrar simplesmente adicionar e empurrar para outro controle remoto? Será que todos os ramos serão enviados por push e não apenas o ramo atual? (Se assim for, esta parece ser uma limitação da resposta aceita que deve ser observado.)
yoyo
3
Esta era exatamente a informação que eu estava procurando, o --bare / --mirror é geralmente o que as pessoas querem executar! Esta é uma resposta importante! Obrigado
claf 13/09/16
1
Ótimo! Definitivamente a resposta mais correta sobre a questão do tópico. Obrigado! Se eu não fizer assim, sempre fico comerror: failed to push some refs to 'https://github.com/username/testrep.git'
Denis Babarykin
45

Para empurrar seu repo existente para diferente, você precisa:

  1. Clone o repositório original primeiro.

    git clone https://git.fedorahosted.org/cgit/rhq/rhq.git
    
  2. Envie as fontes clonadas para o seu novo repositório:

    cd rhq
    git push https://github.com/user/example master:master
    

Você pode mudar master:masterpara source:destinationramo.


Se você deseja enviar por commit específico (ramificação), faça:

  1. No repo original, crie e efetue o check-out de uma nova ramificação:

    git checkout -b new_branch
    
  2. Escolha e redefina para o ponto em que deseja iniciar:

    git log # Find the interesting hash
    git reset 4b62bdc9087bf33cc01d0462bf16bbf396369c81 --hard
    

    Como alternativa, selecione o commit por git cherry-pickpara anexar ao HEAD existente.

  3. Em seguida, avance para seu novo repositório:

    git push https://github.com/user/example new_branch:master
    

    Se você estiver refazendo, use o -fforce push (não recomendado). Corra git reflogpara ver o histórico de alterações.

kenorb
fonte
2
o git push ... old_branch_name:new_branch_namepermite enviar uma ramificação de recurso do repositório antigo como a ramificação principal no novo repositório. Útil!
gorjanz
Essa foi a maneira mais simples de fazer isso.
Adam
15

Deseja simplesmente enviar o repositório local (com suas ramificações locais, etc.) para o novo controle remoto ou realmente deseja espelhar o controle remoto antigo (com todas as suas ramificações, tags, etc.) no novo controle remoto? Se o último, aqui está um ótimo blog sobre Como espelhar adequadamente um repositório git .

É altamente recomendável que você leia o blog para obter alguns detalhes muito importantes, mas a versão curta é a seguinte:

Em um novo diretório, execute estes comandos:

git clone --mirror [email protected]/upstream-repository.git
cd upstream-repository.git
git push --mirror [email protected]/new-location.git
Cabelo do cachorro
fonte
Eu acho que esse é o link: blog.plataformatec.com.br/2013/05/…
David
11

Tente isso Como mover um repositório Git completo

  1. Crie um repositório local no diretório temp-dir usando:

    git clone temp-dir

  2. Vá para o diretório temp-dir.

  3. Para ver uma lista dos diferentes ramos no ORI, faça:

    git branch -a
    
  4. Faça o check-out de todos os ramos que você deseja copiar do ORI para o NEW usando:

    git checkout branch-name
    
  5. Agora, busque todas as tags do ORI usando:

    git fetch --tags
    
  6. Antes de executar a próxima etapa, verifique suas tags e ramificações locais usando os seguintes comandos:

    git tag
    
    
    git branch -a
    
  7. Agora limpe o link para o repositório ORI com o seguinte comando:

    git remote rm origin
    
  8. Agora vincule seu repositório local ao seu NOVO repositório recém-criado usando o seguinte comando:

    git remote add origin <url to NEW repo>
    
  9. Agora empurre todas as suas ramificações e tags com estes comandos:

    git push origin --all
    
    
    git push --tags
    
  10. Agora você tem uma cópia completa do seu repositório ORI.

vm345
fonte
9

Encontrei uma solução usando set-url que é concisa e bastante fácil de entender :

  1. crie um novo repositório no Github
  2. cd no repositório existente em sua máquina local (se você ainda não o clonou, faça isso primeiro)
  3. git remote set-url origin https://github.com/user/example.git
  4. git push -u origin master
Mobiletainment
fonte
9

Se você possui um repositório Git existente:

cd existing_repo
git remote rename origin old-origin
git remote add origin https://gitlab.com/newproject
git push -u origin --all
git push -u origin --tags
Kamil Nekanowicz
fonte
1
Só para esclarecer, - todos empurrarão todos os ramos
GilCol 17/01/19
7

Basta apontar o novo repositório alterando o URL do repositório GIT com este comando:

git remote set-url origin [new repo URL]

Exemplo: git remote set-url origin [email protected]:Batman/batmanRepoName.git

Agora, empurrar e puxar estão vinculados ao novo REPO.

Em seguida, empurre normalmente da seguinte maneira:

git push -u origin master
Abdel Ourimchi
fonte
2

Eu tive o mesmo problema.

No meu caso, como eu tenho o repositório original na minha máquina local, fiz uma cópia em uma nova pasta sem nenhum arquivo oculto (.git, .gitignore).

Finalmente, adicionei o arquivo .gitignore à nova pasta criada.

Depois, criei e adicionei o novo repositório a partir do caminho local (no meu caso, usando o GitHub Desktop).

itrascastro
fonte
1

Aqui está uma maneira manual de fazer git remote set-url origin [new repo URL]:

  1. Clone o repositório: git clone <old remote>
  2. Crie um repositório GitHub
  3. Aberto <repository>/.git/config

    $ git config -e
    
    [core]
        repositoryformatversion = 0
        filemode = false
        bare = false
        logallrefupdates = true
        symlinks = false
        ignorecase = true
    [remote "origin"]
        url = <old remote>
        fetch = +refs/heads/*:refs/remotes/origin/*
    [branch "master"]
        remote = origin
        merge = refs/heads/master
    

    e mude o controle remoto (a opção url)

    [remote "origin"]
        url = <new remote>
        fetch = +refs/heads/*:refs/remotes/origin/*
    
  4. Envie o repositório para o GitHub: git push

Você também pode usar os dois / vários controles remotos .

upe
fonte
Eu estava procurando o mesmo problema, depois fiz o mesmo e resolvi.
Mohit Patidar