¿Cómo verificar el estado de los submódulos de Git en un repositorio?

GitBeginner
Practicar Ahora

Introducción

Los submódulos de Git (Git submodules) son una característica poderosa que permite incluir repositorios externos dentro de sus propios proyectos. Esta capacidad es particularmente útil cuando su proyecto depende de bibliotecas o componentes externos que se mantienen por separado. Al usar submódulos, puede mantener estas dependencias actualizadas y bien gestionadas.

En este tutorial, aprenderá a verificar el estado de los submódulos de Git en su repositorio, a comprender qué cambios se han realizado en ellos y a asegurarse de que estén correctamente sincronizados con sus repositorios de origen.

Este es un Guided Lab, que proporciona instrucciones paso a paso para ayudarte a aprender y practicar. Sigue las instrucciones cuidadosamente para completar cada paso y obtener experiencia práctica. Los datos históricos muestran que este es un laboratorio de nivel principiante con una tasa de finalización del 82%. Ha recibido una tasa de reseñas positivas del 96% por parte de los estudiantes.

Creación de un Repositorio con Submódulos

Comencemos creando un repositorio de ejemplo con un submódulo para tener un entorno práctico para nuestro aprendizaje.

Configuración del Repositorio Principal

Primero, crearemos un nuevo repositorio principal donde agregaremos nuestro submódulo. Abra su terminal y ejecute los siguientes comandos:

cd ~/project
mkdir main-repo
cd main-repo
git init

Debería ver una salida similar a:

Initialized empty Git repository in /home/labex/project/main-repo/.git/

Ahora, creemos un archivo simple en nuestro repositorio principal:

echo "## Main Repository" > README.md
git add README.md
git commit -m "Initial commit"

La salida debería indicar que ha creado su primer commit:

[master (root-commit) xxxxxxx] Initial commit
 1 file changed, 1 insertion(+)
 create mode 100644 README.md

Agregar un Submódulo

Ahora agreguemos un submódulo a nuestro repositorio principal. Para este tutorial, usaremos un repositorio público pequeño como nuestro submódulo:

git submodule add https://github.com/libgit2/libgit2-backends.git libs/libgit2-backends

Este comando clonará el repositorio y lo agregará como un submódulo en el directorio libs/libgit2-backends. Debería ver una salida similar a:

Cloning into '/home/labex/project/main-repo/libs/libgit2-backends'...
remote: Enumerating objects: xxx, done.
remote: Counting objects: 100% (xxx/xxx), done.
remote: Compressing objects: 100% (xxx/xxx), done.
remote: Total xxx (delta xx), reused xxx (delta xx), pack-reused xxx
Receiving objects: 100% (xxx/xxx), xxx KiB | xxx KiB/s, done.
Resolving deltas: 100% (xxx/xxx), done.

Comprender los Cambios

Cuando agrega un submódulo, Git crea un archivo .gitmodules en su repositorio que rastrea la URL y la ruta del submódulo. Veamos este archivo:

cat .gitmodules

Debería ver contenido similar a:

[submodule "libs/libgit2-backends"]
	path = libs/libgit2-backends
	url = https://github.com/libgit2/libgit2-backends.git

También verifiquemos el estado de nuestro repositorio:

git status

Debería ver una salida que indica que tanto el nuevo archivo .gitmodules como el directorio del submódulo se han agregado:

On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        new file:   .gitmodules
        new file:   libs/libgit2-backends

Confirmemos estos cambios para completar nuestra configuración:

git commit -m "Add libgit2-backends submodule"

Ahora debería tener un repositorio con un submódulo configurado con éxito.

Verificación del Estado de los Submódulos

Ahora que tenemos un repositorio con un submódulo, aprendamos a verificar el estado del submódulo y a comprender lo que significa la salida.

Verificación Básica del Estado del Submódulo

Git proporciona un comando específico para verificar el estado de los submódulos. Ejecute el siguiente comando:

cd ~/project/main-repo
git submodule status

Debería ver una salida similar a:

+abcdef1234567890abcdef1234567890abcdef12 libs/libgit2-backends (v1.0.0-123-gabcdef12)

