Pregunta

¿Cómo puedo eliminar una Git submódulo?

Por cierto, ¿hay alguna razón simplemente no me puedo hacer git submodule rm whatever ?

¿Fue útil?

Solución

Desde git1.8.3 (abril de 22d, 2013):

No era de Porcelana manera de decir "yo ya no estoy interesado en este submódulo", una vez que expresen su 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 3-pasos del proceso de eliminación 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 Schroeder's respuesta, y resumidos por Eonil en los comentarios:

Esto deja .git/modules/<path-to-submodule>/ sin cambios.
Así que si usted una vez que elimine un submódulo con este método y volver a añadirlos de nuevo, no será posible debido a que el repositorio ya se ha dañado.


git rm:Ver cometer 95c16418:

En la actualidad el uso de "git rm"en un submódulo quita el submódulo de trabajo del árbol de la de la superproject y la gitlink del índice.
Pero el submódulo de la sección en .gitmodules queda intacto, que es un sobrante del ahora retirado submódulo y puede irritar los usuarios (en oposición a la puesta en .git/config, este 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 tarde, cuando un viejo commit está desprotegido).

Vamos a "git rm"ayudar a que el usuario no sólo la eliminación de la submódulo de la obra árbol, sino también por la eliminación de la "submodule.<submodule name>"la sección de la .gitmodules archivo y de la etapa de ambos.


git submodule deinit:Surge a partir de este parche:

Con "git submodule init"el usuario es capaz de decirle a git que se preocupan de uno o más de los submódulos y quiere que se rellena en la siguiente llamada a "git submodule update".
Pero en la actualidad no existe una forma fácil que puede decirle a git que no se preocupan por un submódulo más y quiere deshacerse de los locales de trabajo árbol (a menos que el usuario sabe mucho sobre submódulo internos y quita "submodule.$name.url"configuración de .git/config junto con el trabajo del árbol de sí mismo).

Ayudar a los usuarios por el suministro de un 'deinit'comando.
Este quita toda la submodule.<name> la sección de .git/config ya sea para el submódulo(s) (o para todos aquellos que han sido inicializado si '.'se da).
Fallar si el trabajo actual de árbol contiene las modificaciones a menos forzada.
Se quejan cuando un submódulo dado en la línea de comandos la opción de configuración de url no puede ser encontrado en .git/config, pero , no obstante, no fallan.

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

Desde git1.8.5, la git rm toma también cuidado de la:

  • 'add'paso que los registros de la dirección url de un submódulo en el .gitmodules archivo:es necesario quitarse para usted.
  • el submódulo entrada especial (como se ilustra en esta pregunta):el git rm elimina del índice:
    git rm --cached path_to_submodule (no hay barra diagonal)
    Que le quite a ese directorio almacena en el índice con un modo especial "160000", marcado como un submódulo directorio raíz.

Si usted se olvida de que el último paso, y tratar de agregar lo que era un submódulo como un directorio, se obtendrá el siguiente mensaje de error:

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 Jan 2018) por Prathamesh Chavan (pratham-pc).
(Fusionado por Junio C Hamano -- gitster -- en cometer 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} "$@"

Otros consejos

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

Para eliminar un submódulo es necesario:

  1. Eliminar la sección correspondiente del archivo .gitmodules.
  2. Fase de los cambios .gitmodules:
    git add .gitmodules
  3. Eliminar la sección correspondiente de .git/config.
  4. Eliminar los archivos submódulo del árbol y el índice de trabajo:.
    git rm --cached path_to_submodule (sin barra final)
  5. Eliminar directorio .git del submódulo:
    rm -rf .git/modules/path_to_submodule
  6. Confirme los cambios:
    git commit -m "Removed submodule <name>"
  7. Borrar los archivos submódulo ahora sin seguimiento:
    rm -rf path_to_submodule

Ver también . pasos que figuran a continuación

Sólo una nota. Desde 1.8.5.2 git, dos comandos harán:

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

A medida que la respuesta de @ Marcos Cheverton señaló correctamente, si no se utiliza la segunda línea, incluso si ha quitado el submódulo por ahora, el / los módulos carpeta remanente .git / the_submodule impedirán el mismo submódulo se agreguen espalda o reemplazado en el futuro. Además, como se ha mencionado @VonC, git rm hará la mayor parte del trabajo en un submódulo.

