¿Cómo muevo un submódulo Git existente dentro de un repositorio Git?

Resuelto thisch asked hace 13 años • 12 respuestas

Me gustaría cambiar el nombre del directorio de un submódulo de Git en mi superproyecto de Git.

Supongamos que tengo la siguiente entrada en mi .gitmodulesarchivo:

[submodule ".emacs.d/vimpulse"]  
path = .emacs.d/vimpulse  
url = git://gitorious.org/vimpulse/vimpulse.git

¿Qué tengo que escribir para mover el .emacs.d/vimpulsedirectorio .emacs.d/vendor/vimpulsesin borrarlo primero (explicado aquí y aquí ) y luego volver a agregarlo?

¿Git realmente necesita la ruta completa en la etiqueta del submódulo?

[submodule ".emacs.d/vimpulse"]

¿O también es posible almacenar solo el nombre del subproyecto?

[submodule "vimpulse"]
thisch avatar Jan 05 '11 20:01 thisch
Aceptado

Versiones más nuevas de git

Git ahora tiene soporte nativo para mover submódulos:

Desde git 1.8.5, git mv old/submod new/submodfunciona como se esperaba y hace todo el trabajo por usted. Es posible que desees utilizar git 1.9.3 o posterior, porque incluye correcciones para el movimiento de submódulos.

Versiones anteriores de git

Como se menciona en los comentarios, esta respuesta se refiere a los pasos necesarios con versiones anteriores de git.

El proceso es similar a cómo eliminaría un submódulo (consulte ¿ Cómo elimino un submódulo? ):

  1. Edite .gitmodulesy cambie la ruta del submódulo adecuadamente y colóquelo en el índice con git add .gitmodules.

  2. Si es necesario, cree el directorio principal de la nueva ubicación del submódulo ( mkdir -p new/parent).

  3. Mueva todo el contenido del directorio antiguo al nuevo ( mv -vi old/parent/submodule new/parent/submodule).

  4. Asegúrese de que Git rastree este directorio ( git add new/parent).

  5. Elimine el directorio antiguo con git rm --cached old/parent/submodule.

  6. Mueva el directorio .git/modules/old/parent/submodulecon todo su contenido a .git/modules/new/parent/submodule.

  7. Edite el .git/modules/new/parent/configarchivo, asegúrese de que el elemento del árbol de trabajo apunte a las nuevas ubicaciones, por lo que en este ejemplo debería ser worktree = ../../../../../new/parent/module. Normalmente debería haber dos ..directorios más en la ruta directa en ese lugar.

  8. Edite el archivo new/parent/module/.git, asegúrese de que la ruta que contiene apunte a la nueva ubicación correcta dentro de la .gitcarpeta principal del proyecto, como en este ejemplo gitdir: ../../../.git/modules/new/parent/submodule.

    git statusLa salida se ve así para mí después:

     # On branch master
     # Changes to be committed:
     #   (use "git reset HEAD <file>..." to unstage)
     #
     #       modified:   .gitmodules
     #       renamed:    old/parent/submodule -> new/parent/submodule
     #
    
  9. Finalmente, confirme los cambios.

Axel Beckert avatar Jun 10 '2011 17:06 Axel Beckert

La respuesta más moderna, tomada del comentario anterior de Valloric:

  1. Actualice a Git 1.9.3 (o 2.18 si el submódulo contiene submódulos anidados )
  2. git mv old/submod new/submod
  3. Luego, los .gitmodules y el directorio del submódulo ya están preparados para una confirmación (puedes verificar esto con git status.)
  4. Confirma los cambios git commity ¡listo!

¡Hecho!

phatmann avatar Jul 15 '2014 20:07 phatmann

En mi caso, quería mover un submódulo de un directorio a un subdirectorio, por ejemplo, "AFNetworking" -> "ext/AFNetworking". Estos son los pasos que seguí:

  1. Edite .gitmodules cambiando el nombre y la ruta del submódulo para que sea "ext/AFNetworking"
  2. Mueva el directorio git del submódulo de ".git/modules/AFNetworking" a ".git/modules/ext/AFNetworking"
  3. Mover la biblioteca de "AFNetworking" a "ext/AFNetworking"
  4. Edite ".git/modules/ext/AFNetworking/config" y corrija la [core] worktreelínea. El mio cambio de ../../../AFNetworkinga../../../../ext/AFNetworking
  5. Edite "ext/AFNetworking/.git" y corrija gitdir. El mío cambió de ../.git/modules/AFNetworkinga../../git/modules/ext/AFNetworking
  6. git add .gitmodules
  7. git rm --cached AFNetworking
  8. git submodule add -f <url> ext/AFNetworking

Finalmente, vi en el estado de git:

matt$ git status
# On branch ios-master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   .gitmodules
#   renamed:    AFNetworking -> ext/AFNetworking

Y listo. El ejemplo anterior no cambia la profundidad del directorio, lo que marca una gran diferencia en la complejidad de la tarea, y no cambia el nombre del submódulo (que puede que no sea realmente necesario, pero lo hice para ser coherente con lo que sucedería si agregara un nuevo módulo en esa ruta).

Matt Connolly avatar Apr 28 '2012 12:04 Matt Connolly

[Actualización: 2014-11-26] Como Yar resume muy bien a continuación, antes de hacer cualquier cosa, asegúrese de conocer la URL del submódulo. Si la desconoce, abra .git/.gitmodulesy examine la clave submodule.<name>.url.

Lo que funcionó para mí fue eliminar el submódulo antiguo usando git submodule deinit <submodule>seguido de git rm <submodule-folder>. Luego agregue el submódulo nuevamente con el nuevo nombre de la carpeta y confirme. Verificar el estado de git antes de confirmar muestra el antiguo submódulo renombrado al nuevo nombre y .gitmodule modificado.

$ git submodule deinit foo
$ git rm foo
$ git submodule add https://bar.com/foo.git new-foo
$ git status
renamed:    foo -> new-foo
modified:   .gitmodules
$ git commit -am "rename foo submodule to new-foo"
Mark Mikofski avatar Sep 19 '2013 10:09 Mark Mikofski

El truco parece ser comprender que el .gitdirectorio de los submódulos ahora se guarda en el repositorio principal, en .git/modules, y cada submódulo tiene un .gitarchivo que apunta a él. Este es el procedimiento que necesitas ahora:

  • Mueva el submódulo a su nuevo hogar.
  • Edite el .gitarchivo en el directorio de trabajo del submódulo y modifique la ruta que contiene para que apunte al directorio correcto en el .git/modulesdirectorio del repositorio maestro.
  • Ingrese al .git/modulesdirectorio del repositorio maestro y busque el directorio correspondiente a su submódulo.
  • Edite el configarchivo, actualizando la worktreeruta para que apunte a la nueva ubicación del directorio de trabajo del submódulo.
  • Edite el .gitmodulesarchivo en la raíz del repositorio maestro, actualizando la ruta al directorio de trabajo del submódulo.
  • git add -u
  • git add <parent-of-new-submodule-directory>(Es importante que agregue el directorio principal y no el directorio del submódulo en sí).

Algunas notas:

  • Las [submodule "submodule-name"]líneas en .gitmodulesy .git/configdeben coincidir entre sí, pero no corresponden a nada más.
  • El directorio de trabajo del submódulo y .gitel directorio deben apuntar correctamente entre sí.
  • Los archivos .gitmodulesy .git/configdeben estar sincronizados.
Paul Gideon Dann avatar Nov 14 '2012 13:11 Paul Gideon Dann