Impossibile aggiungere il sottomodulo git quando specificato come percorso relativo

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

  •  21-09-2019
  •  | 
  •  

Domanda

Sto provando ad aggiungere un sottomodulo al mio repository Git e ricevo in cambio questo errore:

remote origin does not have a url defined in .git/config

qualche idea su cosa potrebbe essere?Ho provato a cercarlo su Google ma viene visualizzato solo un collegamento vago.

Sto facendo questo:

git submodule add ../extern/Lib1 lib  

Mi aspetto che questo crei un sottomodulo lib/Lib1
Sono consapevole che questo creerà solo un riferimento e che quindi dovrò aggiornare/init (non chiarissimo da questa parte, non sono arrivato così lontano;Sto appena imparando il comando sottomodulo).

È stato utile?

Soluzione

Fa ../extern/Lib1 fare riferimento a un repository Git?
In caso contrario, Git non saprebbe come avere l'URL del repository Git al suo .gitmodule
Inoltre, prova:

  • con la destinazione lib non già esistente (anche vuoto)
  • con un percorso assoluto invece che relativo (puoi usarne uno relativo, ma per ogni evenienza vale la pena provare qui)

Alcune buone fonti sui sottomoduli sono:


Poiché qui funziona solo il percorso assoluto, significa che il percorso relativo necessita di un riferimento per essere confrontato.
Quel riferimento è l'"origine remota" che dovrebbe essere nel tuo file DirName/NewRepo_withSubmodules/.git/config file, in questo modo:

$ cat .git/config
    ...
    [remote "origin"]
    url = /path/to/DirName/NewRepo_withSubmodules/.git
    fetch = +refs/heads/*:refs/remotes/origin/*
    ...

Se hai quella sezione in ../DirName/NewRepo_withSubmodules/.git/config file, dovresti essere in grado di aggiungere ../Extern/Lib1 come sottomodulo utilizzando un percorso relativo.

Tutto quanto sopra è ispirato dalla seguente sezione della pagina man del sottomodulo git:

<repository> è l'URL del repository di origine del nuovo sottomodulo.
Può essere un URL assoluto o (se inizia con ./ O ../), la posizione rispetto a quella del superprogetto origin deposito.

Quindi se NewRepo_withSubmodules è un repository Git locale che è stato appena creato (e ovviamente non ha "origine"), dovrebbe essere definita un'"origine remota" artificiale (anche se l'origine punta a se stessa), se non altro per consentire l'URL relativo per altri sottomoduli repository da utilizzare.


Git 2.13 (Q2 2017) migliorerà il rilevamento dell'origine predefinita di un sottomodulo.

Vedere commetti d1b3b81 (25 febbraio 2017) di Stefan Beller (stefanbeller).
(Uniti da Junio ​​C Hamano-- gitster -- In commettere ae900eb, 10 marzo 2017)

submodule init:avvisare di ricadere su un percorso locale

COME ora documentato:

<repository> è l'URL del repository di origine del nuovo sottomodulo.
Può essere un URL assoluto o (se inizia con ./ O ../), la posizione relativa al repository remoto predefinito del superprogetto
(Tieni presente che per specificare un repository 'foo.git' che si trova proprio accanto ad un superprogetto 'bar.git', dovrai usare '../foo.git' invece di './foo.git' - come ci si potrebbe aspettare seguendo le regole per gli URL relativi - perché la valutazione degli URL relativi in ​​Git è identica a quella delle directory relative).

Il telecomando predefinito è il telecomando del ramo di tracciamento remoto del ramo corrente.
Se non esiste alcun ramo di tracciamento remoto o il file HEAD è distaccato"origin" si presuppone che sia il telecomando predefinito.
Se il superprogetto non ha un telecomando predefinito configurato, il superprogetto è autorevole a monte e corrente.viene invece utilizzata la directory di lavoro.


Git 2.20 (quarto trimestre 2018) migliora il supporto del percorso locale per i sottomoduli.

Vedere commettere e0a862f (16 ottobre 2018) di Stefan Beller (stefanbeller).
(Uniti da Junio ​​C Hamano-- gitster -- In commettere 3fc8522, 6 novembre 2018)

submodule helper:converti l'URL relativo in URL assoluto, se necessario

L'aiutante del sottomodulo update_clone chiamato da "git submodule update", clona i sottomoduli, se necessario.
Poiché i sottomoduli avevano l'URL che indicava se erano attivi, il passaggio per risolvere gli URL relativi veniva eseguito nel "submodule init" fare un passo.Al giorno d'oggi i sottomoduli possono essere configurati attivi senza chiamare un init esplicito, ad es.tramite la configurazione submodule.active.

Quando si tenta di ottenere sottomoduli che sono impostati in questo modo, ricaderemo nell'URL trovato nel .gitmodules, che può essere relativo al superproietto, ma non lo risolviamo, ancora:

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
[...]

Per risolvere il problema, scomporre la funzione che risolve il problema URL in "git submodule init" (nell'helper del sottomodulo in init_submodule funzione) e richiamarlo nel punto appropriato nel file update_clone aiutante.

Altri suggerimenti

Stavo cercando la stessa cosa, e ho trovato il seguente 'sembra aver funzionato:

Ho (su 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 idee che non ho lavorato su ancora ( 'stub, per esempio), e analysis1/ e analysis2/ sono cose sto lavorando (e quindi avere il codice, tex, ... in loro). Una volta che ho in giro a lavorare sulle altre analisi, avranno spostato alle proprie cartelle e quindi i propri repository.

Quello che ho fatto è stato (in git bash nelle analisi):


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"

Questo sembra aver funzionato.

D:/phd/analyses/.git/config sembra che dovrebbe, e .gitmodules appare come:


[submodule "analysis2"]
    path = analysis2
    url = self:analysis2/.git
[submodule "analysis5"]
    path = analysis5
    url = self:analysis5/.git

Saluti, Simon Knapp

(ho riassunto solo la soluzione qui. Merito va a VonC.)

Nel repository contenente (diciamo containing.git/), git interpreta come percorsi relativi rispetto al telecomando origin, che non è definito. Noi vogliamo che sia relativo alla directory containing.git/, in modo da eseguire

git remote add origin ..

(Non so perché è .. piuttosto che ..)

Ora è possibile aggiungere il sub-modulo:

git submodule add ../extern/Lib1 lib
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top