Come posso creare un nuovo repository GitHub da un ramo in un repository esistente?


171

Ho filiali master e di nuovi progetti . E ora vorrei creare un repository nuovo di zecca con il suo master basato sul ramo del nuovo progetto.

Sfondo: ho un repository che contiene tre applicazioni indipendenti. Non è iniziato in questo modo. Inizialmente c'era solo un'app nel repository. Nel tempo, tuttavia, le esigenze aziendali sono cambiate. Un'app è diventata due (una versione legacy e una riscrittura). È stato aggiunto un servizio web. Sono stati utilizzati rami separati per contenere i tre progetti. Tuttavia, non condividono alcun codice. E quindi sarebbe più semplice suddividerli nei propri repository.

Risposte:


294

Ho iniziato con l'idea di @utente292677 e l'ho perfezionato per risolvere il mio problema:

  1. Crea il nuovo repository in github.
  2. cd nella copia locale del vecchio repository da cui si desidera estrarre, che è impostato per tenere traccia del ramo del nuovo progetto che diventerà il master del nuovo repository .
  3. $ git push https://github.com/accountname/new-repo.git +new-project:master

Il nuovo repository Github è terminato. Il risultato è;

  • un nuovo repository Github chiamato new-repo ,
  • il cui mastercorrisponde al nuovo progetto del vecchio repository , con
  • tutta la storia preservata.

In effetti, ho scoperto che utilizzando questo metodo, ho potuto creare il nuovo repository con una selezione selezionata di rami, rinominata come volevo:

$ git push git@github.com:accountname/new_repo +new-project:master +site3a:rails3

Il risultato è che il ramo site3a preesistente viene ora spostato nel nuovo repository e verrà visualizzato come rails3 . Funziona davvero bene: il diagramma di rete mostra il nuovo master e i binari3 con una cronologia completa e nella loro relazione corretta tra loro.

Aggiornamento 2013-12-07: usato questo con un altro progetto e verificato che questa ricetta funzioni ancora.

Aggiornamento 2018-01-11: aggiornato il passaggio 3. per utilizzare la raccomandazione GitHub per il protocollo https. La ricetta funziona ancora.


Ciao @Dogweather, grazie per averlo condiviso. puoi spiegare qual è la differenza tra il tuo metodo e cambiare l'URL remoto di origine, passare al nuovo metodo repo?
Vincent,

5
Dogweather, ho usato la tua soluzione più di quanto possa ricordare. Grazie! Ho dovuto dare un'occhiata a old_branch prima che funzionasse per me
Bjorn Theart,

3
si noti che questo non copierà i tag. Credo che potresti averne bisogno --follow-tags.
Factor Mystic,

1
Si noti che non è necessario creare un repository su Github, è possibile solo pushsu uno locale (ovvero git initanziché Github> Nuovo> ...)
OJFord,

1
Non voglio trasferire tutta la mia cronologia di commit su un nuovo repository, volevo solo copiare i commit che appartengono al repository secondario. È possibile ??
Arbaz Rizvi,

27

Aggiornare:

cd in repository locale contenente old_branch e:

$ git push https://github.com/accountname/new_repo.git +old_branch:master

9
git clone -b new-project /path/to/repo /new/repo/path

Modifica: all'interno di GitHub, è possibile "fork" il repository, quindi andare alla scheda Ammin. Nel clone. Sotto "Nome repository" e "Visibilità" si trova "Branch predefinito" con un menu a discesa di rami. Scegli new-project.

Modifica: ho appena capito che è il masterramo che vuoi impostare, non solo il ramo “predefinito”. Così…

  • Su GitHub, clona them/repoin you/repo.
  • Correre git clone git@github.com:you/repo.git
  • Inizio gitk.
  • [Potresti voler creare un old-masterramo in modo da non perdere la traccia dei vecchi commit.]
  • Trova il commit più recente sul new-projectramo, fai clic con il pulsante destro del mouse sul messaggio di commit e seleziona "Ripristina ramo master qui". (Puoi anche farlo dalla riga di comando usando git-reset, ma non ho capito l'invocazione corretta.)

Il prossimo passaggio al repository GitHub dovrà essere eseguito con l' --forceopzione, ma in caso contrario il gioco è fatto.

Se è uno dei tuoi repository, lo stai facendo per ...

  • Correre git clone git@github.com:you/orig.git
  • Correre git clone orig copy
  • Come ho descritto sopra, ma dall'interno del copyrepository locale , reimpostare il masterramo nel punto desiderato.
  • Crea il progetto GitHub vuoto you/copy. Segui le indicazioni su GitHub per configurare quel progetto come telecomando per la tua versione locale di copy, push mastere il gioco è fatto!

Hmm! Non sono sicuro di come fare il primo passo: clonare un repository all'interno di github. Non penso sia possibile.
Dogweather,

@Dogweather, si chiama "biforcazione" su GitHub; Ho modificato la mia risposta per chiarezza.
JC Salomon

Non sono stato in grado di effettuare il fork di un repository all'interno di un account. Hai provato tu stesso?
Dogweather

5
  1. Crea il NEW_REPOSITORY in github.
  2. cd OLD_REPOSITORY
  3. git push https://github.com/accountname/NEW_REPO + master: master

E questo è tutto. (Nota: cronologia git conservata)

Avevo provato la risposta sopra e l'ho trovata non abbastanza specifica in quanto non specificava + master: master che è ciò di cui avevo bisogno per farlo funzionare. Funziona benissimo.

Fonte (con le mie modifiche per evitare problemi ssh con github): Mauricio Aiello, ex sviluppatore senior Java, https://www.quora.com/How-do-I-create-a-new-GitHub-repository-from-a -branch-in-an-esistente-repository


Questo è in realtà più utilizzabile della risposta accettata. Funziona anche in situazioni in cui Git si lamenta degli errori refspec di src quando non riesce a spingere il vecchio nel nuovo repository.
Informagic,

2

Non sono sicuro che sia un buon metodo, ma è comunque facile:

git clone -b new-project git@github.com:User/YourProject.git newProjcet

Quindi crea un nuovo repository su github e spingilo.


2

Ricordando che quando si crea semplicemente un nuovo repository, si perde il riferimento a quello precedente e si rende più difficile mantenere qualsiasi aggiornamento del progetto originale sincronizzato con quello nuovo. Forse non è meglio borsare il repository?


0

Piccola aggiunta alla risposta corretta:

$ git push git@github.com: accountname / new_repo + old_branch: master

"git@github.com: accountname / new_repo" => ottieni dal menu a discesa "Clona o scarica" ​​di github

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.