# Creación de Submódulos Utilizando GIT ## **Incorporando un Repositorio Git Existente como Submódulo en el Repositorio Activo** 1. Para agregar un nuevo submódulo, utiliza el comando `git submodule add`, especificando la URL absoluta o relativa del proyecto a rastrear. En este ejemplo, dentro del repositorio `oc-monorepo`, se incluye la rama 6.8 de la siguiente manera: ```bash git submodule add -b 6.8 [ssh://modelo] modules/[nombre_modleo] ``` La salida esperada es similar a: ```bash Cloning into 'DbConnector'... remote: Counting objects: 11, done. remote: Compressing objects: 100% (10/10), done. remote: Total 11 (delta 0), reused 11 (delta 0) Unpacking objects: 100% (11/11), done. Checking connectivity... done. ``` Por defecto, los submódulos se agregan a un directorio con el mismo nombre que el repositorio, por ejemplo, "DbConnector". Puedes especificar una ruta diferente al final del comando si deseas ubicarlo en otro lugar. **Nota:** Es crucial elegir cuidadosamente la ruta de los submódulos. Al ejecutar `git status` en este punto, notarás algunas adiciones: ```bash $ git status On branch master Your branch is up-to-date with 'origin/master'. Changes to be committed: (use "git reset HEAD ..." to unstage) new file: .gitmodules new file: DbConnector ``` El nuevo archivo `.gitmodules` es una configuración que almacena la relación entre la URL del proyecto y el subdirectorio local. Por ejemplo: ```bash [submodule "DbConnector"] path = DbConnector url = https://github.com/chaconinc/DbConnector ``` Asegúrate de que la URL sea accesible para otros al clonar el proyecto. ## **Clonación de un Proyecto con Submódulos** Al clonar un proyecto con submódulos, por defecto se obtienen los directorios que contienen submódulos, pero no se descargan los archivos dentro de ellos. Ejecuta: ```bash git clone --recurse-submodules https://github.com/chaconinc/MainProject ``` Esto inicializará y actualizará automáticamente cada submódulo en el repositorio. Si olvidaste usar `--recurse-submodules` al clonar, puedes combinar los pasos `git submodule init` y `git submodule update` ejecutando `git submodule update --init`. Para inicializar, obtener y cambiar también cualquier submódulo anidado, utiliza `git submodule update --init --recursive`. ## **Trabajando en un Proyecto con Submódulos** Ahora que tenemos una copia del proyecto con submódulos, colaboraremos tanto en el proyecto principal como en el submódulo. ### **Incorporando Cambios Ascendentes desde el Control Remoto del Submódulo** Para verificar nuevos cambios en un submódulo, ve al directorio y ejecuta `git fetch` y `git merge [la rama ascendente]`. Por ejemplo: ```bash $ git fetch From https://github.com/chaconinc/DbConnector c3f01dc..d0354fc master -> origin/master $ git merge origin/master Updating c3f01dc..d0354fc Fast-forward scripts/connect.sh | 1 + src/db.c | 1 + 2 files changed, 2 insertions(+) ``` Al ejecutar `git diff`, puedes ver los cambios y confirmarlos si es necesario. Configura `diff.submodule` como "log" para mostrar cambios de submódulos automáticamente. ```bash git config --global diff.submodule log git diff ``` Una forma más sencilla es ejecutar `git submodule update --remote` para actualizar automáticamente los submódulos. ```bash git submodule update --remote ``` ## **Incorporando Cambios Ascendentes desde el Control Remoto del Proyecto Principal** Después de un `git pull`, ejecuta `git submodule update --init --recursive` para actualizar los submódulos. ```bash git pull git submodule update --init --recursive ``` ## **Trabajando con un Submódulo** Al ejecutar `git submodule update`, los archivos del submódulo se actualizan, pero el repositorio queda en un estado de "HEAD separado". Para facilitar el acceso y las modificaciones: ### **Configuración Inicial** 1. Accede al Submódulo: ```bash cd NombreDelSubmodulo/ ``` 2. Selecciona una Rama: ```bash git checkout stable ``` ### **Actualización del Submódulo** 1. Recupera Cambios Remotos: ```bash cd .. git submodule update --remote --merge ``` Ahora, cualquier cambio local en el submódulo y los cambios remotos se fusionarán automáticamente en tu rama local. 2. Para realizar tus cambios, vuelve al directorio del submódulo y haz tus modificaciones. Después, realiza un commit. 3. Publica los cambios del submódulo: ```bash git submodule update --remote NombreDelSubmodulo ``` Esto actualiza y fusiona automáticamente los cambios del submódulo en tu rama local.