Git submodule add: problema "una directory git viene trovata localmente"


194

In realtà sto cercando di imparare come usare git, compresi i git submodulesottocomandi. Ho già configurato un server su cui posso ospitare, spingere e estrarre i repository git usando SSH. Ho creato un repository git principale "Travail" su questo server in cui vorrei mettere tutti i miei progetti come sottomoduli.

Nel mio repository Travail, ho già aggiunto un mio progetto come sottomodulo su tools/libft: sono in grado di sviluppare questo sottomodulo, di spingerlo e di estrarlo.

Ma quando provo ad aggiungere un altro sottomodulo (chiamato fdf, da fdf.git sul mio server), ottengo il seguente problema:

git submodule add ssh://XXX.XXX.XXX.XXX:XXXXX/opt/git/fdf.git projets/fdf

Una directory git per 'projets / fdf' si trova localmente con i telecomandi: origin ssh: //git@XXX.XXX.XXX.XXX: XXXXX / opt / git / fdf.git Se si desidera riutilizzare questo git locale directory invece di ripetere la clonazione da ssh: //XXX.XXX.XXX.XXX: XXXXX / opt / git / fdf.git usa l'opzione '--force'. Se la directory git locale non è il repository corretto o non sei sicuro di cosa significhi, scegli un altro nome con l'opzione '--name'.

In realtà non esiste una sottodirectory in projets/

Ho letto su un altro thread che avrei dovuto usare git submodule synco modificare il file .gitmodules in cui l'URL del repository di origine del mio sottomodulo avrebbe potuto cambiare.

Ma il mio file .gitmodules contiene solo le informazioni sul mio primo sottomodulo (tools / libft), non su projets / fdf:

[submodule "tools/libft"]
    path = tools/libft
    url = ssh://git@XXX.XXX.XXX.XXX:XXXXX/opt/git/libft.git

Come studente francese avrei potuto perdere qualcosa nella documentazione inglese che ho, ma ho cercato e non capisco davvero perché ho questo problema.

Sarei felice se avessi una soluzione, ma solo una spiegazione sarebbe utile.


Una piccola correzione: è "repository", non "depository". Non proprio una risposta, ma se i progetti sono indipendenti l'uno dall'altro sarebbe meglio per ogni progetto avere il proprio repository anziché i sottomoduli.
jcm,

Grazie, ho corretto. Lo so, ma vorrei riunire tutto il mio lavoro nello stesso repository ma come progetti separati. È una scelta mantenere aggiornato tutto il mio lavoro quando vado da casa a scuola e viceversa (e per imparare a usare questi strumenti, sono curioso;))
vmonteco,

Bene, la curiosità è sempre una buona ragione! :) Questo è strano. Sei sicuro di non aver aggiunto il sottomodulo prima?
jcm,

Non in Travail / e non ho alcun problema a clonare fdf.git in ~ /. In Travail / non trovo tracce di fdf. solo libft: /
vmonteco

5
Oh aspetta, ho guardato dentro /Travail/.git/modules/projets/e ho trovato una fdfdirectory. Questo sembra non essere nell'albero di lavoro ma nei commit più vecchi. Potrebbe generare il problema?
vmonteco,

Risposte:


445

Sono arrivato a questo post SO cercando di aggiungere un sottomodulo con lo stesso percorso di un sottomodulo che ho eliminato di recente.

Questo è ciò che alla fine ha funzionato per me ( questo articolo mi ha aiutato molto ):

Se non hai già eseguito git rm --cached path_to_submodule(nessuna barra finale) e rm -rf path_to_submodule, fallo!

Poi:

  1. Elimina le righe pertinenti dal .gitmodulesfile. ad esempio eliminare questi:

    [submodule "path_to_submodule"] path = path_to_submodule url = https://github.com/path_to_submodule

  2. Elimina la sezione pertinente da .git / config. ad esempio eliminare questi:

    [submodule "path_to_submodule"] url = https://github.com/path_to_submodule

  3. rm -rf .git/modules/path_to_submodule

