¿Cómo cambiar el repositorio remoto de un submódulo git?
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.
Debería poder editar el .gitmodules
archivo para actualizar la URL y luego ejecutarlo git submodule sync --recursive
para reflejar ese cambio en el superproyecto y su copia de trabajo.
Luego debes ir al .git/modules/path_to_submodule
directorio 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
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-url
porque tiene un error:Si, dentro de tu
.gitmodules
archivo, 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 finalsome-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 gitmodule
su función.
Entonces ahora la documentación de gitmodule aún no incluye:
El
.gitmodules
archivo, 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últiplespushurls
vsurls
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-remotes
ahora 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 fsckFirmado 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 lacredential_from_url_gently()
validación '').