¿Cómo cambiar el repositorio remoto de un submódulo git?

Resuelto Andrew Grimm asked hace 15 años • 0 respuestas

Creé un repositorio de git con un submódulo. Puedo decirle al submódulo que cambie la ruta del repositorio remoto, pero no estoy seguro de cómo decirle al repositorio principal cómo cambiar la ruta del repositorio remoto para el submódulo.

No me sorprendería si no tengo suerte y tengo que hacer las cosas manualmente, ya que incluso eliminar submódulos no es fácil.

Andrew Grimm avatar May 27 '09 09:05 Andrew Grimm
Aceptado

Debería poder editar el .gitmodulesarchivo para actualizar la URL y luego ejecutarlo git submodule sync --recursivepara reflejar ese cambio en el superproyecto y su copia de trabajo.

Luego debes ir al .git/modules/path_to_submoduledirectorio y cambiar su archivo de configuración para actualizar la ruta de git.

Si el historial de repositorios es diferente, entonces deberá verificar la nueva rama manualmente:

git submodule sync --recursive
cd <submodule_dir> 

git fetch
git checkout origin/master
git branch master -f
git checkout master
Jim Puls avatar May 27 '2009 05:05 Jim Puls

Con Git 2.25 (Q1 2020), puedes modificarlo .
Consulte " La URL del submódulo de Git cambió " y el nuevo comando

git submodule set-url [--] <path> <newurl>

(En el --separador, consulte " guión doble como señal para detener la interpretación de opciones y tratar todos los argumentos siguientes literalmente ")

ADVERTENCIA : Hi-Angel menciona en los comentarios (probado incluso con Git 2.31.1):

Hay que tener cuidado git submodule set-urlporque tiene un error:

Si, dentro de tu .gitmodulesarchivo, la ruta se ve así some-path, y luego ejecutas un:

# Usually causes unexpected behavior
git submodule set-url some-path/ new-url

(tenga en cuenta la barra diagonal /al final some-path/) , luego, en lugar de modificar el submódulo existente, el comando agregará otro . En lugar de ejecutar:

# Good
git submodule set-url some-path new-url

Respuesta original (mayo de 2009, hace catorce años)

De hecho, en abril de 2009 se presentó un parche para aclarar gitmodulesu función.

Entonces ahora la documentación de gitmodule aún no incluye:

El .gitmodulesarchivo, ubicado en el directorio de nivel superior de un árbol de trabajo de git, es un archivo de texto con una sintaxis que coincide con los requisitos de linkgit:git-config 4 .
[NUEVO]:
Como este archivo es administrado por Git, realiza un seguimiento de los +registros de los submódulos de un proyecto.
La información almacenada en este archivo se utiliza como pista para preparar la versión autorizada del registro almacenado en el archivo de configuración del proyecto.
Los cambios de registros específicos del usuario (por ejemplo, para tener en cuenta las diferencias en las URL de los submódulos debido a situaciones de red) se deben realizar en el archivo de configuración, mientras que los cambios de registros que se propagarán (por ejemplo, debido a una reubicación de la fuente del submódulo) se deben realizar en este archivo. .

Eso prácticamente confirma la respuesta de Jim .


Si sigue este tutorial del submódulo de git , verá que necesita " git submodule init" para agregar las URL del repositorio del submódulo a .git/config.

" git submodule sync" se agregó en agosto de 2008 precisamente para facilitar la tarea cuando cambia la URL (especialmente si el número de submódulos es importante).
El script asociado con ese comando es bastante sencillo:

module_list "$@" |
while read mode sha1 stage path
do
    name=$(module_name "$path")
    url=$(git config -f .gitmodules --get submodule."$name".url)
    if test -e "$path"/.git
    then
    (
        unset GIT_DIR
        cd "$path"
        remote=$(get_default_remote)
        say "Synchronizing submodule url for '$name'"
        git config remote."$remote".url "$url"
    )
    fi
done

El objetivo sigue siendo: git config remote."$remote".url "$url"


Nota:

Git 2.40 (primer trimestre de 2023) aclara git config remote.<remote>.url:

Consulte el compromiso d390e08 (7 de febrero de 2023) de Calvin Wan ( CalvinWan0101) .
(Fusionado por Junio ​​C Hamano -- gitster-- en el compromiso 59397e9 , 15 de febrero de 2023)

Documentation: aclarar múltiples pushurlsvsurls

Firmado por: Calvin Wan

En un control remoto con varias URL configuradas, ( man ) muestra la URL correcta que utiliza la recuperación.git remote -v

Sin embargo, ( man ) devuelve la última URL definida .git config remote.<remote>.url

Esta discrepancia puede causar confusión a los usuarios con un control remoto definido como tal, ya que cualquier URL definida después de la primera actúa esencialmente como un archivo pushurl.

Agregue documentación para aclarar cómo fetch interactúa con múltiples URL y cómo push interactúa con múltiples pushurls y URL.

urls-remotesahora incluye en su página de manual :

Se <pushurl>utiliza únicamente para empujones.

Es opcional y por defecto es <URL>.

Enviar a un control remoto afecta a todas las pushurls definidas o a todas las URL definidas si no hay pushurls definidas.
Fetch, sin embargo, solo buscará desde la primera URL definida si se definen varias URL.


Git 2.44 (primer trimestre de 2024), lote 10 , refuerza las comprobaciones de URL que realiza fsck en una URL registrada para submódulos.

Entonces, cuando cambia la URL, la verificación de validez de la URL ahora es más sólida.

Consulte el compromiso 8430b43 , el compromiso 7e2fc39 , el compromiso 6af2c4a , el compromiso 13320ff (18 de enero de 2024) de Victoria Dye ( vdye) .
(Fusionado por Junio ​​C Hamano -- gitster-- en el compromiso 76bd129 , 26 de enero de 2024)

submodule-config.c: fortalecer la verificación de URL fsck

Firmado por: Victoria Dye

Actualice la validación de las URL del submódulo "curl URL" (es decir,
aquellas que especifican un protocolo "http[s]" o "ftp[s]") en ' check_submodule_url()' para detectar más URL no válidas.
La validación existente que utiliza ' credential_from_url_gently()' analiza ciertas URL incorrectamente, lo que lleva a que las URL de submódulos no válidas pasen las comprobaciones ' git fsck' ( man ) .
Por el contrario, ' url_normalize()' - utilizado para validar URL remotas en ' remote_get()' - identifica correctamente las URL no válidas omitidas por ' credential_from_url_gently()'.

Para detectar más casos no válidos, reemplace ' credential_from_url_gently()' con ' url_normalize()' seguido de ' url_decode()' y verifique las nuevas líneas (reflejando ' check_url_component()' en la credential_from_url_gently()validación '').

VonC avatar May 27 '2009 05:05 VonC