¿Cómo manejo los conflictos con los submódulos git?

127

Tengo un superproyecto git que hace referencia a varios submódulos y estoy tratando de bloquear un flujo de trabajo para que el resto de los miembros de mi proyecto trabajen.

Para esta pregunta, digamos que se llama a mi superproyecto y se llama superyal submódulo subby. (Entonces es una simplificación de lo que estoy tratando de hacer ... En realidad no estoy usando las ramas para las versiones, pero pensé que sería más fácil presentarlas como una pregunta).

Mi rama maestra de superytiene la etiqueta v1.0del proyecto git subbyreferenciada como un submódulo. La rama de superyllamado one.oney cambió la referencia del submódulo para apuntar a la etiqueta v1.1de subby.

Puedo trabajar dentro de cada una de estas ramas sin problemas, pero si trato de actualizar la one.onerama con los cambios de la masterrama, recibo algunos conflictos y no sé cómo resolverlos.

Básicamente, después de correr un git pull . mastertiempo en la subbyrama, parece que crea submódulos adicionales.

Antes de la extracción / fusión, obtengo la respuesta deseada git submodulede la one.onerama:

$ git checkout master
$ git submodule
qw3rty...321e subby (v1.0)
$ git checkout one.one
$ git submodule
asdfgh...456d subby (v1.1)

Pero después de la extracción, agrega submódulos adicionales cuando ejecuto git submodule:

$ git pull . master
Auto-merged schema
CONFLICT (submodule): Merge conflict in subby - needs qu3rty...321e
Automatic merge failed; fix conflicts and then commit the results.

$ git submodule
qw3rty...321e subby (v1.0)
asdfgh...456d subby (v1.1)
zxcvbn...7890 subby (v1.1~1)

¿Cómo elimino / ignoro las referencias de submódulos no deseados y confirmo mis conflictos y cambios? ¿O hay algún parámetro que pueda usar con mi original git pullque ignore mis submódulos?

Tyler
fuente

Respuestas:

23

No he visto ese error exacto antes. Pero tengo una conjetura sobre los problemas que estás encontrando. Parece que porque las ramas mastery one.onede superycontienen diferentes referencias para el subbysubmódulo, cuando fusiona los cambios de mastergit no sabe qué referencia - v1.0o v1.1- debe mantener y rastrear la one.onerama de supery.

Si ese es el caso, debe seleccionar la referencia que desea y confirmar ese cambio para resolver el conflicto. Que es exactamente lo que está haciendo con el comando de reinicio .

Este es un aspecto complicado de rastrear diferentes versiones de un submódulo en diferentes ramas de su proyecto. Pero la referencia del submódulo es como cualquier otro componente de su proyecto. Si las dos ramas diferentes continúan rastreando las mismas referencias de submódulos respectivas después de fusiones sucesivas, entonces git debería poder resolver el patrón sin generar conflictos de fusión en futuras fusiones. Por otro lado, si cambia las referencias de submódulos con frecuencia, es posible que tenga que soportar una gran cantidad de resolución de conflictos.

Jesse Hallett
fuente
1
Gracias por arrojar algo de luz sobre la pregunta. Eso tiene mucho sentido para mí ahora y el comando de reinicio funciona perfectamente para mi situación anterior. Pero, ¿cuáles serían los comandos para aceptar la referencia del submódulo de la rama maestra y tirar la referencia al submódulo de la rama actual? Sé cómo manejar los conflictos normales, pero después de tres días de explorar la web, no puedo encontrar un ejemplo de código que no sea rm -r. Y estoy empezando a pensar que hay una razón para que los ejemplos no existan; Los submódulos están tan abstraídos del superproyecto que tiene que gestionar cada transición.
Tyler
26
¡FINALMENTE! ¡Una respuesta! Tenía added by us: ../Mono.Cecilen git statuspero git addy git rmfallidas con Mono.Cecil: needs merge, pathspec 'Mono.Cecil/' did not match any filesporque era simplemente una carpeta vacía y git en realidad sólo trata los archivos. git checkoutme dio Mono.Cecil: needs merge, error: you need to resolve your current index first, git submodule updatedio Skipping unmerged submodule Mono.Cecily git checkout master Mono.CecilFINALMENTE lo arregló. Problema básico: la git statussugerencia es incorrecta, ¡así que elige una rama y toma su copia de la carpeta con checkout!
IBBoard
66
@ Comando de IBBoard me ayudó con esta situación - Probé git checkout --ours SUBMODy git add SUBMODentre otros, pero finalmente el hacer git checkout master SUBMODarreglado el conflicto. Este comentario probablemente debería ser una respuesta, no un comentario ... :)
Colin D Bennett
89

