2012-10-15 9 views
136

Sono nuovo di git e apprezzerei l'aiuto con l'aggiunta di sottomoduli. Ho ricevuto due progetti che condividono un codice comune. Il codice condiviso è stato appena copiato nei due progetti. Ho creato un repository git separato per il codice comune e l'ho rimosso dai progetti con il piano per aggiungerlo come sottomodulo git.Problema con l'aggiunta del codice comune come sottomodulo git: "esiste già nell'indice"

ho usato l'opzione percorso di git modulo aggiungere per specificare la cartella:

git submodule add url_to_repo projectfolder 

ma poi ottenuto l'errore:

'projectfolder' already exists in the index" 

Questa è la struttura desiderata del mio repository:

repo 
|-- projectfolder 
    |-- folder with common code 

È possibile aggiungere il sottomodulo git direttamente nel repository o in una nuova cartella lì, ma non nella cartella del progetto. Il problema è che ha davvero bisogno di essere nella cartella del progetto .. Cosa posso fare su questo e cosa ho capito male sull'opzione del percorso del modulo aggiuntivo git add?

+0

Che cosa si ottiene se si fa 'git LS-files --stage projectfolder'? –

+0

Ricevo una lista con tutto il contenuto che inizia con 100644. – Vanja

+0

correlati: http://stackoverflow.com/questions/12696919/cant-add-existing-git-repository-into-new-repository/37336838#37336838 –

risposta

232

Ho paura che non ci siano abbastanza informazioni nella tua domanda per essere certi di quello che sta succedendo, dal momento che non hai risposto alla mia domanda di follow-up, ma questo può essere di aiuto in ogni caso.

Questo errore indica che lo stato projectfolder è già in esecuzione ("esiste già nell'indice"). Per scoprire cosa sta succedendo qui, cercare di elencare tutto nell'indice in quella cartella con:

git ls-files --stage projectfolder 

La prima colonna di tale uscita vi dirà che tipo di oggetto è nell'indice a projectfolder. (Questi guardare come i permessi dei file Unix, ma hanno significati speciali in git.)

Ho il sospetto che si vedrà qualcosa di simile:

160000 d00cf29f23627fc54eb992dde6a79112677cd86c 0 projectfolder 

(cioè una linea che inizia con 160000), nel qual caso il repository in projectfolder è già stato aggiunto come "gitlink". Se non compare nell'output di git submodule, e si desidera aggiungere nuovamente come un modulo, si può fare:

git rm --cached projectfolder 

... per unstage, e poi:

git submodule add url_to_repo projectfolder 

... per aggiungere il repository come sottomodulo.

Tuttavia, è anche possibile che si vedrà molte macchie quotate (con modalità di file 100644 e 100755), che suggerisce a me che non hai fatto correttamente unstage i file in projectfolder prima di copiare il nuovo repository in posizione. Se questo è il caso, è possibile effettuare le seguenti operazioni per unstage tutti i file:

git rm -r --cached projectfolder 

... e quindi aggiungere il modulo con:

git submodule add url_to_repo projectfolder 
+5

Grazie Mark per la tua risposta dettagliata. Ho fatto una "git rm -r - projectfolder in cache" e ho provato ad attirare nuovamente il sottomodulo.Tuttavia questa volta ricevo l'errore rmessage "'projectfolder' esiste già e non è un repository git valido". – Vanja

+3

@Vanja: indica che 'projectfolder' non contiene una directory' .git'. Sembrava dalla tua domanda come se avessi creato il nuovo repository di 'projectfolder' altrove, e lo avessi copiato in posizione, ma chiaramente non era così. Dovresti spostare la 'cartella di progetto 'esistente e poi copiare il nuovo repository (completo con la sua directory' .git') prima di aggiungerlo come sottomodulo. Oppure, se lo hai già trasferito nel repository rappresentato da 'url_to_repo', puoi semplicemente spostare 'projectfolder' di mezzo e quindi aggiungere il sottomodulo da quell'URL. –

+0

risposta impressionante +1 fino in fondo – abbood

1

ho ottenuto che funziona facendo il contrario modo in giro.A partire da un repository vuoto, aggiungendo il sottomodulo in una nuova cartella denominata "cartella di progetto/codice_comune". Successivamente è stato possibile aggiungere il codice del progetto nella cartella del progetto. I dettagli sono mostrati di seguito.

In un tipo repo vuoto:

git submodule add url_to_repo projectfolder/common_code 

che creerà la struttura di cartelle desiderata:

repo 
|-- projectfolder 
    |-- common_code 

È ora possibile aggiungere altri moduli, e il codice di progetto è possibile aggiungere a projectfolder .

Non posso ancora dire perché ha funzionato in questo modo e non l'altro.

