git submodule tracking último

136

Estamos moviendo nuestro (enorme) proyecto a git y estamos pensando en usar submódulos. Nuestro plan es tener tres cabezas diferentes en el superproyecto: lanzamiento, estable, más reciente. Los líderes del proyecto manejarán el lanzamiento y las ramas estables. Moverán los submódulos según sea necesario.

El problema es la "última" cabeza. Nos gustaría que la cabeza del "último" superproyecto rastree las ramas maestras de todos los submódulos (automáticamente). Y también sería genial si mostrara la historia de todos los commits al submódulo.

He visto gitslave, pero no es exactamente lo que queremos. ¿Alguna sugerencia?

l.thee.a
fuente
Si bien solicitó una herramienta, solo quiero conectar esta pregunta que recopila frases que hacen lo mismo: stackoverflow.com/questions/1030169/…
Tobu
Git ahora ofrece el seguimiento de lo último con submódulos: vea mi respuesta editada.
VonC

Respuestas:

235

Actualización de marzo de 2013

Git 1.8.2 agregó la posibilidad de rastrear ramas.

" git submodule" comenzó a aprender un nuevo modo para integrarse con la punta de la rama remota (en lugar de integrarse con la confirmación registrada en el enlace de git del superproyecto).

# add submodule to track master branch
git submodule add -b master [URL to Git repo];

# update your submodule
git submodule update --remote 

Si ya tenía un submódulo presente que ahora desea rastrear una rama, vea " cómo hacer que un submódulo existente rastree una rama ".

Consulte también el tutorial de Vogella sobre submódulos para obtener información general sobre submódulos.

Nota:

git submodule add -b . [URL to Git repo];
                    ^^^

Ver git submodulepágina del manual :

Se .utiliza un valor especial de para indicar que el nombre de la rama en el submódulo debe ser el mismo nombre que la rama actual en el repositorio actual .


Ver commit b928922727d6691a3bdc28160f93f25712c565f6 :

submodule add: Si --branchse da, regístrelo en.gitmodules

Esto le permite grabar fácilmente una submodule.<name>.branchopción .gitmodulescuando agrega un nuevo submódulo. Con este parche

$ git submodule add -b <branch> <repository> [<path>]
$ git config -f .gitmodules submodule.<path>.branch <branch>

reduce a

$ git submodule add -b <branch> <repository> [<path>]

Esto significa que las futuras llamadas a

$ git submodule update --remote ...

recibirá actualizaciones de la misma rama que usó para inicializar el submódulo, que generalmente es lo que desea.

Firmado por: W. Trevor King


Respuesta original (febrero de 2012):

Un submódulo es una única confirmación a la que hace referencia un repositorio principal.
Como es un repositorio de Git por sí solo, se puede acceder al "historial de todos los commits" a través de un git logsubmódulo dentro de ese submódulo.

Entonces, para que un padre rastree automáticamente la última confirmación de una rama determinada de un submódulo, necesitaría:

  • cd en el submódulo
  • git fetch / pull para asegurarse de que tiene los últimos commits en la rama correcta
  • cd de vuelta en el repositorio principal
  • agregue y confirme para registrar la nueva confirmación del submódulo.

gitslave (que ya viste) parece ser la mejor opción, incluso para la operación de confirmación .

Es un poco molesto realizar cambios en el submódulo debido al requisito de verificar la rama del submódulo correcto, realizar el cambio, confirmar y luego ir al superproyecto y confirmar el compromiso (o al menos registrar la nueva ubicación del submódulo). submódulo).

Otras alternativas se detallan aquí .

VonC
fuente
1
@BraveNewMath que necesita a la caja de la rama derecha en su submódulo, y luego ir a la cesión temporal de los padres y escriba: git config -f .gitmodules submodule.<path>.branch <branch>. Agregue todo, comprométase y empuje.
VonC
2
@BraveNewMath Detallo todos los pasos para hacer que un submódulo rastree una rama en stackoverflow.com/a/18799234/6309 .
VonC
1
Es importante usar la --remoteetiqueta si no desea obtener cabezas separadas cuando actualiza, preguntándose por qué parece que su código recién extraído está detrás del maestro.
Chris Watts
3
@DC_ Estoy de acuerdo con "esta respuesta" (desde que la escribí). La función "seguir una rama" está destinada a actualizar un submódulo a la última confirmación de una rama. Una vez hecho esto, aún tendrá que agregar y confirmar el nuevo estado de submódulo en el repositorio principal. Y el próximo clon verificará ese estado (sin cabeza).
VonC
3
@VonC Entonces, para aclarar aún más, la función "seguir una rama" solo afecta el comportamiento del git submodule updatecomando diciéndole qué confirmación (es decir, la confirmación más reciente en el maestro) para actualizar el submódulo, y no automáticamente que el repositorio principal actualice qué commit es señalado por el submódulo en el tiempo de clonación?
christner