2013-05-15 9 views
52

Ho un progetto che contiene un sottomodulo, sul percorso mysubmodule. Ho installato l'ultimo Git dal sorgente (1.8.3-rc2) e ho eseguito git submodule deinit mysubmodule. Ho quindi eliminato il file .gitmodules e ho confermato la modifica. Ho anche eliminato la directory .git dalla cartella mysubmodule.Come aggiungo i file in Git al percorso di un precedente sottomodulo?

Vorrei trasferire direttamente i file da mysubmodule al mio repository, ma git dice che non ci sono cambiamenti. Se digito git add mysubmodule non fa nulla. Se scriv git add mysubmodule/file.txt si dice fatal: Path 'mysubmodule/file.txt' is in submodule 'mysubmodule'

ho anche scoperto se si estrae una versione fresca di pronti contro termine, si crea una directory mysubmodule, pur avendo alcun file .gitmodules. E l'esecuzione di git submodule init ti dà un errore No submodule mapping found in .gitmodules for path 'mysubmodule'.

Come posso risolvere questo problema?

+1

Avete controllato tutti [questi passaggi] (http://stackoverflow.com/a/1260982/955926) per garantire che non vi siano parti del sottomodulo che si attardano intorno? Non penso che 'deinit' rimuova completamente il sottomodulo. Sembra semplicemente rimuoverlo dal tuo file '.git/config', come se avessi clonato un repository con un sottomodulo, ma non avessi ancora eseguito' git init'. Questo è diverso rispetto alla rimozione completa del sottomodulo. Se questo è il caso, git pensa ancora che la cartella sia un sottomodulo, ma la sta ignorando. –

risposta

71

Git pensa ancora mysubmodule è un sottomodulo, perché è registrato nell'indice con una modalità speciale "160000".
Vedere "git submodule update needed only initially?" per ulteriori informazioni.
Per verificare che, come in in this answer, si può fare un:

$ git ls-tree HEAD mysubmodule 
160000 commit c0f065504bb0e8cfa2b107e975bb9dc5a34b0398 mysubmodule 

che non dipende dalla presenza del file .gitmodule, o sul contenuto di mysubmodule.

È necessario rimuovere quella voce dall'indice prima:

git rm --cached mysubmodule 

Poi si può procedere.

+0

'git ls-tree HEAD mysubmodule' non mi ha dato risultati, ma' git ls-files --stage | grep mysubmodule' ha funzionato. [Riferimento] (https://stackoverflow.com/questions/1992018/git-submodule-update-needed-only-initially/2227598#2227598). Perché dovrebbe essere? – nzn

+0

@nzn Non sono sicuro: ho appena provato entrambi e funzionano. Che versione git stai usando, su quale sistema operativo? – VonC