Cambiar el nombre de un submódulo git

155

¿Hay alguna manera fácil de cambiar el nombre de un directorio de submódulos git (aparte de pasar por todo el movimiento de eliminarlo y volver a agregarlo con un nuevo nombre de destino)?

Y mientras estamos en eso, ¿por qué simplemente no puedo hacer lo siguiente en el directorio principal? git mv old-submodule-name new-submodule-name

Lars Tackmann
fuente
66
Ya no necesitará actualizar .gitmodulesmanualmente cuando mueva un submódulo. mira mi respuesta a continuación
VonC
La respuesta de @ VonC funcionó de maravilla para mí
laconbass
Los módulos Git son demasiado complicados. npmmuestra cómo funciona simple. Un día ... tal vez ... alguien ... lo reescribirá ... mientras tanto ...
Rolf
La respuesta de @ VonC no es la historia completa a partir de hoy: de hecho cambiará .gitmodules, pero simplemente cambiará el nombre de la ruta, no el nombre del módulo. Necesita una edición adicional a .gitmodules para corregir eso y una 'sincronización de submódulos git' para completar el proceso completo
zertyz
@zertyz: La propiedad [submódulo "name_of_submodule"] es un nombre interno de Git, puede cambiarle el nombre para no confundirse, pero es solo una etiqueta.
MKesper

Respuestas:

101

Encontré el siguiente flujo de trabajo funcionando:

  • Actualizar .gitmodules
  • mv oldpath newpath
  • git rm oldpath
  • git add newpath
  • git submodule sync

Nota: este enfoque no actualiza el índice y .gitmodules correctamente en las versiones 2018 de GIT.

Nota: Es posible que ahora pueda hacerlo git mv oldpath newpathahora, como se señala en la respuesta de VonC . (Asegúrese de estar utilizando la última versión de git)

Mariusz Nowak
fuente
22
Nota personal: para git add newpathno usar una barra diagonal
atomicules
10
Con tal flujo de trabajo, solo creará un enlace simbólico al subdirectorio que use como submódulo. El enlace simbólico es solo una parte de la funcionalidad global de submódulos. Esto significa que cuando clona el repositorio que usa los submódulos renombrados, puede terminar con el siguiente error: No se encontró mapeo de submódulos en .gitmodules para la ruta 'your-oldpath' Después de eliminar el oldpath (* git rm oldpath ), debe use git submodule add REPO-URL newpath en lugar de "git add newpath *. Cuando termine, el estado de git mostrará algo como esto: renombrado: oldpath -> newpath
Bertrand
55
Esta solución no funciona para mí porque al usar el comando git add, el submódulo se incluyó en el proyecto como un directorio simple y no como un submódulo. pruebe $ mv submodule-oldpath ~ / another-location $ git rm submodule-oldpath $ git submodule add submodule-repository-URL submodule- newpath bcachet.github.io/development/2012/05/25/rename-git-submodule
Mahmoud Adam
3
Si tiene el problema con el árbol de trabajo, también puede editar el .git/modules/SUBMODULE/configarchivo, de modo que worktreevuelva a apuntar al directorio correcto.
Vincent Ketelaars
3
Esto no funcionó para mí con git 2.13.1. Pero simplemente hacer git mv old newfunciona como un encanto. Solo necesito hacer git commit para completar los cambios.
usuario
225

Git1.8.5 (octubre de 2013) debería simplificar el proceso . Simplemente haz un:

git mv A B

" git mv A B", al mover un submódulo Ase le ha enseñado a reubicar su árbol de trabajo y a ajustar las rutas en el .gitmodulesarchivo .


Ver más en commit 0656781fadca1 :

Actualmente, el uso de " git mv" en un submódulo mueve el árbol de trabajo del submódulo al del superproyecto. Pero la configuración de ruta del submódulo .gitmodulesse deja intacta, lo que ahora es inconsistente con el árbol de trabajo y hace que los comandos git que dependen del correcto path -> name mapping(me gusta statusy diff) se comporten de manera extraña.

