Divida un repository de Git en dos

Tengo un repository git con varias twigs, y me gustaría dividirlo en dos repositorys.

Imagine que enumero todas las confirmaciones hechas a ese repository, y el resultado es algo así como:

Commit #1 to branch master Commit #2 to branch master Commit #3 to branch fixing_bugs Commit #4 to branch master Commit #5 to branch fixing_bugs Commit #6 to branch master Commit #7 to branch adding_sexy_french_girls_to_the_code Commit #8 to branch adding_sexy_french_girls_to_the_code Commit #9 to branch master 

Entonces, en total, este repository tiene 3 twigs: master , fixing_bugs y adding_sexy_french_girls_to_the_code .

Ahora quiero dividir este repository en dos, usando commit # 6. Entonces tendría dos repositorys como los siguientes:

Repositorio 1

 Commit #1 to branch master Commit #2 to branch master Commit #3 to branch fixing_bugs Commit #4 to branch master Commit #5 to branch fixing_bugs 

Tener las twigs master , fixing_bugs .

Repositorio 2

 Commit #6 to branch master Commit #7 to branch adding_sexy_french_girls_to_the_code Commit #8 to branch adding_sexy_french_girls_to_the_code Commit #9 to branch master 

Tener twigs master , adding_sexy_french_girls_to_the_code .

Entiendo que esto puede ser técnicamente desafiante, pero creo que no es imposible hacerlo con Git ( le hope ).

¿Cómo puedo hacer esto?

Gracias.

Crea tu segunda twig de tu maestro con

 git checkout -b <your_new_branch> 

Le sugiero que comience con el mismo código en cada twig y que reescriba el historial mediante una nueva reference con:

 git rebase HEAD~9 -i 

Y luego puede eliminar fácilmente las líneas que desea para cada twig.

Como está reescribiendo su historial, deberá forzar los cambios:

 git push origin <your_branch> --force 

[ACTUALIZADO] Vi los últimos comentarios, entonces tendrás que aplastar tus compromisos en el repository 2 para poder replace cada pick por s para squash con tu último commit # 6.

Después de git rebase HEAD~9 -i en Repository 1:

 pick #1 to branch master pick #2 to branch master pick #3 to branch fixing_bugs pick #4 to branch master pick #5 to branch fixing_bugs pick #6 to branch master pick #7 to branch adding_sexy_french_girls_to_the_code pick #8 to branch adding_sexy_french_girls_to_the_code pick #9 to branch master 

Deberías :

 pick #1 to branch master pick #2 to branch master pick #3 to branch fixing_bugs pick #4 to branch master pick #5 to branch fixing_bugs 

(escriba dd on vim para eliminar las líneas)

Después de git rebase HEAD~9 -i en Repository 2:

 pick #1 to branch master pick #2 to branch master pick #3 to branch fixing_bugs pick #4 to branch master pick #5 to branch fixing_bugs pick #6 to branch master pick #7 to branch adding_sexy_french_girls_to_the_code pick #8 to branch adding_sexy_french_girls_to_the_code pick #9 to branch master 

Deberías :

 s #1 to branch master s #2 to branch master s #3 to branch fixing_bugs s #4 to branch master s #5 to branch fixing_bugs pick #6 to branch master pick #7 to branch adding_sexy_french_girls_to_the_code pick #8 to branch adding_sexy_french_girls_to_the_code pick #9 to branch master 

(edite las líneas y las primeras 5 líneas serán aplastadas con # 6)

Puede utilizar git format-patch y git am para copyr commits desde su repository existente al nuevo, seguido de un git reset para eliminar los commits copydos del repository existente.

Pruebe estos commands para copyr las confirmaciones en el nuevo repository:

 $ cd /path/to/new_repo_folder # don't forget to run git init if this is a new folder $ git --git-dir=/path/to/existing_repo_folder/.git format-patch --stdout sha1_of_commit5..sha1_of_commit_9 | git am 

Básicamente, el command git format-patch crea un file de parche para cada una de sus confirmaciones, desde la confirmación 6 hasta la confirmación 9. Si no se proporciona la opción --stdout , estos files de parches se saveán en su --stdout existing_repo_folder . Posteriormente, el command git am aplica el historial de commit 6 a commit 9 en su new_repo_folder . Ahora cuando ejecutas git log new_repo_folder git log en tu new_repo_folder , verás el historial de la confirmación 6 a 9.

Finalmente, si commit 9 es tu HEAD , puedes ejecutar git reset --hard HEAD~3 en tu git reset --hard HEAD~3 existing_repo_folder para establecer la position de HEAD para commit 5, que es 3 commits antes, y eso es lo que representa ~3 .

Por supuesto, esencialmente estás reescribiendo el historial de tu repository. Si comparte sus códigos con otras personas, asegúrese de tener su consenso. De lo contrario, tu próximo git push -f causará mucho dolor a todos.