git submodule merge conflict: ¿cómo visualizar?

Estaba muy feliz cuando descubrí últimamente sobre

git submodule summary 

lo cual me muestra muy bien por lo que confirma que la confirmación de un submodule está adelante o detrás de la reference en el repository.

Ahora, cuando estoy en el medio de una fusión con conflictos de submodules, el mismo command no produce resultados útiles. Necesito una secuencia dolorosa de gitk en mi tree principal examinando las twigs, junto con el cd'ing en los submodules, buscando y gitk allí, comparando valores de sha1 …

¿Cuál sería una forma más conveniente de get la image del conflicto?

Puedes hacer una secuencia de commands. Aquí está el núcleo de tal script:

  git --git-dir=submodulepath/.git diff \ $(git ls-tree HEAD submodulepath | cut -c 15-54) \ $(git ls-tree MERGE_HEAD submodulepath | cut -c 15-54) 

puede replace diff con log o cualquier cantidad de otros commands que lo ayudarán a ver cuáles son los cambios. Uno sería ver si sería una fusión de avance rápido en cuyo caso puede resolver el conflicto rápidamente sin fusionarse en el nivel del submodule.

También hay gitslave que te ayudará con estos problemas.

Espero que esto ayude.

Igual que la respuesta de Adam , pero usando el índice y sin corte:

 sub="path/to/submodule" git --git-dir="$sub/.git" diff \ $(git rev-parse ":2:$sub") \ $(git rev-parse ":3:$sub") 

Explicación:

Cuando hay un conflicto, Git almacena información sobre él en el índice. Almacena varias versiones diferentes, llamadas etapas. La etapa 1 es la versión "base" (ancestro común), la etapa 2 es la versión "nuestra" y la etapa 3 es la versión "suya".

En caso de conflictos de files, el índice contiene los identificadores de object blob para las diferentes versiones. En el caso de los submodules, son los identificadores de compromiso del submodule. En el command anterior :2:$sub refiere a la etapa 2 (nuestra) del submodule en path $sub .

Tenga en count que puede ver una list de inputs de índice con etapas usando git ls-files --stage .