Entendamos lo que significa esta salida:

  1. El primer carácter puede ser uno de:

    • +: indica que el commit del submódulo verificado difiere de lo que está registrado en el repositorio principal
    • (espacio): indica que el submódulo está sincronizado con lo que está registrado
    • -: indica que el submódulo no está inicializado
    • U: indica conflictos de fusión en el submódulo
  2. La cadena alfanumérica es el hash del commit del commit actual verificado en el submódulo.

  3. La ruta muestra dónde se encuentra el submódulo en su repositorio.

  4. El texto entre paréntesis muestra información adicional sobre el commit verificado, como etiquetas o nombres de ramas.

Información Detallada del Submódulo

Para obtener información más detallada sobre sus submódulos, puede usar el siguiente comando:

git submodule

Esto mostrará información similar al comando de estado, pero en un formato diferente.

Uso de Git Status para Ver Cambios en el Submódulo

También puede usar el comando estándar git status para ver los cambios en los submódulos:

git status

Si no hay cambios en el submódulo, no verá ninguna mención de él en la salida. Sin embargo, si hay cambios en el commit verificado del submódulo o en los archivos dentro del submódulo, git status mostrará esta información.

Examinando el Contenido del Submódulo

Examinemos el contenido de nuestro submódulo:

cd ~/project/main-repo
ls -la libs/libgit2-backends/

Verá los archivos del repositorio libgit2-backends. Tenga en cuenta que el submódulo es esencialmente un repositorio Git completo dentro de su repositorio principal. Puede verificar esto buscando la presencia de un directorio .git:

ls -la libs/libgit2-backends/.git

Es posible que no vea un directorio .git directamente, sino un archivo que apunta a los datos reales del repositorio Git almacenados en el directorio .git/modules de su repositorio principal. Así es como Git gestiona los submódulos.

Comprender la Referencia del Submódulo

El repositorio principal almacena una referencia a un commit específico en el repositorio del submódulo. Esta referencia es la que Git usa para saber qué versión del submódulo debe verificarse al clonar su repositorio o actualizar el submódulo.

Veamos el commit al que hace referencia nuestro repositorio principal:

cd ~/project/main-repo
git ls-files --stage libs/libgit2-backends

La salida mostrará un hash de commit, que es el commit específico del submódulo que el repositorio principal está rastreando.

Actualización de Submódulos

Una tarea común al trabajar con submódulos es mantenerlos actualizados con sus repositorios remotos. Aprendamos a actualizar nuestro submódulo.

Inicialización y Actualización de Submódulos

Si acaba de clonar un repositorio que contiene submódulos, deberá inicializarlos y actualizarlos. Para nuestro repositorio existente, podemos demostrar este proceso con:

cd ~/project/main-repo
git submodule init
git submodule update

El comando init inicializa la configuración de sus submódulos, y el comando update obtiene los datos y verifica el commit especificado en su repositorio principal.

También puede combinar estos comandos:

git submodule update --init

Actualización de Submódulos a la Última Versión Remota

Si desea actualizar un submódulo al último commit en su repositorio remoto, puede usar:

cd ~/project/main-repo
git submodule update --remote libs/libgit2-backends

Este comando obtiene los últimos cambios del repositorio remoto y actualiza el submódulo. Debería ver una salida que indica que Git está obteniendo cambios.

Después de ejecutar este comando, verifiquemos el estado del submódulo:

git submodule status

Notará que la salida ahora muestra un signo más (+) al principio, lo que indica que el commit verificado del submódulo difiere de lo que está registrado en el repositorio principal:

+abcdef1234567890abcdef1234567890abcdef12 libs/libgit2-backends (origin/HEAD)

Para confirmar los cambios en su repositorio principal, ejecute:

git status

Debería ver una salida que indica que el submódulo ha sido modificado:

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   libs/libgit2-backends (new commits)

Confirmación de la Referencia del Submódulo Actualizado

Para registrar el estado actualizado del submódulo en su repositorio principal, debe agregar y confirmar los cambios:

git add libs/libgit2-backends
git commit -m "Update libgit2-backends submodule to latest version"

La salida debería indicar que ha confirmado con éxito la nueva referencia del submódulo.

Verificación del Estado Actualizado

Después de confirmar la referencia del submódulo actualizado, verifiquemos el estado nuevamente:

git submodule status

La salida ya no debería tener un signo más al principio, lo que indica que el submódulo ahora está sincronizado con lo que está registrado en el repositorio principal:

 abcdef1234567890abcdef1234567890abcdef12 libs/libgit2-backends (origin/HEAD)

