¿Cómo creo un nuevo repositorio de GitHub desde una sucursal en un repositorio existente?

171

Tengo sucursales maestras y de nuevos proyectos . Y ahora me gustaría crear un nuevo repositorio con su maestro basado en la rama del nuevo proyecto.

Antecedentes: tengo un repositorio que contiene tres aplicaciones independientes. No comenzó de esta manera. Originalmente solo había una aplicación en el repositorio. Con el tiempo, sin embargo, las necesidades comerciales han cambiado. Una aplicación se convirtió en dos (una versión heredada y una reescritura). Se agregó un servicio web. Se utilizaron ramas separadas para contener los tres proyectos. Sin embargo, no comparten ningún código. Y entonces sería más simple dividirlos en sus propios repositorios.

Dogweather
fuente

Respuestas:

294

Comencé con la idea de @ user292677 y la perfeccioné para resolver mi problema:

  1. Crea el nuevo repositorio en github.
  2. cd a su copia local del antiguo repositorio del que desea extraer, que está configurado para rastrear la rama del nuevo proyecto que se convertirá en el maestro del nuevo repositorio .
  3. $ git push https://github.com/accountname/new-repo.git +new-project:master

El nuevo repositorio de Github está terminado. El resultado es;

  • un nuevo repositorio de Github llamado new-repo ,
  • cuyo mastercorresponde al nuevo proyecto del antiguo repositorio , con
  • Toda la historia conservada.

De hecho, descubrí que al usar este método, podía crear el nuevo repositorio con una selección de ramas elegida a mano, renombrada como quería:

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

El resultado es que la rama site3a preexistente ahora también se mueve al nuevo repositorio y aparecerá como rails3 . Esto funciona muy bien: el diagrama de red muestra el nuevo maestro y los rieles3 con un historial completo y en su relación correcta entre sí.

Actualización 2013-12-07: Usé esto con otro proyecto y verifiqué que esta receta todavía funciona.

Actualización 2018-01-11: se actualizó el paso 3. para usar la recomendación de GitHub para el protocolo https. La receta aún funciona.

Dogweather
fuente
Hola @Dogweather, gracias por compartir esto. ¿Puede explicar cuál es la diferencia entre su método y cambiar la URL remota de origen, empujar al nuevo método de repositorio?
Vincent
55
Dogweather, he usado tu solución más de lo que puedo recordar. ¡Gracias! Primero tuve que pagar old_branch antes de que esto funcionara para mí
Bjorn Theart
3
Tenga en cuenta que esto no copiará las etiquetas. Creo que puede necesitar --follow-tagspara eso.
Factor Mystic
1
Tenga en cuenta que no necesita crear un repositorio en Github, puede pushhacerlo solo en uno local (es decir, en git initlugar de Github> Nuevo> ...)
OJFord
1
No quiero transferir todo mi historial de confirmaciones a un nuevo repositorio, solo quería copiar las confirmaciones que pertenecen al repositorio secundario. Es posible ??
Arbaz Rizvi
27

Actualizar:

cd al repositorio local que contiene old_branch y:

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

Editar: dentro de GitHub, puede "bifurcar" el repositorio, luego ir a la pestaña Administrador en su clon. Debajo de "Nombre del repositorio" y "Visibilidad" se encuentra "Rama predeterminada" con un menú desplegable de ramas. Elija new-project.

Reeditar: acabo de darme cuenta de que es la masterrama que desea establecer, no solo la rama "predeterminada". Entonces…

  • En GitHub, clone them/repoa you/repo.
  • correr git clone [email protected]:you/repo.git
  • Inicio gitk.
  • [Es posible que desee crear una old-masterrama para no perder el rastro de las confirmaciones anteriores.]
  • Encuentre la confirmación más reciente en la new-projectrama, haga clic con el botón derecho en el mensaje de confirmación y seleccione "Restablecer la rama maestra aquí". (También puede hacer esto en la línea de comando usando git-reset, pero no he descubierto la invocación correcta).

Su próximo empujón hacia su repositorio de GitHub deberá hacerse con la --forceopción, pero de lo contrario ya habrá terminado.

Si es uno de tus repositorios, estás haciendo esto para ...

  • correr git clone [email protected]:you/orig.git
  • correr git clone orig copy
  • Como describí anteriormente, pero desde el copyrepositorio local , restablezca la masterrama a donde lo desee.
  • Crea el proyecto de GitHub vacío you/copy. Siga las instrucciones en GitHub para configurar ese proyecto como un control remoto para su versión local de copy, push master, ¡y listo!
JC Salomon
fuente
Hmm! No estoy seguro de cómo hacer el primer paso: clonar un repositorio dentro de Github. No creo que sea posible.
Dogweather
@Dogweather, se llama "bifurcación" en GitHub; He editado mi respuesta para mayor claridad.
JC Salomon
No he podido bifurcar un repositorio dentro de una cuenta. ¿Has probado esto tú mismo?
Dogweather
5
  1. Crea el NEW_REPOSITORY en github.
  2. cd OLD_REPOSITORY
  3. git push https://github.com/accountname/NEW_REPO + master: master

Y eso es todo. (Nota: historial de git preservado)

Intenté la respuesta anterior y la encontré no lo suficientemente específica, ya que no especificaba + master: master, que es lo que necesitaba para que funcione. Funciona muy bien

Fuente (con mis modificaciones para evitar problemas ssh con github): Mauricio Aiello, ex desarrollador senior de Java, https://www.quora.com/How-do-I-create-a-new-GitHub-repository-from-a -branch-en-un-repositorio-existente

Joe
fuente
En realidad, eso es más útil que la respuesta aceptada. Funciona incluso en situaciones en las que Git se queja de errores de refspec src cuando no se puede enviar el viejo al nuevo repositorio.
Informagic
2

No estoy seguro si esta es una buena manera, pero de todos modos es fácil:

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

Luego cree un nuevo repositorio en github y empújelo.

Kjuly
fuente
2

Recordando que cuando simplemente crea un nuevo repositorio, pierde la referencia al anterior y hace que sea más difícil mantener cualquier actualización del proyecto original sincronizado con el nuevo. ¿Quizás no es mejor bifurcar el repositorio?

Julio Flores
fuente
0

Pequeña adición a la respuesta correcta:

$ git push [email protected]: nombre de cuenta / new_repo + old_branch: master

"[email protected]: accountname / new_repo" => obtener del menú desplegable "clonar o descargar" de github

Gerd
fuente