- Actualización (05/07/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ñalaron correctamente en los comentarios y otras respuestas , los dos comandos (aunque funcionalmente suficiente para eliminar un submódulo) , hacer dejar una huella en la sección [submodule "the_submodule"] de .git/config (a julio de 2017), que se puede eliminar usando un tercer comando:

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

La mayoría de las respuestas a esta pregunta son obsoletos, incompletos, o innecesariamente compleja.

Un submódulo clonado utilizando Git 1.7.8 o posterior dejará como máximo cuatro trazas de sí mismo en tu repositorio local. El proceso para la eliminación de esos cuatro trazas está dada por los tres comandos siguientes:

# 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

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. Commit
  4. Eliminar archivos no utilizados:
    rm -rf $submodulepath
    rm -rf .git/modules/$submodulename

Tenga en cuenta:. $submodulepath no contiene principio o al final barras

Fondo

Al hacer git submodule add, sólo añade a .gitmodules, pero Una vez que lo hizo git submodule init, se añadió a .git/config.

Así que si desea eliminar los módulos, pero ser capaz de restaurar rápidamente, a continuación, hacer precisamente 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 se pone esto en un script.

También echar un vistazo a una respuesta a ¿Puedo unpopulate un submódulo Git? .

Además de las recomendaciones, también tuvieron que rm -Rf .git/modules/path/to/submodule a ser capaz de añadir un nuevo sub-módulo con el mismo nombre (en mi caso yo estaba reemplazando un tenedor con el original)

Para eliminar un submódulo añadido usando:

git submodule add blah@blah.com:repos/blah.git lib/blah

Ejecutar:

git rm lib/blah

Eso es todo.

En versiones antiguas de GIT (circa ~ 1.8.5) utiliza:

git submodule deinit lib/blah
git rm lib/blah
git config -f .gitmodules --remove-section submodule.lib/blah

Debe eliminar la entrada en .gitmodules y .git/config, y quitar el directorio del módulo de la historia:

git rm --cached path/to/submodule

Si va a escribir la lista de correo de git, probablemente, alguien va a hacer un script de shell para usted.

Puede utilizar un alias para automatizar las soluciones aportadas 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"

poner esto en su configuración de Git, y entonces usted puede hacer: git rms path/to/submodule

En resumen, esto es lo que debe hacer:

  1. Establecer path_to_submodule var (sin barra final):

    path_to_submodule=path/to/submodule

  2. Borrar la línea correspondiente del archivo .gitmodules:

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

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

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

  4. Unstage y retirar $ path_to_submodule sólo desde el índice (para evitar la pérdida de información)

    git rm --cached $path_to_submodule

  5. Controlar los cambios realizados en .gitmodules

    git add .gitmodules

  6. Confirmar la SuperProject

    git commit -m "Remove submodule submodule_name"

  7. Borrar los archivos submódulo ahora sin seguimiento

    rm -rf $path_to_submodule

    rm -rf .git/modules/$path_to_submodule

Si el submódulo fue accidentalmente añadido debido a que ha añadido, comprometido y empujó una carpeta que ya era un repositorio Git (.git contenida), que no tendrá un archivo .gitmodules editar, o cualquier otra cosa .git/config. href="http://humansky.com/2011/12/accidentally-adding-a-git-submodule/" En este caso todo lo que necesita es :

git rm --cached subfolder
git add subfolder
git commit -m "Enter message here"
git push

Fwiw , que también se elimina la carpeta .git antes de hacer el git add.

He encontrado deinit funciona bien para mí:

git submodule deinit <submodule-name>    
git rm <submodule-name>

git docs :

  

deinit

     

Anular el registro de los submódulos dadas, es decir, eliminar todo el submodule.$name   la sección de .git / config junto con su árbol de trabajo.

Después de experimentar con todas las diferentes respuestas en este sitio, que 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 el mismo estado de antes de agregar el submódulo. Puede inmediato agrega el submódulo de nuevo, lo cual no era posible con la mayoría de las respuestas aquí.

git submodule add $giturl test
aboveScript test

Esto le deja con una salida más limpia, sin cambios a cometer.

Esto fue probado con:

$ git --version
git version 1.9.3 (Apple Git-50)

Lo que actualmente estoy haciendo Dic 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}"

Esto es lo que hice:

1). Eliminar la sección correspondiente del archivo .gitmodules. Se puede utilizar por debajo de comando:

git config -f .gitmodules --remove-section "submodule.submodule_name"

2.) Etapa de los cambios .gitmodules

git add .gitmodules

3). Eliminar la sección pertinente de .git/config. Se puede utilizar por debajo de comando:

git submodule deinit -f "submodule_name"