Comprensión de las Opciones de Actualización del Submódulo

El comando git submodule update tiene varias opciones que controlan cómo se realizan las actualizaciones:

  • --remote: Actualizar al último commit en la rama de seguimiento remota
  • --merge: Fusionar los cambios si la rama actual está por detrás de la remota
  • --rebase: Rebasar los cambios si la rama actual está por detrás de la remota
  • --recursive: Actualizar también los submódulos anidados

Para la mayoría de los casos de uso básicos, git submodule update --remote es suficiente.

Trabajando con Cambios en Submódulos

A veces, necesita trabajar con cambios dentro de un submódulo. En este paso, aprenderemos a realizar y gestionar cambios dentro de los submódulos.

Para trabajar con un submódulo, debe navegar a su directorio:

cd ~/project/main-repo/libs/libgit2-backends

Desde aquí, puede usar los comandos Git estándar para ver información sobre el repositorio del submódulo:

git status
git log -3 --oneline

El comando git status muestra el estado actual del repositorio del submódulo, y git log muestra los commits recientes.

Realización de Cambios en un Submódulo

Hagamos un cambio simple en un archivo en el submódulo. Primero, creemos un nuevo archivo:

echo "## My notes on libgit2-backends" > NOTES.md

Ahora, verifiquemos el estado de nuestro cambio:

git status

Debería ver una salida que indica que tiene un archivo sin seguimiento:

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        NOTES.md

Agreguemos y confirmemos este cambio en el submódulo:

git add NOTES.md
git commit -m "Add notes file"

Debería ver una salida que confirma su commit dentro del submódulo.

Verificación del Estado desde el Repositorio Principal

Ahora, volvamos al repositorio principal y verifiquemos el estado:

cd ~/project/main-repo
git status

Debería ver una salida que indica que el submódulo ha sido modificado:

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   libs/libgit2-backends (new commits)

Confirmación de los Cambios del Submódulo en el Repositorio Principal

Para registrar el nuevo estado del submódulo en su repositorio principal, debe agregar y confirmar los cambios:

git add libs/libgit2-backends
git commit -m "Update libgit2-backends with notes file"

La salida debería indicar que ha confirmado con éxito la nueva referencia del submódulo.

Visualización de Cambios Detallados del Submódulo

Para ver información más detallada sobre los cambios en los submódulos, puede usar:

git diff --submodule

Este comando muestra el rango de commits que se han agregado o eliminado en cada submódulo modificado.

Resumen de Trabajo con Cambios en Submódulos

Al trabajar con cambios en un submódulo, recuerde este flujo de trabajo:

  1. Navegue al directorio del submódulo
  2. Realice y confirme los cambios dentro del submódulo
  3. Regrese al repositorio principal
  4. Agregue y confirme la referencia del submódulo actualizado

Este proceso de confirmación en dos pasos (primero en el submódulo, luego en el repositorio principal) es esencial para rastrear correctamente los cambios en los submódulos.

Resumen

En este tutorial, ha aprendido a trabajar con submódulos de Git, centrándose en verificar su estado y realizar actualizaciones. Esto es lo que logró:

  1. Creó un repositorio principal y le agregó un submódulo
  2. Aprendió a verificar el estado de los submódulos utilizando varios comandos de Git
  3. Actualizó un submódulo a la última versión desde su repositorio remoto
  4. Realizó cambios dentro de un submódulo y rastreó correctamente esos cambios en el repositorio principal

Los submódulos de Git proporcionan una forma poderosa de incluir repositorios externos dentro de sus proyectos, lo que le permite gestionar las dependencias de manera eficiente. Al comprender cómo verificar su estado y gestionar las actualizaciones, puede asegurarse de que su proyecto permanezca correctamente sincronizado con sus dependencias.

Comandos clave para recordar:

  • git submodule status - Verifique el estado actual de los submódulos
  • git submodule update --remote - Actualice los submódulos a sus últimas versiones
  • git add <submodule-path> - Prepare los cambios en la referencia de un submódulo
  • git diff --submodule - Vea los cambios detallados en los submódulos

Con estas habilidades, puede gestionar eficazmente los repositorios de Git que incorporan código externo a través de submódulos.