29

Ho avuto lo stesso problema e dopo ore di ricerca ho trovato la risposta.

L'errore mi è stato sempre stato un po 'diverso: <path> already exists and is not a valid git repo (e ha aggiunto qui per il valore SEO)

La soluzione è quella di non creare la directory che ospiterà il modulo. La directory verrà creata come parte del comando git submodule add.

Inoltre, l'argomento dovrebbe essere relativo alla radice padre-repo, non alla directory di lavoro, quindi fare attenzione.

Soluzione per l'esempio precedente:

  1. è bene avere il vostro repo genitore già clonato.
  2. Verificare che la directory common_code non sia non.
  3. cd Repo
  4. git submodule add git://url_to_repo projectfolder/common_code/ (nota la barra finale desiderato.)
  5. Sanity ripristinata.

Spero che questo aiuti qualcuno, poiché ci sono pochissime informazioni da trovare altrove su questo.

+1

Il passaggio 4 dovrebbe iniziare con' git submodule add', e la barra finale non è richiesta – nullability

+0

Corretto l'errore di battitura. L'ho ripetuto e la barra finale ha fatto la differenza per me. Sto usando zsh se questo ha qualche effetto – Shelton

+0

Questo ha risolto il mio problema (creando la directory con l'add submodule commnand), grazie! – jackJoe

27

La rimozione del sottomodulo manualmente comporta il numero di passaggi e questo ha funzionato per me.

Dando per scontato ci si trova nella directory principale del progetto e di esempio nome del modulo Git è "C3-pro-ios-quadro"

Rimuovere i file associati al modulo

rm -rf .git/modules/c3-pro-ios-framework/ 

Rimuovere qualsiasi i riferimenti al modulo in config

vim .git/config 

enter image description here

Rimuovi.gitmodules

rm -rf .gitmodules 

elimina dalla cache senza il "git"

git rm --cached c3-pro-ios-framework 

Aggiungi modulo

git submodule add https://github.com/chb/c3-pro-ios-framework.git 
+1

Great post, funziona alla grande.E 'bello da parte tua condividere, signore, davvero fantastico – gabn88

+0

I ho provato ad elencare i sottomoduli tramite 'git submodule' dopo la rimozione e prima di aggiungerli e mi ha dato un errore, commettendo la rimozione che si è preso cura di questo – mehmet

1

Giusto per chiarire in linguaggio umano quanto l'errore sta cercando per dirti:

Non è possibile creare un repository in questa cartella che è già tracciata nel repository principale.

Ad esempio: avete una cartella a tema chiamato AwesomeTheme che è un repository dedicato, si tenta non dump direttamente nel repository principale come git submodule add sites/themes e si ottiene questo "AwesomeTheme" index already exists.

Devi solo assicurarti che non ci sia già uno sites/themes/AwesomeTheme nel monitoraggio della versione del repository principale in modo che il sottomodulo possa essere creato lì.

Quindi, per risolvere, nel repository principale se si dispone di una directory vuota sites/theme/AwesomeTheme quindi rimuoverlo. Se avete già fatto commit con la directory sites/theme/AwesomeTheme nel repository principale è necessario per eliminare tutta la storia di esso con un comando come questo:

git filter-branch --index-filter \ 
       'git rm -r --cached --ignore-unmatch sites/theme/AwesomeTheme'  HEAD 

Ora è possibile eseguire git submodule add [email protected] sites/themes/AwesomeTheme

Dal momento che il repository principale ha mai visto qualcosa (aka index'd) in sites/themes/AwesomeTheme prima, ora può crearlo.

0

Non so se questo è utile, anche se ho avuto lo stesso problema quando provavo a trasferire i miei file da IntelliJ 15. Alla fine, ho aperto SourceTree e lì potevo semplicemente salvare il file. Problema risolto. Non c'è bisogno di emettere comandi di git fantastici. Basta menzionarlo nel caso qualcuno abbia lo stesso problema.

-7

Nella directory git, si supponga di aver sincronizzato tutte le modifiche.

rm -rf .git 

rm -rf .gitmodules 

Poi fare:

git init 
git submodule add url_to_repo projectfolder 
+1

non farlo, dovrai affrontare molte conseguenze indesiderate – bersam

10

se esiste una cartella denominata x sotto controllo git, si desidera aggiungere un nome stesso modulo, è necessario eliminare la cartella x e si impegnano in primo luogo.

aggiornato da @ Ujjwal Singh-:

Commettere non è necessaria, messa in scena è sufficiente .. git add/git rm -r

+0

Il commit è stato ciò che mi mancava. Risposta breve, ma corretta! – Qqwy

+2

Il commit non è necessario, l'allestimento è sufficiente .. 'git add' /' gir rm -r' –