Git
Submódulos
Buscar..
Añadiendo un submódulo
Puede incluir otro repositorio de Git como una carpeta dentro de su proyecto, seguido por Git:
$ git submodule add https://github.com/jquery/jquery.git
Debe agregar y confirmar el nuevo archivo .gitmodules
; esto le dice a Git qué submódulos deben clonarse cuando se ejecuta la git submodule update
.
Clonando un repositorio Git que tiene submódulos
Cuando clones un repositorio que usa submódulos, necesitarás inicializarlos y actualizarlos.
$ git clone --recursive https://github.com/username/repo.git
Esto clonará los submódulos a los que se hace referencia y los colocará en las carpetas apropiadas (incluidos los submódulos dentro de los submódulos). Esto es equivalente a ejecutar git submodule update --init --recursive
inmediatamente después de que se termina el clon.
Actualización de un submódulo
Un submódulo hace referencia a un compromiso específico en otro repositorio. Para verificar el estado exacto al que se hace referencia para todos los submódulos, ejecute
git submodule update --recursive
A veces, en lugar de utilizar el estado al que se hace referencia, desea actualizar su pago local al último estado de ese submódulo en un control remoto. Para revisar todos los submódulos hasta el último estado en el control remoto con un solo comando, puede usar
git submodule foreach git pull <remote> <branch>
o usa los argumentos por defecto de git pull
git submodule foreach git pull
Tenga en cuenta que esto solo actualizará su copia de trabajo local. La ejecución git status
mostrará el directorio de submódulos como sucio si cambió debido a este comando. Para actualizar su repositorio para hacer referencia al nuevo estado, debe confirmar los cambios:
git add <submodule_directory>
git commit
Es posible que tengas algunos cambios que puedan tener un conflicto de combinación si usas git pull
para que puedas usar git pull --rebase
para rebobinar tus cambios al máximo, la mayoría de las veces disminuye las posibilidades de conflicto. También tira todas las ramas al local.
git submodule foreach git pull --rebase
Para verificar el último estado de un submódulo específico, puede utilizar:
git submodule update --remote <submodule_directory>
Configuración de un submódulo para seguir una rama.
Un submódulo siempre se retira en un commit específico SHA1 (el "gitlink", entrada especial en el índice del repositorio principal)
Pero se puede solicitar actualizar ese submódulo a la última confirmación de una rama del repositorio remoto de submódulo.
En lugar de ir en cada submódulo, haciendo un git checkout abranch --track origin/abranch, git pull
, simplemente puede hacer (desde el repositorio de los padres) a:
git submodule update --remote --recursive
Dado que el SHA1 del submódulo cambiaría, aún tendría que seguir con eso:
git add .
git commit -m "update submodules"
Eso supone que los submódulos fueron:
O bien se agrega con una rama a seguir:
git submodule -b abranch -- /url/of/submodule/repo
o configurado (para un submódulo existente) para seguir una rama:
cd /path/to/parent/repo git config -f .gitmodules submodule.asubmodule.branch abranch
Eliminando un submódulo
Puede eliminar un submódulo (por ejemplo, el the_submodule
) llamando a:
$ git submodule deinit the_submodule
$ git rm the_submodule
git submodule deinit the_submodule
borra la entrada dethe_submodule
s 'de .git / config. Esto excluye the_submodule degit submodule update
,git submodule sync
ygit submodule foreach
calls y elimina su contenido local (fuente) . Además, esto no se mostrará como un cambio en su repositorio principal.git submodule init
ygit submodule update
restaurarán el submódulo, de nuevo sin cambios confiables en su repositorio principal.git rm the_submodule
eliminará el submódulo del árbol de trabajo. Los archivos desaparecerán, así como la entrada de los submódulos en el archivo.gitmodules
(fuente) . Sin embargo, si solo segit rm the_submodule
(sin elgit submodule deinit the_submodule
anteriorgit submodule deinit the_submodule
segit submodule deinit the_submodule
la entrada de submódulos en su archivo .git / config.
Tomado de aquí :
- Elimine la sección relevante del archivo
.gitmodules
. - Escenario los cambios de
.gitmodules
git add .gitmodules
- Eliminar la sección correspondiente de
.git/config
. - Ejecute
git rm --cached path_to_submodule
(sin barra diagonal final). - Ejecute
rm -rf .git/modules/path_to_submodule
- Commit
git commit -m "Removed submodule <name>"
- Eliminar los archivos de submódulos ahora sin seguimiento
-
rm -rf path_to_submodule
Moviendo un submódulo
Correr:
$ git mv old/path/to/module new/path/to/module
1.8 Edite .gitmodules
y cambie la ruta del submódulo adecuadamente, y póngalo en el índice con git add .gitmodules
.
Si es necesario, cree el directorio principal de la nueva ubicación del submódulo ( mkdir -p new/path/to
).
Mueva todo el contenido del directorio antiguo al nuevo ( mv -vi old/path/to/module new/path/to/submodule
).
Asegúrese de que Git rastree este directorio ( git add new/path /to
).
Elimine el directorio antiguo con git rm --cached old/path/to/module
.
Mueva el directorio .git/modules/ old/path/to/module
con todo su contenido a .git/modules/ new/path/to/module
.
Edite el archivo .git/modules/ new/path/to /config
, asegúrese de que el elemento worktree apunta a las nuevas ubicaciones, por lo que en este ejemplo debería ser worktree = ../../../../../ old/path/to/module
. Normalmente debería haber dos más ..
luego directorios en la ruta directa en ese lugar. . Edite el archivo new/path/to/module /.git
, asegúrese de que la ruta en él apunte a la nueva ubicación correcta dentro de la carpeta principal del proyecto .git
, por lo que en este ejemplo gitdir: ../../../.git/modules/ new/path/to/module
.
git status
salida de git status
se ve así después:
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: .gitmodules
# renamed: old/path/to/submodule -> new/path/to/submodule
#
Finalmente, cometer los cambios.
Este ejemplo de Stack Overflow , por Axel Beckert.
Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow