2012-06-03 18 views
9

Tengo un montón de repositorios de git, cada uno con un archivo. Me gustaría fusionarlos todos, preferiblemente en un solo paso. Lo que estoy es el objetivo de este gráfico:Combinación de pulpos de Git con repositorios no relacionados

*----¬ mergedrepo/master 
| \ \ \ 
| | | * repoA/master 
| | * repoB/master 
| | | 
| | * repoB/... 
| * repoC/master 
* repoD/master 
| 
* repoD/... 

probé un git merge, pero parece que la estrategia de pulpo no funciona para árboles disjuntos

$ git merge a/master b/master c/master d/master 
Unable to find common commit with a/master 
Automatic merge failed; fix conflicts and then commit the result. 

También me dijeron que ayudaría git merge --squash , pero eso dio el mismo error.

Esto genera el gráfico de la derecha, pero pierde todos los archivos:

$ git merge -s ours a/master b/master c/master d/master 

¿Cómo hago para hacer esto?

+0

Su fusión de pulpos funcionará, solo tiene que solucionar los conflictos como dice el mensaje. Una vez que haya solucionado los conflictos, debería poder comprometerse. –

+2

@CharlesBailey: ¡No hay conflictos! – Eric

+0

Sí, hay: "Falló la combinación automática; soluciona los conflictos y luego confirma el resultado". Para resolver el conflicto, probablemente solo quiera agregar todas las rutas en conflicto si los archivos no comparten ninguno de los mismos nombres en los repositorios. –

Respuesta

3

Crear un vacío cometer

git commit -m "Common commit" --allow-empty 

vistazo a su hash con log -1 y agregarlo a los injertos de archivo sin ningún padres

echo HASH_OF_COMMON_COMMIT >> .git/info/grafts 

luego encontrar todas las otras raíces con log --max-parents=0 y para cada añada su hash al archivo de injerto con el hash anterior como padre

each HASH_OF_ROOT HASH_OF_COMMON_COMMIT >> .git/info/grafts 

y ahora, fusiona!

El archivo de injertos es una forma de cambiar los padres de una confirmación y una vez que todos sus repos tengan una confirmación común, su repositorio debería aceptar la fusión.

4

He logrado resolver el problema con la fusión de pulpos de ramas no relacionadas. Lamentablemente, lo siguiente solo se aplica a casos bastante simples en los que no existen conflictos de combinación reales.

  1. Realice una combinación como se describe en el OP. "No podrá" reclamar sobre conflictos. Pero la fusión se realizó y ese hecho se registró aunque no hay cambios en el índice.
  2. Añadir contenido de ramas para el índice con el comando read-tree:

    git read-tree a/master b/master c/master d/master

    Esto no afectará el árbol de trabajo, sólo se actualizará el índice.

    Si las sucursales no son totalmente independientes, ajuste su orden teniendo en cuenta que este último sobrescribirá los contenidos de las sucursales anteriores.

  3. Commit normalmente.
  4. Realice un restablecimiento completo (git reset --hard) para obtener un árbol de trabajo consistente.

Supongo que uno más tarde puede editar y modificar este compromiso, pero yo personalmente no lo he intentado.

+0

Probablemente quiera decir 'git read-tree ...' en lugar de 'git read-subárbol ...'. También apuesto a que los lectores apreciarán si das ejemplos de código para cada paso, como 'git reset --hard' para el paso 4. –

+0

Oh, de hecho' read-tree'. Gracias por aclarar esto. – Vertigo

+1

En caso de que alguien más tenga problemas para resolver esto: aunque no incluya el nombre de la rama con la que se está fusionando en el comando 'git merge', debe incluirlo en el comando' git read-tree'. – dave4420

Cuestiones relacionadas