the - git submodule update--init
¿Cómo elimino un submódulo? (21)
¿Cómo elimino un submódulo de Git?
Por cierto, ¿hay alguna razón por la que no pueda simplemente hacer git submodule rm whatever
?
A través de la página Git Submodule Tutorial :
Para eliminar un submódulo necesitas:
- 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
Ver también : pasos alternativos a continuación .
Acabo de encontrar el archivo oculto .submodule (olvidé el nombre exacto), tiene una lista ... puede borrarlos individualmente de esa manera. Acabo de tener uno, así que lo borré. Simple, pero podría arruinar a Git, ya que no sé si hay algo adjunto al submódulo. Parece bien hasta ahora, aparte del problema de actualización habitual de libetpan, pero eso (con suerte) no tiene relación.
Notado que nadie publicó borrado manual, por lo que agregó.
Además de las recomendaciones, también tuve que rm -Rf .git/modules/path/to/submodule
para poder agregar un nuevo submódulo con el mismo nombre (en mi caso, estaba reemplazando un tenedor con el original)
Aquí están los 4 pasos que encontré necesarios o útiles (los importantes primero):
git rm -f the_submodule
rm -rf .git/modules/the_submodule
git config -f .git/config --remove-section submodule.the_submodule
git commit -m "..."
En teoría , git rm
en el paso 1 debería cuidarlo. Con suerte, la segunda parte de la pregunta de OP se puede responder positivamente un día (que esto se puede hacer en un comando).
Pero a partir de julio de 2017, el paso 2 es necesario para eliminar datos en .git/modules/
de lo contrario, no puede, por ejemplo, volver a agregar el submódulo en el futuro.
Probablemente pueda salirse con los dos pasos anteriores para git 1.8.5+ como se indicó en la respuesta de tinlyx , ya que todos los comandos de git submodule
parecen funcionar.
El paso 3 elimina la sección para el the_submodule
en el archivo .git/config
. Esto debe hacerse para completar. (La entrada puede causar problemas en versiones anteriores de git, pero no tengo una para probar).
Para esto, la mayoría de las respuestas sugieren usar git submodule deinit
. Me parece más explícito y menos confuso usar git config -f .git/config --remove-section
. Según la documentación de git-submodule , git deinit
:
Anule el registro de los submódulos dados ... Si realmente desea eliminar un submódulo del repositorio y confirmar que use git-rm [1] en su lugar .
Por último, pero no menos importante, si no git commit
, obtendrá / puede obtener un error al realizar el git submodule summary
(a partir de git 2.7):
fatal: Not a git repository: ''the_submodule/.git''
* the_submodule 73f0d1d...0000000:
Esto es independientemente de si haces los pasos 2 o 3.
Aquí esta lo que hice :
1.) Eliminar la sección correspondiente del archivo .gitmodules. Puedes usar el siguiente comando:
git config -f .gitmodules --remove-section "submodule.submodule_name"
2.) Etapa de los cambios .gitmodules
git add .gitmodules
3.) Eliminar la sección correspondiente de .git/config
. Puedes usar el siguiente comando:
git submodule deinit -f "submodule_name"
4.) Eliminar el gitlink (sin barra inclinada):
git rm --cached path_to_submodule
5.) Limpiar los .git/modules
:
rm -rf .git/modules/path_to_submodule
6.) Cometer:
git commit -m "Removed submodule <name>"
7.) Eliminar los archivos de submódulos ahora sin seguimiento
rm -rf path_to_submodule
Debe eliminar la entrada en .gitmodules
y .git/config
, y eliminar el directorio del módulo del historial:
git rm --cached path/to/submodule
Si escribe en la lista de correo de git, probablemente alguien hará un script de shell por usted.
Desde git1.8.3 (22 de abril de 2013) :
No había una forma de porcelana para decir "Ya no estoy interesado en este submódulo", una vez que expreses tu interés en un submódulo con "
submodule init
".
"submodule deinit
" es la forma de hacerlo.
El proceso de eliminación también utiliza git rm
(desde git1.8.5 octubre de 2013).
Resumen
El proceso de eliminación de 3 pasos sería entonces:
0. mv a/submodule a/submodule_tmp
1. git submodule deinit -f -- a/submodule
2. rm -rf .git/modules/a/submodule
3. git rm -f a/submodule
# Note: a/submodule (no trailing slash)
# or, if you want to leave it in your working tree and have done step 0
3. git rm --cached a/submodule
3bis mv a/submodule_tmp a/submodule
Explicación
rm -rf
: Esto se menciona en la answer Daniel Schroeder y se resume en Eonil en los comentarios :
Esto deja
.git/modules/<path-to-submodule>/
sin cambios.
Entonces, si una vez elimina un submódulo con este método y los vuelve a agregar, no será posible porque el repositorio ya está dañado.
git rm
: Ver commit 95c16418 :
Actualmente, el uso de "
git rm
" en un submódulo elimina el árbol de trabajo del submódulo del del superproyecto y el gitlink del índice.
Pero la sección del submódulo en.gitmodules
se deja intacta, lo que es un resto del submódulo ahora eliminado y puede irritar a los usuarios (a diferencia de la configuración en.git/config
, esto debe permanecer como un recordatorio de que el usuario mostró interés en este submódulo por lo tanto, se volverá a rellenar más adelante cuando se extraiga una confirmación anterior).Deje que "
git rm
" ayude al usuario, no solo eliminando el submódulo del árbol de trabajo, sino también eliminando la sección "submodule.<submodule name>
" del archivo.gitmodules
y.gitmodules
ambos.
git submodule deinit
: Se deriva de este parche :
Con "
git submodule init
" el usuario puede decirle a git que se preocupa por uno o más submódulos y desea que se complete en la próxima llamada a "git submodule update
".
Pero actualmente no hay una manera fácil de decirle a Git que ya no les importa un submódulo y quieren deshacerse del árbol de trabajo local (a menos que el usuario sepa mucho sobre los internos del submódulo y elimine el "submodule.$name.url
" configuración de.git/config
junto con el propio árbol de trabajo).Ayude a esos usuarios proporcionando un comando ''
deinit
''.
Esto elimina todo elsubmodule.<name>
Secciónsubmodule.<name>
de.git/config
ya sea para el (los) submódulo (s) dado (o para todos aquellos que se han inicializado si se da ''.
'').
Fallo si el árbol de trabajo actual contiene modificaciones a menos que sea forzado.
Reclame cuando para un submódulo dado en la línea de comandos, la configuración de url no se puede encontrar en.git/config
, pero no falla.
Esto se encarga de los pasos de (des) inicialización ( .git/config
y .git/modules/xxx
)
Desde git1.8.5, git rm
también se encarga de:
- Paso ''
add
'' que registra la url de un submódulo en el archivo.gitmodules
: es necesario eliminarlo por usted. - La entrada especial del submódulo (como lo ilustra esta pregunta ): el git rm lo elimina del índice:
git rm --cached path_to_submodule
(sin barra diagonal)
Eso eliminará ese directorio almacenado en el índice con un modo especial "160000", marcándolo como un directorio raíz de submódulo.
Si olvida el último paso e intenta agregar lo que era un submódulo como un directorio regular, recibirá un mensaje de error como:
git add mysubmodule/file.txt
Path ''mysubmodule/file.txt'' is in submodule ''mysubmodule''
Nota: desde Git 2.17 (Q2 2018), git submódulo deinit ya no es un script de shell.
Es una llamada a una función de C.
Consulte commit 2e61273 , commit 1342476 (14 de enero de 2018) de Prathamesh Chavan ( pratham-pc
) .
(Combinado por Junio C Hamano - gitster
- in commit ead8dbe , 13 de febrero de 2018)
git ${wt_prefix:+-C "$wt_prefix"} submodule--helper deinit /
${GIT_QUIET:+--quiet} /
${prefix:+--prefix "$prefix"} /
${force:+--force} /
${deinit_all:+--all} "$@"
Después de experimentar con todas las diferentes respuestas en este sitio, terminé con esta solución:
#!/bin/sh
path="$1"
if [ ! -f "$path/.git" ]; then
echo "$path is no valid git submodule"
exit 1
fi
git submodule deinit -f $path &&
git rm --cached $path &&
rm -rf .git/modules/$path &&
rm -rf $path &&
git reset HEAD .gitmodules &&
git config -f .gitmodules --remove-section submodule.$path
Esto restaura exactamente el mismo estado que tenía antes de agregar el submódulo. Puede volver a agregar el submódulo de inmediato, lo que no fue posible con la mayoría de las respuestas aquí.
git submodule add $giturl test
aboveScript test
Esto te deja con un checkout limpio sin cambios que comprometer.
Esto fue probado con:
$ git --version
git version 1.9.3 (Apple Git-50)
Encontré que deinit
funciona bien para mí:
git submodule deinit <submodule-name>
git rm <submodule-name>
Desde git docs :
deinit
Anule el registro de los submódulos dados, es decir, elimine todo el
submodule.$name
Sección desubmodule.$name
de .git / config junto con su árbol de trabajo.
La mayoría de las respuestas a esta pregunta son obsoletas, incompletas o innecesariamente complejas.
Un submódulo clonado utilizando git 1.7.8 o posterior dejará como máximo cuatro rastros de sí mismo en su repositorio local. El proceso para eliminar esos cuatro rastros viene dado por los tres comandos a continuación:
# Remove the submodule entry from .git/config
git submodule deinit -f path/to/submodule
# Remove the submodule directory from the superproject''s .git/modules directory
rm -rf .git/modules/path/to/submodule
# Remove the entry in .gitmodules and remove the submodule directory located at path/to/submodule
git rm -f path/to/submodule
Lo que estoy haciendo actualmente en diciembre de 2012 (combina la mayoría de estas respuestas):
oldPath="vendor/example"
git config -f .git/config --remove-section "submodule.${oldPath}"
git config -f .gitmodules --remove-section "submodule.${oldPath}"
git rm --cached "${oldPath}"
rm -rf "${oldPath}" ## remove src (optional)
rm -rf ".git/modules/${oldPath}" ## cleanup gitdir (optional housekeeping)
git add .gitmodules
git commit -m "Removed ${oldPath}"
Para eliminar un submódulo agregado usando:
git submodule add [email protected]:repos/blah.git lib/blah
Correr:
git rm lib/blah
Eso es.
Para versiones antiguas de git (circa ~ 1.8.5) use:
git submodule deinit lib/blah
git rm lib/blah
git config -f .gitmodules --remove-section submodule.lib/blah
Para resumir, esto es lo que debes hacer:
Establecer
path_to_submodule
var (sin barra diagonal):path_to_submodule=path/to/submodule
Elimine la línea relevante del archivo .gitmodules:
git config -f .gitmodules --remove-section submodule.$path_to_submodule
Eliminar la sección correspondiente de .git / config
git config -f .git/config --remove-section submodule.$path_to_submodule
Anule y elimine $ path_to_submodule solo del índice (para evitar perder información)
git rm --cached $path_to_submodule
Seguimiento de los cambios realizados en .gitmodules
git add .gitmodules
Cometer el superproyecto
git commit -m "Remove submodule submodule_name"
Eliminar los archivos de submódulos ahora sin seguimiento
rm -rf $path_to_submodule
rm -rf .git/modules/$path_to_submodule
Puede usar un alias para automatizar las soluciones proporcionadas por otros:
[alias]
rms = "!f(){ git rm --cached /"$1/";rm -r /"$1/";git config -f .gitmodules --remove-section /"submodule.$1/";git config -f .git/config --remove-section /"submodule.$1/";git add .gitmodules; }; f"
Pon eso en tu configuración git, y luego puedes hacer: git rms path/to/submodule
Recientemente descubrí un proyecto git que incluye muchos comandos útiles relacionados con git: https://github.com/visionmedia/git-extras
Instálalo y escribe:
git-delete-submodule submodule
Entonces se hacen las cosas. El directorio de submódulos se eliminará de su repositorio y seguirá existiendo en su sistema de archivos. A continuación, puede confirmar el cambio como: git commit -am "Remove the submodule"
.
Si acaba de agregar el submódulo, y por ejemplo, simplemente agregó el submódulo incorrecto o lo agregó al lugar equivocado, simplemente haga git stash
luego elimine la carpeta. Esto es asumiendo que agregar el submódulo es lo único que hizo en el repositorio reciente.
Si el submódulo se agregó accidentalmente porque agregó, confirmó y empujó una carpeta que ya era un repositorio Git (contenido .git
), no tendrá un archivo .gitmodules
para editar, ni nada en .git/config
. En este caso todo lo que necesitas es:
git rm --cached subfolder
git add subfolder
git commit -m "Enter message here"
git push
FWIW , también FWIW la carpeta .git
antes de hacer el git add
.
Solo una nota. Desde git 1.8.5.2, dos comandos harán:
git rm the_submodule
rm -rf .git/modules/the_submodule
Como la respuesta de @Mark Cheverton señaló correctamente, si no se usa la segunda línea, incluso si eliminó el submódulo por ahora, la carpeta remanente .git / modules / the_submodule evitará que se vuelva a agregar o reemplazar el mismo submódulo en el futuro . Además, como mencionó @VonC, git rm
realizará la mayor parte del trabajo en un submódulo.
--Actualización (07/05/2017) -
Solo para aclarar, the_submodule
es la ruta relativa del submódulo dentro del proyecto. Por ejemplo, es subdir/my_submodule
si el submódulo está dentro de un subdirectorio subdirectorio.
Como se señaló correctamente en los comentarios y otras respuestas , los dos comandos (aunque son funcionalmente suficientes para eliminar un submódulo), dejan un rastro en la sección [submodule "the_submodule"]
de .git/config
(a partir de julio de 2017), que puede ser eliminado usando un tercer comando:
git config -f .git/config --remove-section submodule.the_submodule 2> /dev/null
Tuve que llevar los pasos de John Douthat un paso más allá, ingresar al directorio del submódulo y luego eliminar el repositorio de Git:
cd submodule
rm -fr .git
Entonces podría enviar los archivos como parte del repositorio principal de Git sin la referencia anterior a un submódulo.
Pasos simples
- Eliminar entradas de configuración:
git config -f .git/config --remove-section submodule.$submodulename
git config -f .gitmodules --remove-section submodule.$submodulename
- Eliminar directorio del índice:
git rm --cached $submodulepath
- Cometer
- Eliminar archivos no utilizados:
rm -rf $submodulepath
rm -rf .git/modules/$submodulename
Tenga en cuenta: $submodulepath
no contiene barras diagonales iniciales o finales.
Fondo
Cuando haces git submodule add
, solo se agrega a .gitmodules
, pero una vez que hiciste git submodule init
, se agregó a .git/config
.
Entonces, si desea eliminar los módulos, pero poder restaurarlo rápidamente, haga esto:
git rm --cached $submodulepath
git config -f .git/config --remove-section submodule.$submodulepath
Es una buena idea hacer git rebase HEAD
primero y git commit
al final, si pones esto en un script.
También eche un vistazo a una respuesta a ¿Puedo despoblar un submódulo de Git? .
project dir: ~/foo_project/
submodule: ~/foo_project/lib/asubmodule
- - - - - - - - - - - - - - - - - - - - - - - - -
run:
1. cd ~/foo_project
2. git rm lib/asubmodule &&
rm .git/modules/lib/asubmodule &&
git submodule lib/asubmodule deinit --recursive --force