Impossibile aggiungere il sottomodulo git quando specificato come percorso relativo
-
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).
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:
- capitolo 8 del manuale dell'utente di Git
- Pagina Wiki sul tutorial sul sottomodulo Git
e naturalmente - Pagina man del sottomodulo Git
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 superprogettoorigin
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 fileHEAD
è 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 necessarioL'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 configurazionesubmodule.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 ininit_submodule
funzione) e richiamarlo nel punto appropriato nel fileupdate_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