¿Cuál es la forma actual de eliminar un submódulo de git?


91

a partir de la versión 1.9.3 de git (Apple Git-50) en mac, ¿cómo elimino un submódulo de git? Estoy leyendo mucha información desactualizada y muchos desarrolladores me dicen que no funcionarán. ¿Cuál es la forma actual? hará git deinit pathToSubModule el truco?

Los pasos que pensé que funcionarían están aquí, pero los comentarios dicen que no.

Permítanme explicarles mi situación actual y lo que necesito lograr. Instalé el repositorio rápido y lo agregué como submódulo a mi proyecto. Este código ya está registrado y otros lo están usando. Lo que ahora tengo que hacer es bifurcar el mismo repositorio rápido y alojarlo en un github más seguro que mi empresa (por lo tanto, un github privado completamente diferente). Después de bifurcarlo, quiero agregar esa bifurcación como un gitSubmodule y dejar que reemplace el submódulo Quick actual que había instalado anteriormente.

actualización: he leído que la siguiente es la forma correcta en la última versión de git, por favor confirme.

To remove a submodule added using:

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

git rm lib/blah
That's it.

For old versions of git (circa ~1.8.5) use:

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

He luchado con problemas de submódulos durante dos días. El gran avance llegó cuando encontré esto: forums.developer.apple.com/thread/13102 . Básicamente, Xcode, y quizás otras aplicaciones, luchan por expandir las URL que contienen '~'. Una vez que cambié ssh: //username@server.remoteHost.com/~/git/MyRepo.git a ssh: //username@server.remoteHost.com/home/username/git/MyRepo.git (busque la ruta real en su servidor), toda la rareza desapareció en diez minutos.
Elise van Looij

Respuestas:


193

Tienes el git submodule deinit

git submodule deinit <asubmodule>    
git rm <asubmodule>
# Note: asubmodule (no trailing slash)
# or, if you want to leave it in your working tree
git rm --cached <asubmodule>
rm -rf .git/modules/<asubmodule>

deinit

Elimine el registro de los submódulos dados, es decir, elimine toda lasubmodule.$name
sección .git/configjunto con su árbol de trabajo.

Insta además a git submodule update, git submodule foreachy git submodule syncse omita ningún submódulos no registrados hasta que se inicializan de nuevo, a fin de utilizar este comando si no quiere tener una salida local del submódulo en su árbol de trabajo más.

Si realmente desea eliminar un submódulo del repositorio y confirmarlo, use git rm.

Si --forcese especifica, el árbol de trabajo del submódulo se eliminará incluso si contiene modificaciones locales.


8
Quiero borrar completamente el submódulo para mí y también para los demás usuarios. Así que todo lo que necesito es git submodule deinit asubmodule; y git rm asubmodule ?? Además, ¿qué pasa con el submódulo en caché de otros usuarios, tendrían que eliminarlo después de tirar hacia abajo?
j2emanue

1
Quería eliminar la copia local del submódulo y esto funcionó perfectamente, todos los archivos en el subdirectorio se han ido.
Malhal

1
Es posible que también lo necesite rm -rf <asubmodule>si ya ha verificado una versión del repositorio base que ha anulado el registro del submódulo.
Sarah Messer

6

Estoy usando la versión 2.16.2 de Git y git rmhace el trabajo principalmente bien:

git rm path-to-submodule

Puede verificar con git statusy git diff --cachedque esto desinicializa el submódulo y se modifica .gitmodulesautomáticamente. Como siempre, debe realizar el cambio.

Sin embargo, aunque el submódulo se elimina del control de código fuente, .git/modules/path-to-submoduleaún contiene el repositorio de submódulos y .git/configcontiene su URL, por lo que aún debe eliminarlos manualmente:

git config --remove-section submodule.path-to-submodule
rm -rf .git/modules/path-to-submodule

Mantener el repositorio y la configuración del submódulo es intencional para que pueda deshacer la eliminación con, por ejemplo git reset --hard.


1
respuesta más reciente y la solución más corta
TurboGuma

3

Cómo eliminar un submódulo de forma segura.

(se agrega a https://stackoverflow.com/a/1260982/342794 )

  1. Enumere y ubique la sección del submódulo en el .gitmodulesarchivo. Diga vía terminal vi .gitmodules. Ejemplo:

    [submodule "submodules/afnetworking"]
        path = submodules/afnetworking
        url = https://github.com/CompanyName/afnetworking.git
    
  2. Los submódulos se pueden utilizar con bifurcaciones locales. Para proyectos de larga ejecución, el código puede diferir del repositorio original y puede tener algunas correcciones. Es una buena idea verificar si el código del submódulo sufrió cambios durante el transcurso del proyecto. Ejemplo: mire los registros, si apunta a una mastersucursal o alguna sucursal local. explorar registros de git para encontrar modificaciones que se realizaron a través de la terminal. normalmente estos se almacenan en un directorio, mi ejemplo, en submodulesdirectorio.

    User$ cd submodules/afnetworking
    User$ git log
    
  3. Elimine la sección del submódulo de .gitmodules, guarde el archivo. Ejemplo: git statusdebería mostrar solo lo siguiente como modificado

    modified:   .gitmodules
    
  4. Organice los cambios con git add .gitmodules.

  5. Enumere y ubique la sección del submódulo en .git/configarchivos. Diga vía terminal vi .git/config. Ejemplo:

    [submodule "submodules/afnetworking"]
        url = https://github.com/CompanyName/afnetworking.git
    
  6. Elimina los archivos de git cache sobmodule. en ejecución git rm --cached submodules/afnetworking(sin barra al final) lo eliminaría correctamente. Ejemplo:

    User$ git rm --cached submodules/afnetworking
    rm 'submodules/afnetworking'    <-- terminal output
    
  7. Elimine los archivos del submódulo en el .gitdirectorio con rm -rf .git/modules/.... Confirmarlo con git statusdespués.

    User$ rm -rf .git/modules/submodules/afnetworking/
    User$ git status
    On branch feature/replace-afnetworking-submodule-with-pod
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
        modified:   .gitmodules
        deleted:    submodules/afnetworking
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
        submodules/afnetworking/
    
  8. Confirma los cambios. Confirmar con git statusdespués.

    User$ git commit -m "Remove submodule afnetworking"
    [feature/replace-afnetworking-submodule-with-pod 70e239222] Remove submodule afnetworking
    2 files changed, 4 deletions(-)
      delete mode 160000 submodules/afnetworking
    User$ git status
    On branch feature/replace-afnetworking-submodule-with-pod
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
        submodules/afnetworking/
    nothing added to commit but untracked files present (use "git add" to track)
    
  9. Elimine los archivos de submódulo sin seguimiento.

    User$ rm -rf submodules/afnetworking
    
  10. Elimina las referencias del proyecto Xcode. Cree, solucione problemas de compilación y tiempo de ejecución.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.