No se puede agregar el submódulo git cuando se especifica como una ruta relativa
-
21-09-2019 - |
Pregunta
Estoy intentando agregar un submódulo a mi repositorio de git y, a cambio, recibo este error:
remote origin does not have a url defined in .git/config
¿Alguna idea sobre lo que podría ser esto?Intenté buscarlo en Google pero solo aparece un enlace vago.
Estoy haciendo esto:
git submodule add ../extern/Lib1 lib
Espero que esto cree un submódulo. lib/Lib1
Soy consciente de que esto solo creará una referencia y que luego tengo que actualizar/iniciar (no está muy claro en esta parte, no he llegado tan lejos;Recién estoy aprendiendo el comando del submódulo).
Solución
Hace ../extern/Lib1
¿Hacer referencia a un repositorio de Git?
Si no es así, Git no sabría cómo hacer que la URL de repositorio de Git llegue a su .gitmodule
Intenta también:
- con el destino
lib
no ya existente (incluso vacío) - con una ruta absoluta en lugar de una ruta relativa (puedes usar una relativa, pero por si acaso, vale la pena intentarlo aquí)
Algunas buenas fuentes sobre submódulos son:
- capítulo 8 del manual del usuario de Git
- Página Wiki sobre el tutorial del submódulo de Git
y por supuesto - Página de manual del submódulo de Git
Dado que aquí solo funciona la ruta absoluta, significa que la ruta relativa necesita una referencia con la que compararse.
Esa referencia es el "origen remoto" que debería estar en su DirName/NewRepo_withSubmodules/.git/config
archivo, así:
$ cat .git/config
...
[remote "origin"]
url = /path/to/DirName/NewRepo_withSubmodules/.git
fetch = +refs/heads/*:refs/remotes/origin/*
...
Si tienes esa sección en ../DirName/NewRepo_withSubmodules/.git/config
archivo, debería poder agregar ../Extern/Lib1
como un submódulo usando una ruta relativa.
Todo lo anterior está inspirado en la siguiente sección de la página de manual del submódulo de git:
<repository>
es la URL del repositorio de origen del nuevo submódulo.
Puede ser una URL absoluta o (si comienza con./
o../
), la ubicación relativa al superproyectoorigin
repositorio.
Así que si NewRepo_withSubmodules
es un repositorio de Git local que acaba de crearse (y, por supuesto, no tiene "origen"), se debe definir un "origen remoto" artificial (incluso si el origen apunta a sí mismo), aunque sólo sea para permitir una URL relativa para otro submódulo repositorios a utilizar.
Git 2.13 (segundo trimestre de 2017) mejorará la detección del origen predeterminado de un submódulo.
Ver cometer d1b3b81 (25 de febrero de 2017) por Stefan Beller (stefanbeller
).
(Fusionado por Junio C Hamano. gitster
-- en cometer ae900eb, 10 de marzo de 2017)
submodule init
:advertir sobre volver a un camino local
Como ahora documentado:
<repository>
es la URL del repositorio de origen del nuevo submódulo.
Puede ser una URL absoluta o (si comienza con./
o../
), la ubicación relativa al repositorio remoto predeterminado del superproyecto
(Tenga en cuenta que para especificar un repositorio 'foo.git
' que se encuentra justo al lado de un superproyecto 'bar.git
', tendrás que usar '../foo.git
' en lugar de './foo.git
' - como se podría esperar al seguir las reglas para URL relativas (porque la evaluación de las URL relativas en Git es idéntica a la de los directorios relativos).El control remoto predeterminado es el control remoto de la rama de seguimiento remoto de la rama actual.
Si no existe tal sucursal de seguimiento remoto o elHEAD
está desprendido "origin
" se supone que es el control remoto predeterminado.
Si el superproyecto no tiene un control remoto predeterminado configurado, el superproyecto tiene su propia autoridad en sentido ascendente y actual.En su lugar se utiliza el directorio de trabajo.
Git 2.20 (cuarto trimestre de 2018) mejora la compatibilidad con rutas locales para submódulos.
Ver cometer e0a862f (16 de octubre de 2018) por Stefan Beller (stefanbeller
).
(Fusionado por Junio C Hamano. gitster
-- en cometer 3fc8522, 6 de noviembre de 2018)
submodule helper
:convertir URL relativa a URL absoluta si es necesarioEl ayudante del submódulo
update_clone
llamado por "git submodule update
", Clones submódulos si es necesario.
Como los submódulos solían tener la URL indicando si estaban activos, el paso para resolver URL relativas se realizaba en el archivo "submodule init
" paso.Hoy en día, los submódulos se pueden configurar activos sin llamar a un inicio explícito, p.a través de la configuraciónsubmodule.active
.Al tratar de obtener submódulos que se establezcan activos de esta manera, retrocederemos a la URL que se encuentra en el
.gitmodules
, que puede ser relativo al superproject, pero aún no lo resolvemos:git clone https://gerrit.googlesource.com/gerrit cd gerrit && grep url .gitmodules url = ../plugins/codemirror-editor ... git config submodule.active . git submodule update fatal: repository '../plugins/codemirror-editor' does not exist fatal: clone of '../plugins/codemirror-editor' into submodule path '/tmp/gerrit/plugins/codemirror-editor' failed Failed to clone 'plugins/codemirror-editor'. Retry scheduled [...] fatal: clone of '../plugins/codemirror-editor' into submodule path '/tmp/gerrit/plugins/codemirror-editor' failed Failed to clone 'plugins/codemirror-editor' a second time, aborting [...]
Para resolver el problema, tenga en cuenta la función que resuelve las URL relativas en "
git submodule init
" (en el ayudante del submódulo en elinit_submodule
función) y llamarlo en el lugar apropiado en elupdate_clone
ayudante.
Otros consejos
Yo estaba tratando de la misma cosa, y encontré el siguiente 'parece haber funcionado:
Tengo (en Windows):
D:/phd/analyses
/analysis1/ #This is an existing repository
/analysis2/ #another existing repository
/analysis3.tex
/analysis4.tex
...
/analysisN.tex
analysis1.tex ... analysisN.tex
contiene ideas que no he trabajado con todo ( 'talones, por ejemplo), y analysis1/
y analysis2/
son cosas que estoy trabajando (y por lo tanto tienen código, tex, ... en ellos). Una vez que tengo alrededor para trabajar en los otros análisis, ellos son movidos a sus propias carpetas y por lo tanto sus propios repositorios.
Lo que hice fue (en bash git en los análisis):
git init
git add *.tex
git remote add self .
git submodule add self:/analysis2/.git analysis2
git submodule add self:/analysis5/.git analysis5
git commit -m "Initial commit"
Esto parece haber funcionado.
miradas D:/phd/analyses/.git/config
como debería, y las miradas .gitmodules
como:
[submodule "analysis2"]
path = analysis2
url = self:analysis2/.git
[submodule "analysis5"]
path = analysis5
url = self:analysis5/.git
Saludos, Simon Knapp
(he resumido simplemente la solución aquí. El crédito va a VonC.)
En el repositorio que contiene (containing.git/
digamos), caminos interpreta git
relativos como con relación a la origin
remoto, que no se define. Queremos que sea relativo al directorio containing.git/
, de modo de ejecución
git remote add origin ..
(No sé por qué de ..
en lugar de .
.)
Ahora se puede añadir el sub-módulo:
git submodule add ../extern/Lib1 lib