Pregunta ¿Cómo elimino un submódulo?


¿Cómo elimino un submódulo de Git?

Por cierto, ¿hay alguna razón por la que no puedo simplemente hacer

git submodule rm whatever

?


3019
2017-08-11 14:31


origen


Respuestas:


Ya que 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 expresas tu interés en un submódulo con "submodule init".
  "submodule deinit"es la manera de hacerlo".

El proceso de eliminación también utiliza git rm (desde git1.8.5 de octubre de 2013).

Resumen

El proceso de eliminación de 3 pasos sería:

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 Daniel Schroederes respondery resumido por Eonil en los comentarios:

Esto deja .git/modules/<path-to-submodule>/ sin alterar.
  Entonces, si una vez elimina un submódulo con este método y lo vuelve a agregar, no será posible porque el repositorio ya se ha dañado.


git rm: Ver cometer 95c16418:

Actualmente usando "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 queda intacto, que es un residuo del submódulo que se ha eliminado y puede irritar a los usuarios (a diferencia de la configuración de .git/config, esto debe permanecer como un recordatorio de que el usuario mostró interés en este submódulo, por lo que se volverá a llenar más adelante cuando se desproteja una confirmación más antigua).

Dejar "git rm"ayuda al usuario no solo eliminando el submódulo del árbol de trabajo sino también quitándolo"submodule.<submodule name>"sección de la .gitmodules archivo y etapa ambos.


git submodule deinit: Proviene de este parche:

Con "git submodule init"el usuario puede decirle a git que se preocupan por uno o más submódulos y quiere que se complete en la próxima llamada a"git submodule update".
  Pero actualmente no hay una manera fácil de decirles a ellos que ya no les importa un submódulo y quiere deshacerse del árbol de trabajo local (a menos que el usuario sepa mucho sobre los componentes internos del submódulo y elimine el "submodule.$name.url"ajuste desde .git/config junto con el árbol de trabajo mismo).

Ayude a esos usuarios proporcionando un 'deinit'comando.
  Esta elimina el todo submodule.<name> sección de .git/config ya sea por el dado   submódulo (s) (o para todos los que se han inicializado si '.' es dado).
  Fallar si el árbol de trabajo actual contiene modificaciones a menos que sea forzado.
  Quejarse cuando para un submódulo dado en la línea de comando no se puede encontrar la configuración de url en .git/config, pero sin embargo no fallan

Esto tiene cuidado si los pasos de (de) inicialización (.git/config y .git/modules/xxx)

Desde git1.8.5, el git rm toma además cuidado de:

  • 'add'paso que registra la url de un submódulo en el .gitmodules archivo: es necesario eliminarlo por usted.
  • el submódulo entrada especial (como se ilustra por esta pregunta): el git rm lo elimina del índice:
    git rm --cached path_to_submodule(sin barra inclinada)
    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 ese último paso e intenta agregar lo que era un submódulo como un directorio regular, obtendría 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 C.

Ver cometer 2e61273, cometer 1342476 (14 de enero de 2018) por Prathamesh Chavan (pratham-pc).
(Fusionado por Junio ​​C Hamano - gitster - en cometer ead8dbe13 de febrero de 2018) 

git ${wt_prefix:+-C "$wt_prefix"} submodule--helper deinit \
  ${GIT_QUIET:+--quiet} \
  ${prefix:+--prefix "$prefix"} \
  ${force:+--force} \
  ${deinit_all:+--all} "$@"

1796
2018-04-23 05:57



A través de la página Tutorial de Git Submódulo:

Para eliminar un submódulo, debes:

  1. Eliminar la sección relevante de la .gitmodules archivo.
  2. Etapa el .gitmodules cambios git add .gitmodules
  3. Eliminar la sección relevante de .git/config.
  4. correr git rm --cached path_to_submodule (sin barra al final).
  5. correr 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

Ver también: pasos alternativos a continuación.


3144
2018-01-18 23:30



Solo una nota. Desde git 1.8.5.2, dos comandos harán:

git rm the_submodule
rm -rf .git/modules/the_submodule

Como señaló correctamente la respuesta de @Mark Cheverton, si no se usa la segunda línea, incluso si se eliminó el submódulo por el momento, la carpeta remanente .git / modules / the_submodule evitará que el mismo submódulo se agregue o reemplace en el futuro . Además, como @VonC mencionó, git rm hará la mayor parte del trabajo en un submódulo.

--Update (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 subdir.

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 el [submodule "the_submodule"] Sección de .git/config (a partir de julio de 2017), que se puede eliminar con un tercer comando:

git config -f .git/config --remove-section submodule.the_submodule 2> /dev/null

331
2018-04-13 08:51



La mayoría de las respuestas a esta pregunta son obsoletas, incompletas o innecesariamente complejas.

Un submódulo clonado usando git 1.7.8 o posterior dejará a lo sumo 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

244
2018-03-02 16:07



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 el 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 tu lo hagas git submodule add, solo lo agrega a .gitmodules, pero una vez que lo hiciste git submodule init, se agregó a .git/config.

Entonces, si desea eliminar los módulos, pero puede restaurarlos rápidamente, entonces haz solo 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 una secuencia de comandos.

También eche un vistazo a una respuesta a ¿Puedo despoblar un submódulo de Git?.


183
2017-08-11 14:43



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)


80
2017-10-12 10:17



Debe eliminar la entrada en .gitmodules y .git/configy eliminar el directorio del módulo del historial:

git rm --cached path/to/submodule

Si escribes en la lista de correo de git, probablemente alguien haga un script de shell para ti.


46
2017-11-01 21:43