Fusiona múltiples repositorys git en uno, manteniendo el historial de sucursales

Tengo cuatro proyectos separados. Ellos tienen su propio repository git. y el mismo nombre de las sucursales para todos los proyectos.

/project/ /project/projA/ /project/projA/.git/ /project/projB/ /project/projB/.git/ /project/projC/ /project/projC/.git/ /project/projD/ /project/projD/.git/ 

Todos los repositorys de git tienen el mismo nombre de las twigs y, por supuesto, su propia twig principal.

Pregunta

Me gustaría fusionar todos los proyectos en uno como ese:

  /Project/.git/ /project/projA/ /project/projB/ /project/projC/ /project/projD/ 

Pero

Quiero mantener la historia de todas las twigs.

ps -> tengo el mismo nombre de sucursales para todos los repo. por ejemplo: un nombre de marca utilizado para los cuatro proyectos: V6-004

Detalles

Probé el submodule y el subtree pero ambos no resuelven el problema.

Intenté también esto.

  $ mkdir new_parent_project $ cd new_parent_project $ git init # Now we need to create the initial commit. This is essential. $ touch README.md $ git add README.md $ git commit -am "initial commit" 

después

  # merge project ProjA into subdirectory ProjA $ git remote add -f ProjA http://GitUrl $ git merge -s ours --no-commit ProjA/V6-006 $ git read-tree --prefix=ProjA/ -u ProjA/V6-006 $ git commit -m "merging ProjA into subdir: ProjA" 

después

  # merge project ProjB into subdirectory ProjB $ git remote add -f ProjB http://GitUrl $ git merge -s ours --no-commit ProjB/V6-006 $ git read-tree --prefix=ProjB/ -u ProjB/V6-006 $ git commit -m "merging ProjB into subdir: ProjB" 

pero

los proyectos se fusionan pero solo tengo el historial de V6-006. pero no tengo historia para las otras twigs.

Esa solución no está tan lejos de lo que probaste. Esto funciona solo si sus proyectos diferentes no tienen files comunes (de lo contrario, puede ser difícil resolver conflictos)

 # create a new repo: git init all_projects cd all_project # to make it more easy to understand, let's create a new branch git checkout -b main # import 1st project git remote add projectA http://projectA git fetch --all --tags git checkout masterA projectA/master git rebase masterA main # move the main branch to the current state git branch main -f # Now your branch main is at the same state as your A project # import 2st project git remote add projectB http://projectB git fetch --all --tags git checkout masterB projectB/master git rebase masterB main # move the main branch to the current state git branch main -f # Now your branch main contains all commits from projectA and projectB # etc.. 

El resultado será un repository con 1ra. Todas las confirmaciones del proyecto A, luego todas las confirmaciones del proyecto B, incluso si el proyecto B tiene algunas confirmaciones datedas antes del último compromiso del proyecto A, pero esto no debería ser un problema (y el tree de historia será más fácil de leer)

EDITAR: Lo siento, solo noto que esto no resuelve tu problema para get todas las sucursales remotas. Quizás puedas encontrar una solución basada en esa pregunta , con algo como esto:

 for i in $(git branch -r |grep projectA|awk -F'/' '{print $2}'); do git checkout $i projectA/$i git rebase $i main done 

pero esto haría su tree más complejo porque todas las twigs comenzarán desde la confirmación main .