update the submodules submodule recursive index explained already git git-submodules

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:

  1. Elimine la sección relevante del archivo .gitmodules .
  2. Escenario los cambios de .gitmodules git add .gitmodules
  3. Eliminar la sección correspondiente de .git/config .
  4. Ejecute git rm --cached path_to_submodule (sin barra diagonal final).
  5. Ejecute rm -rf .git/modules/path_to_submodule
  6. Commit git commit -m "Removed submodule <name>"
  7. 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 el submodule.<name> Sección submodule.<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 de submodule.$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:

  1. Establecer path_to_submodule var (sin barra diagonal):

    path_to_submodule=path/to/submodule

  2. Elimine la línea relevante del archivo .gitmodules:

    git config -f .gitmodules --remove-section submodule.$path_to_submodule

  3. Eliminar la sección correspondiente de .git / config

    git config -f .git/config --remove-section submodule.$path_to_submodule

  4. Anule y elimine $ path_to_submodule solo del índice (para evitar perder información)

    git rm --cached $path_to_submodule

  5. Seguimiento de los cambios realizados en .gitmodules

    git add .gitmodules

  6. Cometer el superproyecto

    git commit -m "Remove submodule submodule_name"

  7. 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

  1. Eliminar entradas de configuración:
    git config -f .git/config --remove-section submodule.$submodulename
    git config -f .gitmodules --remove-section submodule.$submodulename
  2. Eliminar directorio del índice:
    git rm --cached $submodulepath
  3. Cometer
  4. 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