Me gustaría cambiar el nombre del directorio de un submódulo Git en mi superproyecto Git.
Supongamos que tengo la siguiente entrada en mi .gitmodules
archivo:
[submodule ".emacs.d/vimpulse"]
path = .emacs.d/vimpulse
url = git://gitorious.org/vimpulse/vimpulse.git
¿Qué debo escribir para mover el .emacs.d/vimpulse
directorio .emacs.d/vendor/vimpulse
sin eliminarlo 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"]
git
git-submodules
cardo
fuente
fuente
git mv
comando, justo en la pregunta.git mv
así. Usedeinit
entoncesrm
como se especifica stackoverflow.com/a/18892438/8047 .git mv
solo funciona para submódulos también, no necesita nada más.1.8.5
los submódulos móviles se admiten de forma nativa mediante elgit mv
comando ( de las notas de la versión , primero vinculadas por el propio @thisch). También respondido aquígit mv
mueve el submódulo en el espacio de trabajo y actualiza los archivos .git del submódulo correctamente, pero la subcarpeta dentro de la carpeta .git / modules del repositorio principal permanece igual, ¿está bien? (Estoy usando git 2.19.0 en Windows)Respuestas:
Nota: Como se menciona en los comentarios, esta respuesta se refiere a los pasos necesarios con versiones anteriores de git. Git ahora tiene soporte nativo para mover submódulos:
El proceso es similar a cómo eliminaría un submódulo (consulte ¿Cómo elimino un submódulo? ):
.gitmodules
y cambie la ruta del submódulo adecuadamente, y colóquelo en el índice congit add .gitmodules
.mkdir -p new/parent
).mv -vi old/parent/submodule new/parent/submodule
).git add new/parent
).git rm --cached old/parent/submodule
..git/modules/old/parent/submodule
con todo su contenido a.git/modules/new/parent/submodule
..git/modules/new/parent/config
archivo, asegúrese de que el elemento de árbol de trabajo apunte a las nuevas ubicaciones, por lo que en este ejemplo debería estarloworktree = ../../../../../new/parent/module
. Por lo general, debe haber dos más..
que directorios en la ruta directa en ese lugar.Edite el archivo
new/parent/module/.git
, asegúrese de que la ruta en él apunte a la nueva ubicación correcta dentro de la.git
carpeta principal del proyecto , así que en este ejemplogitdir: ../../../.git/modules/new/parent/submodule
.git status
La salida se ve así para mí después:Finalmente, comete los cambios.
fuente
path
configuración y el nombre del submódulo. Por ejemplo, al mover foo / module a bar / module debes cambiar en .gitmodules la sección[submodule "foo/module"]
a[submodule "bar/module"]
, y debajo de esa misma secciónpath = foo/module
apath = bar/module
. Además, debe cambiar en .git / config la sección[submodule "foo/module"]
a[submodule "bar/module"]
.fatal: 'git status --porcelain' failed in...
solo elimina cualquier archivo .git o directorio en el submódulo..git/modules/old/parent/submodule
, moverla a la nueva ubicación, actualizargitdir
enold/parent/submodule/.git
...git mv old/submod new/submod
funciona como se espera y hace toda la fontanería por usted. Probablemente quiera usar git 1.9.3+ porque incluye correcciones para mover submódulos.La respuesta más moderna, tomada del comentario anterior de Valloric:
git mv old/submod new/submod
git status
).git commit
y listo!¡Hecho!
fuente
1.9.3
excepción de un submódulo dentro del submódulo movido. Eso necesitaba un poco de limpieza manual.1.8.5
como se describe en las notas de la versión ..gitmodules
archivo,old/submod
aún se utilizará como etiqueta para el submódulo mientras se haya cambiado la ruta. Para cambiar también la etiqueta, parece que realmente necesita mover la ruta del directorio de módulos dentro.git
y luego cambiar manualmente la etiqueta.gitmodules
.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í:
[core] worktree
línea. La mía cambió de../../../AFNetworking
a../../../../ext/AFNetworking
gitdir
. La mía cambió de../.git/modules/AFNetworking
a../../git/modules/ext/AFNetworking
git add .gitmodules
git rm --cached AFNetworking
git submodule add -f <url> ext/AFNetworking
Finalmente, vi en el estado de git:
Et voila. El ejemplo anterior no cambia la profundidad del directorio, lo que hace una gran diferencia en la complejidad de la tarea, y no cambia el nombre del submódulo (que puede no ser realmente necesario, pero lo hice para ser coherente con lo que sucedería si agregara un nuevo módulo en esa ruta).
fuente
[Actualización: 26/11/2014] Como Yar resume muy bien a continuación, antes de hacer nada, asegúrese de conocer la URL del submódulo. Si se desconoce, abra
.git/.gitmodules
y examine la llavesubmodule.<name>.url
.Lo que funcionó para mí fue eliminar el submódulo anterior usando
git submodule deinit <submodule>
seguido degit rm <submodule-folder>
. Luego agregue el submódulo nuevamente con el nuevo nombre de carpeta y confirme. Al verificar el estado de git antes de confirmar, se muestra el submódulo antiguo renombrado al nuevo nombre y se modificó .gitmodule.fuente
El truco parece ser comprender que el
.git
directorio para submódulos ahora se mantiene en el repositorio maestro, debajo.git/modules
, y cada submódulo tiene un.git
archivo que apunta a él. Este es el procedimiento que necesita ahora:.git
archivo en el directorio de trabajo del submódulo y modifique la ruta que contiene para que apunte al directorio correcto en el directorio del repositorio maestro.git/modules
..git/modules
directorio del repositorio principal y busque el directorio correspondiente a su submódulo.config
archivo, actualizando laworktree
ruta para que apunte a la nueva ubicación del directorio de trabajo del submódulo..gitmodules
archivo en la raíz del repositorio principal, 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 padre , y no el directorio del submódulo en sí).Algunas notas
[submodule "submodule-name"]
líneas.gitmodules
y.git/config
deben coincidir entre sí, pero no corresponden a nada más..git
directorio deben apuntar correctamente entre sí..gitmodules
y.git/config
deben estar sincronizados.fuente
La cadena entre comillas después de "[submódulo" no importa. Puede cambiarlo a "foobar" si lo desea. Se utiliza para encontrar la entrada coincidente en ".git / config".
Por lo tanto, si realiza el cambio antes de ejecutar "git submodule init", funcionará bien. Si realiza el cambio (o recoge el cambio mediante una combinación), deberá editar manualmente .git / config o ejecutar "git submodule init" nuevamente. Si haces lo último, te quedará una entrada inofensiva "varada" con el nombre anterior en .git / config.
fuente
git submodule sync
propaga el cambio.git/config
automáticamenteSimplemente puede agregar un nuevo submódulo y eliminar el antiguo submódulo usando comandos estándar. (debería evitar cualquier error accidental dentro de .git)
Configuración de ejemplo:
Examine mover 'jquery' a 'proveedor / jquery / jquery':
Método de bonificación para submódulos grandes:
Si el submódulo es grande y prefiere no esperar al clon, puede crear el nuevo submódulo utilizando el antiguo como origen y luego cambiar el origen.
Ejemplo (use la misma configuración de ejemplo)
fuente
newPath
.La solución dada no funcionó para mí, sin embargo, una versión similar sí ...
Esto es con un repositorio clonado, por lo tanto, los repositorios de submódulos git están contenidos en los repositorios superiores .git dir. Todos los cationes son del repositorio superior:
Edite .gitmodules y cambie la configuración "ruta =" para el submódulo en cuestión. (No es necesario cambiar la etiqueta ni agregar este archivo al índice).
Edite .git / modules / name / config y cambie la configuración "worktree =" para el submódulo en cuestión
correr:
Me pregunto si hace una diferencia si los repositorios son atómicos o submódulos relativos, en mi caso fue relativo (submodule / .git es una referencia al proyecto superior / .git / modules / submodule)
fuente
Simplemente use el script de shell git-submodule-move .
fuente
Acabo de pasar por esta prueba ayer y esta respuesta funcionó perfectamente. Aquí están mis pasos, para mayor claridad:
more .gitmodules
porque una vez que elimine el submódulo no estará disponibledeinit
,rm
y luegosubmodule add
EJEMPLO
Comandos
NOTA: git mv no hace esto. En absoluto.
fuente
git mv
embargo, +1 debería ser mejor en las últimas versiones de Git.mv
. ¡Gracias!