actualización del submodule git

No tengo claro lo que significa lo siguiente (de los documentos de actualización del submodule git ):

… hará que los submodules HEAD se --rebase , a less que se especifique --rebase o --rebase

¿Cómo --rebase / --merge cosas?

Mi caso de uso principal es tener un grupo de repositorys centrales, que incorporaré a través de submodules en otros repositorys. Me gustaría poder mejorar estos repositorys centrales, ya sea directamente en su location original o desde sus repositorys de inserción (los que los utilizan a través del submodule).

Desde dentro de estos submodules, ¿puedo crear twigs / modificaciones y usar push / pull como lo haría en repositorys regulares, o hay cosas de las que tener cuidado?
¿Cómo adelantaré la confirmación referenceda del submodule de say (tagged) 1.0 a 1.1 (incluso si el encabezado del repository original ya está en 2.0), o elegir qué commit de branches se usa en absoluto?

Esta página de GitPro resume la consecuencia de una actualización del submodule git muy bien

Cuando ejecuta la git submodule update , verifica la versión específica del proyecto, pero no dentro de una sucursal. Esto se llama tener una cabeza separada: significa que el file HEAD apunta directamente a una confirmación, no a una reference simbólica.
El problema es que, por lo general, no desea trabajar en un entorno principal independiente, porque es fácil perder los cambios .
Si realiza una actualización de submodule inicial, confirma en ese directory de submodule sin crear una twig para trabajar, y luego ejecuta la actualización del submodule de git nuevamente desde el superproyecto sin comprometerse mientras tanto, Git sobrescribirá los cambios sin decírselo. Técnicamente, no perderás el trabajo, pero no tendrás una twig apuntando hacia él, por lo que será algo difícil de recuperar.


Nota de marzo de 2013:

Como se menciona en " git submodule tracking latest ", ahora un submodule (git1.8.2) puede rastrear una twig.
El rest de esta respuesta detalla la característica del submodule clásico (reference a un compromiso fijo).


Para evitar este problema, cree una twig cuando trabaje en un directory de submodules con git checkout -b work o algo equivalente. Cuando hagas la actualización del submodule una segunda vez, aún revertirá tu trabajo, pero al less tienes un puntero al que volver.

Cambiar twigs con submodules en ellas también puede ser complicado. Si crea una nueva bifurcación, agrega un submodule allí y luego vuelve a una bifurcación sin ese submodule, aún tiene el directory de submodule como un directory sin seguimiento:


Por lo tanto, para responder a sus preguntas:

¿Puedo crear twigs / modificaciones y utilizar presionar / arrastrar como lo haría en repositorys regulares, o hay cosas de qué preocuparse?

Puede crear una twig y hacer modificaciones.

ADVERTENCIA (del tutorial de Git Submodule ): siempre publique (presione) el cambio de submodule antes de publicar (insert) el cambio en el superproyecto que lo hace reference. Si olvida publicar el cambio de submodule, otros no podrán clonar el repository.

cómo avanzaría la confirmación referenceda del submodule de say (tagged) 1.0 a 1.1 (incluso si el encabezado del repository original ya está en 2.0)

La página " Understanding Submodules " puede ayudar

Los submodules Git se implementan utilizando dos partes mobilees:

  • el file .gitmodules y
  • un tipo especial de object de tree.

Estos en set triangulan una revisión específica de un repository específico que se verifica en una location específica en su proyecto.


Desde la página del submodule de git

no puede modificar los contenidos del submodule desde dentro del proyecto principal

100% correcto: no puede modificar un submodule, solo se refiere a uno de sus commits.

Por eso, cuando modifica un submodule desde el proyecto principal, usted:

  • necesidad de comprometer y empujar dentro del submodule (al module ascendente), y
  • luego suba en su proyecto principal y vuelva a comprometerse (para que ese proyecto principal se refiera al nuevo compromiso de submodule que acaba de crear y empujar)

Un submodule le permite tener un desarrollo de enfoque basado en componentes , donde el proyecto principal solo se refiere a confirmaciones específicas de otros componentes (aquí "otros repositorys Git declarados como submodules").

Un submodule es un marcador (commit) a otro repository de Git que no está vinculado por el ciclo principal de desarrollo del proyecto: este (el "otro" repository de Git) puede evolucionar independientemente.
Depende del proyecto principal elegir de ese otro repository cualquier compromiso que necesite.

Sin embargo, si desea, por conveniencia , modificar uno de esos submodules directamente desde su proyecto principal, Git le permite hacerlo, siempre que primero publique esas modificaciones de submodules en su repository original de Git, y luego confirme su proyecto principal refiriéndose a una nueva versión de dicho submodule.

Pero la idea principal sigue siendo: hacer reference a componentes específicos que:

  • tener su propio ciclo de vida
  • tener su propio set de tags
  • tener su propio desarrollo

La list de confirmaciones específicas a las que hace reference en su proyecto principal define su configuration (de esto se trata la gestión de la configuration , englobing el mero sistema de control de versiones )

Si un componente realmente podría desarrollarse al mismo time que su proyecto principal (porque cualquier modificación en el proyecto principal implicaría modificar el subdirectory, y viceversa), entonces sería un "submodule" no más, sino un fusión de subtree (también se presenta en la pregunta Transferencia de la base de código henetworkingada de cvs a repository distribuido ), que une el historial de los dos repositorys Git.

¿Eso ayuda a comprender la verdadera naturaleza de los submodules de Git?

Para actualizar cada submodule, puede invocar el siguiente command. (En la raíz del repository)

 git submodule -q foreach git pull -q origin master 

Puede eliminar la opción -q para seguir todo el process.

Para abordar la opción –rebase vs –merge:

Digamos que tienes superrepo A y submodule B y quieres hacer algo de trabajo en el submodule B. Has hecho tu tarea y sabes que después de llamar

git submodule update

estás en un estado sin CABEZA, por lo que cualquier compromiso que hagas en este punto es difícil de recuperar. Entonces, has comenzado a trabajar en una nueva twig en el submodule B

 cd B git checkout -b bestIdeaForBEver <do work> 

Mientras tanto, alguien más en el proyecto A ha decidido que la versión más nueva y mejor de B es realmente lo que A merece. Usted, por hábito, fusiona los cambios más recientes y actualiza sus submodules.

 <in A> git merge develop git submodule update 

Oh no! Estás nuevamente en un estado sin cabeza, probablemente porque B ahora está apuntando al SHA asociado con el nuevo consejo de B, o algún otro compromiso. Si solo tuvieras:

 git merge develop git submodule update --rebase Fast-forwarded bestIdeaForBEver to b798edfdsf1191f8b140ea325685c4da19a9d437. Submodule path 'B': rebased into 'b798ecsdf71191f8b140ea325685c4da19a9d437' 

Ahora, la mejor idea para B se ha vuelto a basar en la nueva confirmación y, lo que es más importante, ¡todavía estás en tu twig de desarrollo para B, no en un estado sin cabeza!

(el –merge fusionará los cambios de beforeUpdateSHA a afterUpdateSHA en su twig de trabajo, en lugar de cambiar los cambios a afterUpdateSHA).