No se puede agregar el submódulo git cuando se especifica como una ruta relativa

StackOverflow https://stackoverflow.com/questions/1974181

  •  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).

¿Fue útil?

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:


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 superproyecto origin 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 el HEAD 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 necesario

El 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ón submodule.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 el init_submodule función) y llamarlo en el lugar apropiado en el update_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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top