¿Cómo manejo los conflictos con los submodules de git?

Tengo un superproyecto de git que hace reference a varios submodules y estoy intentando bloquear un flujo de trabajo para que el rest de los miembros de mi proyecto trabajen dentro.

Para esta pregunta, digamos que mi superproyecto se llama supery y el submodule se llama subby . (Entonces es una simplificación de lo que bash hacer … En realidad, no estoy usando las twigs para las versiones, pero pensé que sería más fácil plantearlo como una pregunta).

Mi twig principal de supery tiene la label v1.0 del sub proyecto de git a la que se hace reference como submodule. La twig de supery llamó one.one y cambió la reference del submodule para que apunte a la label v1.1 de subby .

Puedo trabajar dentro de cada una de estas twigs sin problemas, pero si bash actualizar la twig one.one con cambios desde la twig master , recibo algunos conflictos y no sé cómo resolverlos.

Básicamente después de ejecutar un git pull . master git pull . master mientras está en la twig subby , parece que crea submodules adicionales.

Antes de la extracción / fusión, obtengo la respuesta deseada del git submodule de la twig one.one :

 $ 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 submodules adicionales cuando ejecuto el 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 references de submodule no deseadas y confirmo mis conflictos y cambios? ¿O hay un parámetro que pueda usar con mi original git pull que ignorará mis submodules?

No he visto ese error exacto antes. Pero tengo una conjetura sobre el problema que estás enfrentando. Parece que las twigs master y one.one de supery contienen supery diferentes para el submodule subby , cuando fusiona los cambios de master git no sabe qué ref – v1.0 o v1.1 – debe mantenerse y rastrearse por one.one twig de supery .

Si ese es el caso, entonces necesita seleccionar la reference que desea y confirmar ese cambio para resolver el conflicto. Que es exactamente lo que estás haciendo con el command de reinicio .

Este es un aspecto complicado de rastrear diferentes versiones de un submodule en diferentes twigs de su proyecto. Pero la ref del submodule es como cualquier otro componente de su proyecto. Si las dos twigs diferentes continúan rastreando los mismos refs del submodule respectivos después de las fusiones sucesivas, entonces git debería ser capaz de resolver el patrón sin boost los conflictos de fusión en futuras fusiones. Por otro lado, si cambia las references de los submodules con frecuencia, tendrá que soportar mucha resolución de conflictos.

Bueno, no está gestionando técnicamente los conflictos con los submodules (es decir: mantén esto pero no eso), pero encontré la manera de seguir trabajando … y todo lo que tuve que hacer fue prestar atención a mi salida de git status y reiniciar los submodules:

 git reset HEAD subby git commit 

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

Luché un poco con las respuestas sobre 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 count que en mi caso, el submodule fue mantenido por un equipo diferente, por lo que el conflicto provino de diferentes versiones de submodules en master y en mi twig local del proyecto en el que estaba trabajando:

  1. Ejecute el git status : anote la carpeta del submodule con conflictos
  2. Restablezca el submodule a la versión que se confirmó por última vez en la twig actual:

    git reset HEAD path/to/submodule

  3. En este punto, tiene una versión libre de conflicto de su submodule que ahora puede actualizar a la última versión en el repository del submodule:

      cd path / to / submodule
     git submodule foreach git pull origen SUBMODULE-BRANCH-NAME 
  4. Y ahora puedes commit y volver al trabajo.

Primero, encuentre el hash que desea que su submodule haga reference. 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 llevar mi submodule a la reference de hash correcta y continuar con mi trabajo sin tener más conflictos.

Tuve este problema con git rebase -i origin/master en una twig. Quería tomar la versión maestra del submodule ref, así que simplemente lo hice:

git reset master path/to/submodule

y entonces

git rebase --continue

Eso resolvió el problema para mí.

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

 git reset HEAD subby git commit 

trabajó para mi 🙂