2010-02-10 27 views
8

tengo un proyecto de un idiota con una estructura de archivos como esto:La fusión de dos repositorios Git

Project_A/files... 

tengo otro proyecto Git con una estructura de archivos como esto:

Project_B/ 
     Project_A/files... 
     files... 

Ahora quiero fusionar el Proyecto A en el Proyecto B y continuar utilizando el Proyecto B como el único repositorio.

He intentado utilizar la combinación de sub-árbol, pero me dio un error diciendo " 'XXX' superposiciones de Entrada 'XXX'"

¿Hay una manera de combinar Proyecto A en el proyecto B y retener todas las historias cometer?

¡Gracias de antemano!

+0

¿Qué repositorio debería ganar en los casos de superposición? –

+0

@dirtytofu Acabo de completar mi respuesta con la técnica de injerto, tal vez una solución más apropiada en su caso. – VonC

+0

@gbacon Idealmente me gustaría fusionar los dos. – dirtytofu

Respuesta

1

Si projectB ya contiene projectA como submodule, usted debe:


Si projectA no era un submódulo de projectB , Recomendaría buscar projectA i nto projectB repo, y luego utilice la técnica de injerto para vincular las dos líneas de compromiso, mientras que no se ocupan de todos los conflictos de fusión que una fusión clásica habría implicado.

Véase la pregunta Git question: possible to merge two different by equal repositories?

+2

¿Te refieres a "fusión del subárbol"? Aunque prefiero el árbol sumergido. – ebneter

+0

@ebneter: arreglado. No debería responder preguntas a las 6 a. M.) – VonC

+0

Project_A actualmente no es un submódulo de Project_B. Se crearon dos repositorios de desarrollo separados por dos equipos diferentes y ahora estoy tratando de fusionar el repositorio de mi equipo en el de ellos, pero la estructura de archivos diferente de los proyectos parece estar causando algunos problemas. – dirtytofu

12

Se podría hacer algo como esto:

En Project_A, hacer un nuevo subdirectorio Project_A y git mv todo en él, por lo Project_A ahora se ve como

Project_A/ 
    Project_A/files... 

Entonces , en Project_B:

git remote add project_A Project_A 
git fetch project_A 
git branch project_A project_A/master 
git checkout -b merge_trial master 
git merge project_A 

... y corregir según sea necesario en merge_trial (o haga espuma, enjuague, repita hasta que obtenga lo que desea con respecto a conflictos/superposiciones).

He hecho algo exactamente así como parte de una migración de svn-> git.

+0

En lugar de git-mv, ¿hay alguna manera de mover también mis archivos para que todos mis commits previos en Project_A también aparezcan como la nueva estructura modificada? Creo que tiene que hacer algo con git-filter-branch, pero aún no he probado ese comando. – dirtytofu

+0

Sí, podría usar git filter-branch para lograr lo mismo. Sin embargo, git mv podría ser más fácil en este caso. En cualquier caso, cuando traigas project_A a Project_B, todo el historial vendrá con él. – ebneter

+0

¡Esto funcionó perfectamente para mí! ¡Gracias! – GaryO