4) Retirar el gitlink (sin barra final):.

git rm --cached path_to_submodule

5) de limpieza de la .git/modules:.

rm -rf .git/modules/path_to_submodule
.

6) Commit:

git commit -m "Removed submodule <name>"

7.) Eliminar los archivos submódulo ahora sin seguimiento

rm -rf path_to_submodule

Recientemente me entero de un proyecto Git que incluyen muchos comandos relacionados con git útil: https://github.com / Visionmedia / git-extras

Instalar y escriba:

git-delete-submodule submodule

A continuación, se hacen las cosas. El directorio submódulo será eliminado de tu repositorio y todavía existe en el sistema de archivos. A continuación, puede confirmar el cambio como:. git commit -am "Remove the submodule"

he tenido que tomar medidas de John Douthat un paso más y cd en el directorio del submódulo, y luego eliminar el repositorio Git:

cd submodule
rm -fr .git

Entonces podría comprometer los archivos como parte de los padres repositorio Git sin la antigua referencia a un submódulo.

Aquí están los 4 pasos que he encontrado necesario o útil (las más importantes en primer lugar):

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 debe cuidar de él. Con suerte, la segunda parte de la pregunta OP se puede responder de manera positiva un día (que esto se puede hacer en un solo comando).

Sin embargo, a partir de julio de 2017, el paso 2 es necesario para eliminar los datos en .git/modules/ de lo contrario, no se puede, por ejemplo, añadir el submódulo de nuevo en el futuro.

Puede conseguir probablemente lejos con los dos pasos anteriores para git 1.8.5+ como de tinlyx respuesta señaló, ya que todos git submodule comandos parecen funcionar.

Paso 3 elimina la sección para the_submodule en el .git/config archivo. Esto debe hacerse para la integridad. (La entrada puede causar problemas para las versiones anteriores de git, pero no tengo uno para probar).

Para esto, la mayoría de las respuestas sugieren usar git submodule deinit. Me resulta más explícita y menos confuso utilizar git config -f .git/config --remove-section. De acuerdo con la git-submódulo documentación , git deinit:

  

Anular el registro de los submódulos dados ... Si realmente desea eliminar una   submódulo desde el repositorio y comprometerse que el uso git-rm [1]    lugar .

Por último, pero no menos importante, si no git commit, se quiere / puede obtener un error al hacer 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.

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

Me acabo la .submodule (olvidé el nombre exacto) archivo oculto, que tiene una lista ... puede borrar de forma individual de esa manera. Acabo de tener una, así que lo borre. Simple, pero podría estropear Git, ya que no sé si algo se une a la sub-módulo. Parece bien hasta ahora, aparte de problema de actualización habitual de libetpan, pero eso es (esperemos) no relacionado.

notado nadie ha escrito borrado manual, por lo añadido

Si acaba de añadir el submódulo, y, por ejemplo, sólo tiene que añadir el submódulo mal o lo agregó al lugar equivocado, simplemente git stash continuación, elimine la carpeta. Esto es suponiendo que la adición del submódulo es el único que lo hizo en la reciente cesión temporal.

2,17 con Git y por encima de ella es simplemente:

git submodule deinit -f {module_name}
git add {module_name}
git commit

He creado un script bash para facilitar el proceso de eliminación. También comprueba si hay cambios en el repositorio de la izquierda no guardado y pide confirmación. Se ha probado en os x sería interesante saber si funciona tal cual en distribuciones de Linux comunes, así:

https://gist.github.com/fabifrank/cdc7e67fd194333760b060835ac0172f

En el último git se necesita sólo 4 operación para extirpar el submódulo git.

  • Eliminar correspondiente entrada en .gitmodules
  • Etapa cambia git add .gitmodules
  • Eliminar el directorio git rm --cached <path_to_submodule> submódulo
  • COMPROMÉTANSE git commit -m "Removed submodule xxx"

En caso de tener que hacerlo en una línea de comandos con escritura del golpe de la siguiente manera:

$ cd /path/to/your/repo && /bin/bash $HOME/remove_submodule.sh /path/to/the/submodule

Crear archivo de escritura del golpe en el directorio llamado $HOME decir remove_submodule.sh:

#!/bin/bash

git config -f .gitmodules --remove-section submodule.$1
git config -f .git/config --remove-section submodule.$1
git rm --cached $1
git add .gitmodules
git commit -m "Remove submodule in $1"
rm -rf $1
rm -rf .git/modules/$1
git push origin $(git rev-parse --abbrev-ref HEAD) --force --quiet

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top