Bueno, técnicamente no está gestionando conflictos con submódulos (es decir, mantener esto pero no eso), pero encontré una manera de continuar trabajando ... y todo lo que tuve que hacer fue prestar atención a mi git statussalida y restablecer los submódulos:

git reset HEAD subby
git commit

Eso restablecería el submódulo a la confirmación previa a la extracción. Que en este caso es exactamente lo que quería. Y en otros casos donde necesito los cambios aplicados al submódulo, me encargaré de aquellos con los flujos de trabajo de submódulo estándar (maestro de pago, extraer la etiqueta deseada, etc.).

Tyler
fuente
Para mí, esto solo parece cambiar el estado del módulo en conflicto de "ambos modificados" a "eliminados".
Matt Zukowski
44
Es posible que desee mantener el submódulo de la rama fusionada en su lugar: git reset <merged-branch> subby
Edward Anderson
1
funciona para mí según lo prescrito en la respuesta ... git reset HEAD path / to / submodule / dir
estoy
56

Luché un poco con las respuestas a esta pregunta y tampoco tuve mucha suerte con las respuestas en una publicación SO similar . Así que esto es lo que funcionó para mí, teniendo en cuenta que en mi caso, el submódulo fue mantenido por un equipo diferente, por lo que el conflicto provino de diferentes versiones de submódulos en master y mi rama local del proyecto en el que estaba trabajando:

  1. Ejecutar git status: tome nota de la carpeta del submódulo con conflictos
  2. Restablezca el submódulo a la versión que se confirmó por última vez en la rama actual:

    git reset HEAD path/to/submodule

  3. En este punto, tiene una versión libre de conflictos de su submódulo que ahora puede actualizar a la última versión en el repositorio del submódulo:

    ruta de CD / a / submódulo
    git submódulo foreach git pull origin NOMBRE-RAMA DEL SUBMÓDULO
  4. Y ahora puedes commithacerlo y volver al trabajo.

Emma Burrows
fuente
16

Primero, encuentre el hash que desea que su submódulo haga referencia. entonces corre

~/supery/subby $ git co hashpointerhere
~/supery/subby $ cd ../
~/supery $ git add subby
~/supery $ git commit -m 'updated subby reference'

eso me ha funcionado para que mi submódulo tenga la referencia hash correcta y continúe con mi trabajo sin tener más conflictos.

hellatan
fuente
1
o usted podría hacer un git checkout --theirs (o --ours) subby
Bachi
@Bachi: git checkout --theirs and --ours no tiene ningún efecto en los submódulos.
Edward Anderson
1
Si bien esto resuelve el conflicto, no es fácil determinar <hashpointerhere>. No conozco una manera fácil de ver el commit de submódulo desprotegido en cada lado del conflicto. Cualquier confirmación que compruebe en subby puede ser diferente de cualquier lado de la fusión, lo que no es apropiado en una confirmación de fusión.
Edward Anderson
@nilbus eso es cierto. Hemos dejado de trabajar con submódulos git, ya que esa era una de las preocupaciones que teníamos y nos costó mucho saber qué compromiso realmente quería. Hemos utilizado composer (php) como administrador de paquetes, lo que en realidad me gusta, ya que crea un archivo de bloqueo que bloquea los repositorios a un determinado hash. Sin embargo, dado que estamos usando node_modules dentro de múltiples repositorios, nos encontraríamos con módulos en conflicto aquí y allá. Desde entonces, hemos cambiado a npm para administrar estas cosas, pero esa también es otra lata de gusanos.
hellatan
12

Tuve este problema con git rebase -i origin/masteruna rama. Quería tomar la versión maestra de la referencia del submódulo, así que simplemente hice:

git reset master path/to/submodule

y entonces

git rebase --continue

Eso resolvió el problema para mí.

maratón
fuente
3
Esto funcionó para mí. Todavía estoy pensando qué hicieron para dañar el submódulo
Checo R
3

Obtuve ayuda de esta discusión. En mi caso el

git reset HEAD subby
git commit

trabajó para mi :)

Mithun Das
fuente
2

Bueno, en mi directorio principal veo:

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Unmerged paths:
(use "git reset HEAD <file>..." to unstage)
(use "git add <file>..." to mark resolution)

Así que acabo de hacer esto

git reset HEAD linux
Kjeld Flarup
fuente