Como criar um novo repositório GitHub a partir de uma ramificação em um repositório existente?

171

Eu tenho ramos principais e novos projetos . E agora eu gostaria de criar um novo repositório com seu mestre, baseado no ramo do novo projeto.

Antecedentes: Eu tenho um repositório que contém três aplicativos independentes. Não começou assim. Originalmente, havia apenas um aplicativo no repositório. Com o tempo, no entanto, as necessidades comerciais mudaram. Um aplicativo se tornou dois (uma versão herdada e uma reescrita.) Um serviço da web foi adicionado. Ramos separados foram usados ​​para conter os três projetos. No entanto, eles não compartilham nenhum código. E, portanto, seria mais simples tê-los divididos em seus próprios repositórios.

Dogweather
fonte

Respostas:

294

Comecei com a ideia de @ user292677 e refinei-a para resolver o meu problema:

  1. Crie o novo repositório no github.
  2. cd para a cópia local do repositório antigo que você deseja extrair, que é configurado para rastrear a ramificação do novo projeto que se tornará o mestre do novo repositório .
  3. $ git push https://github.com/accountname/new-repo.git +new-project:master

O novo repositório do Github está concluído. O resultado é;

  • um novo repositório do Github chamado new-repo ,
  • cujo mastercorresponde ao novo projeto do antigo repositório , com
  • toda a história preservada.

Na verdade, descobri que, usando esse método, eu poderia criar o novo repositório com uma seleção de ramos escolhida a dedo, renomeada como queria:

$ git push [email protected]:accountname/new_repo +new-project:master +site3a:rails3

O resultado é que a ramificação site3a preexistente agora também é movida para o novo repositório e aparecerá como rails3 . Isso funciona muito bem: o diagrama de rede mostra o novo mestre e os trilhos3 com histórico completo e no relacionamento correto entre eles.

Atualização 07-12-2013: usei isso em outro projeto e verifiquei que esta receita ainda funciona.

Atualização 11-01-2018: Etapa 3. atualizada para usar a recomendação do GitHub para o protocolo https. Receita ainda funciona.

Dogweather
fonte
Olá @Dogweather, obrigado por compartilhar isso. você pode explicar qual é a diferença entre seu método e alterar o URL remoto de origem, passar para o novo método de repo?
Vincent
5
Dogweather, usei sua solução mais do que me lembro. Obrigado! I fez check-out old_branch antes isso funcionou para mim
Bjorn Theart
3
observe que isso não copiará tags. Eu acredito que você pode precisar --follow-tagspara isso.
Factor Mystic
1
Note que você não precisa criar um repositório no Github, você pode apenas pushpara um local (ou seja, git initem vez de Github> New> ...)
OJFord
1
Eu não quero transferir todo o meu histórico de consolidação para um novo repositório, só quero copiar confirmações que pertencem ao repositório filho. Isso é possível ??
Arbaz Rizvi
27

Atualizar:

cd ao repositório local contendo old_branch e:

$ git push https://github.com/accountname/new_repo.git +old_branch:master
Alexey Kislitsin
fonte
9
git clone -b new-project /path/to/repo /new/repo/path

Editar: No GitHub, você pode "dividir" o repositório e, em seguida, ir para a guia Admin no seu clone. Abaixo de "Nome do repositório" e "Visibilidade" está "Ramificação padrão", com um menu suspenso de ramificações. Escolha new-project.

Re-editar: Acabei de perceber que é o masterramo que você deseja definir, não apenas o ramo "padrão". Assim…

  • No GitHub, clone them/repopara you/repo.
  • Corre git clone [email protected]:you/repo.git
  • Iniciar gitk.
  • [Você pode criar uma old-masterramificação para não perder o controle das confirmações antigas.]
  • Encontre a confirmação mais recente na new-projectramificação, clique com o botão direito na mensagem de confirmação e selecione "Redefinir ramificação principal para aqui". (Você também pode fazer isso na linha de comando usando git-reset, mas ainda não descobri a invocação correta.)

Seu próximo envio ao repositório do GitHub precisará ser feito com a --forceopção, mas, caso contrário, você estará pronto.

Se é um dos seus próprios repositórios, você está fazendo isso para…

  • Corre git clone [email protected]:you/orig.git
  • Corre git clone orig copy
  • Conforme descrito acima, mas de dentro do copyrepositório local , redefina a masterramificação para onde você deseja.
  • Crie o projeto GitHub vazio you/copy. Siga as instruções no GitHub para configurar esse projeto como um controle remoto para sua versão local de copy, push master, e pronto!
JC Salomon
fonte
Hmm! Não sei ao certo como executar o primeiro passo: clonar um repositório no github. Eu não acho que é possível.
Dogweather
@ Dogweather, é chamado de "bifurcação" no GitHub; Eu editei minha resposta para maior clareza.
JC Salomon
Não foi possível dividir um repo em uma conta. Você já tentou isso sozinho?
Dogweather
5
  1. Crie o NEW_REPOSITORY no github.
  2. cd OLD_REPOSITORY
  3. git push https://github.com/accountname/NEW_REPO + master: master

E isso é tudo. (Nota: histórico do git preservado)

Eu tentei a resposta acima e achei que ela não era específica o suficiente, pois não especificou + master: master, que é o que eu precisava para fazê-lo funcionar. Isso funciona muito bem.

Fonte (com minhas modificações para evitar problemas ssh com o github): Mauricio Aiello, ex-desenvolvedor sênior de Java, https://www.quora.com/How-do-I-create-a-new-GitHub-repository-from-a -branch-in-existente-repository

Joe
fonte
Isso é realmente mais útil do que a resposta aceita. Ele funciona mesmo em situações em que o Git reclama de erros src refspec ao não enviar o antigo para o novo repositório.
Informagic
2

Não tenho certeza se essa é uma boa maneira, mas é fácil de qualquer maneira:

git clone -b new-project [email protected]:User/YourProject.git newProjcet

Em seguida, crie um novo repositório no github e empurre-o.

Kjuly
fonte
2

Lembre-se de que, quando você simplesmente cria um novo repositório, perde a referência ao antigo e torna mais difícil manter qualquer atualização no projeto original sincronizada com o novo. Talvez não seja melhor dividir o repo?

Julio Flores
fonte
0

Pouco acréscimo à resposta correta:

$ git push [email protected]: accountname / new_repo + old_branch: master

"[email protected]: accountname / new_repo" => obtenha no menu suspenso "Clone ou faça o download" do github

Gerd
fonte