2011-06-08 34 views
6

Yo era muy feliz cuando descubrí últimamente sobregit submódulo fusión de conflictos: ¿cómo visualizar?

git submodule summary 

que me muestra muy bien por que compromete al desprotegido de cometer un submódulo está por delante o por detrás de la referencia en el repositorio.

Ahora cuando estoy en el medio de una fusión con conflictos de submódulos, el mismo comando no produce resultados útiles. Necesito una secuencia dolorosa de gitk en mi árbol principal examinando las ramas, junto con el cd'ing en los submódulos, buscando y escribiendo allí, comparando los valores sha1 ...

¿Cuál sería una forma más conveniente de obtener el imagen del conflicto?

Respuesta

2

Puede hacer un script. Aquí está el núcleo de una secuencia de comandos:

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 reemplazar diff con registro o cualquier número de otros comandos que le 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 submódulo.

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

Espero que esto ayude.

+0

+1 para la mención gitslave! Pero la verdad en la publicidad, gitslave no lo ayudará con los submódulos de git, excepto en la medida en que es un reemplazo completo para los submódulos de git. Sin embargo, la sustitución de git-submodules sería muy útil para su cordura. –

+0

plug excelente, Seth;) Espero contribuir a git alrededor de los submódulos. No estoy seguro de si la fusión de subárboles es la respuesta de todo lo que está disponible en el proyecto git. –

+0

Realmente no entiendo la idea de esa línea de comando. El "$ (git ls-tree ...)" se evalúa como "cfa69f5. 8b7cc2b. 4871. 6133e C 8e9bfd" (con los identificadores SHA1 completos, por supuesto). ¿Cómo puede ser eso un argumento válido para "git diff"? En cualquier caso, no funciona para mí, obtengo: use: git diff ... – chrisxxx

0

Igual que Adam's answer, pero utilizando 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 al respecto 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 conflicto de archivos, el índice contiene los identificadores de objeto blob para las diferentes versiones. En el caso de los submódulos, son los identificadores de compromiso del submódulo. En el comando anterior, :2:$sub se refiere a la etapa 2 (nuestra) del submódulo en la ruta $sub.

Tenga en cuenta que puede ver una lista de entradas de índice con etapas usando git ls-files --stage.

Cuestiones relacionadas