Permita que " git mv" ayude aquí no solo moviendo el árbol de trabajo del submódulo sino también actualizando la submodule.<submodule name>.pathconfiguración " " desde el .gitmodulesarchivo y la etapa ambos.
Esto no sucede cuando no .gitmodulesse encuentra ningún archivo y solo emite una advertencia cuando no tiene una sección para este submódulo. Esto se debe a que el usuario podría simplemente usar gitlinks simples sin el .gitmodulesarchivo o ya ha actualizado la configuración de ruta a mano antes de emitir el comando "git mv" (en cuyo caso, la advertencia le recuerda que mvlo habría hecho por él).
Solo cuando .gitmodulesse encuentra y contiene conflictos de fusión, el mvcomando fallará y le indicará al usuario que resuelva el conflicto antes de volver a intentarlo.


git 2.9 (junio de 2016) mejorará git mvpara el submódulo:

Ver commit a127331 (19 abr 2016) por Stefan Beller ( stefanbeller) .
(Fusionada por Junio ​​C Hamano - gitster- en commit 9cb50a3 , 29 abr 2016)

mv: permite mover submódulos anidados

" git mv old new" no ajustó la ruta para un submódulo que vive old/correctamente como un subdirectorio dentro del directorio.

Sin embargo, los submódulos necesitan actualizar su enlace al directorio git, así como las actualizaciones al .gitmodulesarchivo.

VonC
fuente
Nota personal: intente esto en 1.8.4 y tendrá fatal: source directory is empty, source=my_source, destination=my_destination. Intentaremos esto nuevamente cuando 1.8.5 tenga una versión estable.
suma de comprobación
@checksum Pero 1.8.5 tiene una versión estable, durante al menos algunas ... horas;) github.com/git/git/releases/tag/v1.8.5
VonC
Tuve que compilar Git versión 1.8.5.GIT desde el código fuente porque hay Git v.1.7.5 en los repositorios de Ubuntu. Cómo construir Git desde el código fuente
Maksim Dmitriev
2
@MaksimDmitriev, pero ¿qué pasa con un ppa (Personal Package Archive) que mencioné en stackoverflow.com/a/20918469/6309 ?
VonC
1
git mv simplemente no funciona para este propósito en mi máquina.
Alexander Dyagilev
11

Acabo de probar algunas de las sugerencias anteriores. Estoy corriendo:

$ git --version
git version 1.8.4

Descubrí que era mejor quitar el inicio del submódulo, eliminar el directorio y crear un nuevo submódulo.

git submodule deinit <submodule name>

git rm <submodule folder name>

git submodule add <address to remote git repo> <new folder name>

Al menos eso es lo que mejor me funcionó. YMMV!

jaredwolff
fuente
7

No es posible cambiarle el nombre, por lo que debe eliminarlo primero ( deinit) y agregarlo nuevamente.

Entonces, después de quitarlo:

git submodule deinit <path>
git rm --cached <path>

También puede verificar y eliminar las referencias a él en:

  • .gitmodules
  • .git/config
  • eliminar la carpeta de referencia de .git/modules/<name>(es mejor hacer una copia de seguridad), ya que cada carpeta tiene un configarchivo donde guarda la referenciaworktree

luego realice sus cambios mediante la confirmación de cualquier cambio en su repositorio de la siguiente manera:

git commit -am 'Removing submodule.'

y verifique si no tiene problemas pendientes:

git submodule update
git submodule sync
git submodule status

así que ahora puedes agregar el submódulo git nuevamente:

git submodule add --name <custom_name> [email protected]:foo/bar.git <my/path>
kenorb
fuente
también es en realidad hoy
Alexey
El título de las preguntas es un nombre inapropiado, pertenece al camino, no al nombre
Max Robbertze
3

Edite el archivo .gitmodules para cambiar el nombre del submódulo y luego cambie el nombre del directorio del submódulo.

Creo que es posible que tengas que hacer algo git submodule syncdespués, pero no estoy en condiciones de verificarlo ahora.

Abizern
fuente
Esto hace que el nuevo nombre de submódulo se produzca como una nueva confirmación y no como un cambio de nombre. ¿Pero tal vez así es como tiene que ser?
Lars Tackmann
1
@Lars: ¡Asegúrese de eliminar también el antiguo directorio de submódulos!
Cascabel
3

MacOs : cuando quiero usar la solución VonC para cambiar la carpeta de submódulos Commona minúsculas:

git mv Common common

yo obtengo

fatal: error al renombrar 'Común': argumento no válido

Solución: use un nombre de carpeta temporal y muévase dos veces:

git mv Common commontemp
git mv commontemp common

Eso es todo :)

Kamil Kiełczewski
fuente