Quindi, puoi finalmente:

git submodule add https://github.com/path_to_submodule


47
Questo è stato davvero utile, in quanto non sono riuscito a trovare nient'altro che ha funzionato. La differenza fondamentale rispetto ad altri suggerimenti è stata il passaggio 3. Grazie!
AndroidDev

8
I passaggi 2 e 3 sono stati necessari per me.
U007D,

8
Il passaggio 3 è stato necessario per me, ma perché esiste anche il sottomodulo?
Crt,

1
Per me, ho saltato i passaggi 1 e 2 (che avevano già le impostazioni corrette) e il passaggio 3 lo ha riparato per me. (Avevo già fatto il passaggio iniziale git rme i rm -rfpassaggi).
Rock Lee,

2
Anche il passaggio 3 non ha funzionato per me. Avevo un solo sottomodulo, quindi ho eliminato l'intero .git/modulese alla fine ho funzionato.
ach

47

ho provato la soluzione di jbmilgrom, in particolare ho provato git rm --cachee che non ha funzionato neanche per me poiché la directory / sottomodulo non c'era. Ciò che ha funzionato per me è stato:

  1. rm -rf .git/modules/blah
  2. git submodule add git://path.to.new

L'ho fatto dopo aver provato --forceall'interno dei git submodulecomandi e rmtutte le altre directory, spinge verso il master ecc ... la directory non esisteva e non c'era motivo per la cache. Si scopre .git/modulesche è lì che si trovava questo errore.


15

Potresti aver eliminato il tuo 'projets/fdf'disco, ma il tuo repository Git ce l' ha ancora. Utilizzare git rm -rf projets/fdfper rimuoverlo da Git, quindi eseguire il commit delle modifiche. Dopodiché sarai in grado di aggiungere questa cartella come sottomodulo.


Ha funzionato :) Grazie. Penso di aver effettivamente commesso questo errore.
vmonteco,

21
Mi viene detto che la directory non esiste quando lo faccio. Sembra che esista sia e non lo sia: /
Nathan Hornby

41
@ tom-mcfarlin Alla fine, ho rimosso all'istante le righe da .gitmodule e una cartella da .git / modules, quindi mi ha permesso di aggiungere un nuovo sottomodulo. Forse c'è un modo migliore per farlo, ma ero a corto di tempo. Se andrai in questo modo, ti consiglio di fare un buon backup e per favore non incolparmi, se va storto per te. In bocca al lupo.
sparklos,

5
Grazie, ho trovato su un altro post per rimuovere la cartella da .git / modules e ha funzionato per me. Ha senso dato che questo è ciò che l'errore dice è stato il conflitto ... Non ero a conoscenza di quella cartella
Tom McFarlin

10
@NathanHornby @Sparklos @TomMcFarlin - Nelle versioni più recenti di git, troverai che git-submodule aggiunge una directory nella cartella .git. Ad esempio, se ti trovi nella directory /tmp/repo, quindi esegui git submodule add ../otherrepo.git, vedrai che la /tmp/repo/.git/modules/otherrepocartella esiste. Questo è il problema per me. Ho eliminato manualmente quella cartella da .git e tutto ha funzionato.
Alexander Bird

13

Se hai già eliminato la directory del sottomodulo, come ho fatto io, segui le altre istruzioni di jbmilgrom. La chiave è, rm -rf .git/modules/path_to_submodulema andare avanti e fare prima il backup dell'intera directory repo principale .

Se hai avuto un solo sottomodulo, basta eliminare .gitmodules


2

Questi due comandi funzionano per me.

rm path/to/submodule -rf
rm .git/modules/path/to/module -rf

Questo. Sembra che ci siano due modi per creare sottomoduli. In uno di essi, la sottocartella avrà solo un singolo file .git che punta semplicemente a una directory nel superprogetto, a partire da .git/modules/. In c'è una cartella che memorizza il repository per il sottomodulo. L'eliminazione di quel repository ha risolto il problema per me, mentre la risposta accettata no.
William Randokun,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.