Problema con l'aggiunta di codice comune come sottomodulo git: "esiste già nell'indice"


225

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.

Ho usato l'opzione path di git submodule add per specificare la cartella:

git submodule add url_to_repo projectfolder

ma poi ho ricevuto 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 deve davvero essere nella cartella del progetto. Cosa posso fare al riguardo e cosa ho frainteso sull'opzione path di git submodule add?


Cosa ottieni se lo fai git ls-files --stage projectfolder?
Mark Longair,

Ricevo un elenco con tutto il contenuto che inizia con 100644.
Vanja,


8
per me fare una git rmcartella esistente ha aiutato: |
rogerdpack,

Risposte:


343

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

Tale errore indica che projectfolderè già in scena ("esiste già nell'indice"). Per scoprire cosa sta succedendo qui, prova a elencare tutto nell'indice sotto quella cartella con:

git ls-files --stage projectfolder

La prima colonna di quell'output ti dirà quale tipo di oggetto è nell'indice in projectfolder. (Sembrano filemode Unix, ma hanno significati speciali in git.)

Ho il sospetto che vedrai qualcosa di simile:

160000 d00cf29f23627fc54eb992dde6a79112677cd86c 0   projectfolder

(ovvero una riga che inizia con 160000), nel qual caso il repository in projectfolderè già stato aggiunto come "gitlink". Se non viene visualizzato nell'output di git submodulee si desidera aggiungerlo nuovamente come sottomodulo, è possibile eseguire:

git rm --cached projectfolder

... per annullare la messa in scena, quindi:

git submodule add url_to_repo projectfolder

... per aggiungere il repository come sottomodulo.

Tuttavia, è anche possibile che vengano visualizzati molti BLOB elencati (con modalità file 100644e 100755), il che mi suggerirebbe di non aver correttamente staccato i file projectfolderprima di copiare il nuovo repository in posizione. In tal caso, è possibile effettuare le seguenti operazioni per disinstallare tutti quei file:

git rm -r --cached projectfolder

... e quindi aggiungere il sottomodulo con:

git submodule add url_to_repo projectfolder

13
Grazie a Mark per la risposta dettagliata. Ho fatto una "cartella di progetto git rm -r --cached" e ho provato ad accedere nuovamente al sottomodulo. Comunque questa volta ricevo l'errore rmessage "'projectfolder' esiste già e non è un repository git valido".
Vanja,

3
@Vanja: ciò indica che projectfoldernon conteneva una .gitdirectory. Sembrava dalla tua domanda come se avessi creato il nuovo repository per projectfolderaltrove e l' avessi copiato in posizione, ma chiaramente non era così. Dovresti spostare l'esistente projectfolderdi mezzo, quindi copiare il nuovo repository (completo con la sua .gitdirectory) in posizione prima di aggiungerlo come sottomodulo. Oppure, se l'hai già inviato al repository rappresentato da url_to_repo, potresti semplicemente spostarti projectfolderdi mezzo e quindi aggiungere il sottomodulo da quell'URL.
Mark Longair,

risposta fantastica +1 fino in fondo
circa il

Questo mi ha aiutato moltissimo. Grazie!
Evan Moran,

1
Questo è quello che ho fatto, che è il processo in 3 passaggi PASSAGGIO 1: git rm -r --crc src / test / resources /, PASSAGGIO 2: rimosso la directory delle risorse esistente in qualche altro posto, PASSAGGIO 3: sottomodulo git aggiungi aggiungi url_to_repo src / test / risorse
vikramvi,

52

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

Supponendo che ci si trovi nella directory principale del progetto e che il nome del modulo git di esempio sia "c3-pro-ios-framework"

Rimuovere i file associati al sottomodulo

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

Rimuovere eventuali riferimenti al sottomodulo in config

vim .git/config

inserisci qui la descrizione dell'immagine

Rimuovere .gitmodules

rm -rf .gitmodules

Rimuoverlo dalla cache senza "git"

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

Aggiungi sottomodulo

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

2
Ottimo post, funziona benissimo. Fantastico da condividere, signore. Davvero fantastico.
gabn88,

1
Ho provato a elencare i sottomoduli via git submoduledopo la rimozione e prima di aggiungere e mi ha dato un errore, commettendo la rimozione si è preso cura di esso.
Mehmet,

1
Voterei questo 50x se potessi; mi hai appena salvato la giornata!
Sensei James,

touch .gitmodules(deve trovarsi nell'albero di lavoro, quindi rimuoverlo aiuta. Ma è necessario aggiungerlo di nuovo). Splendido post tra l'altro. L'unica cosa che ha funzionato qui.
Torxed

Era la .gitdirectory che aveva ancora dei resti per me. Questo ha funzionato alla grande. Grazie.
Kevin Anderson,

44

È necessario rimuovere prima il repository git del sottomodulo (cartella di progetto in questo caso) per il percorso git.

rm -rf projectfolder

git rm -r projectfolder

e quindi aggiungere sottomodulo

git submodule add <git_submodule_repository> projectfolder

4
git submodule add --force <git_submodule_repository>ha lavorato per me per mantenere lo stesso nome del sottomodulo
Tenfrow,

1
Grazie!! Non ho dovuto aggiungere nella cartella del progetto, ho appena cambiato nella sottodirectory e clona da lì.
Tony Fraser

32

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

L'errore che stavo ottenendo era un po 'diverso: <path> already exists and is not a valid git repo(e aggiunto qui per valore SEO)

La soluzione è NON creare la directory che ospiterà il sottomodulo. La directory verrà creata come parte del git submodule addcomando.

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

Soluzione per l'esempio sopra:

  1. Va bene clonare il repository principale.
  2. Assicurarsi che la common_codedirectory non esista.
  3. cd Repo
  4. git submodule add git://url_to_repo projectfolder/common_code/( Nota la barra finale richiesta. )
  5. Sanity restaurato.

Spero che questo aiuti qualcuno, dato che ci sono pochissime informazioni da trovare altrove al riguardo.


1
Il passaggio 4 dovrebbe iniziare git submodule adde la barra finale non è richiesta.
nullability

Risolto l'errore di battitura. L'ho testato di nuovo e la barra finale ha fatto la differenza per me. Sto usando zsh se questo ha qualche effetto.
indefinito il

Questo ha risolto il mio problema (creazione della directory con il comando Aggiungi sottomodulo), grazie!
jackJoe,

18

se esiste una cartella denominata xsotto controllo git, si desidera aggiungere un sottomodulo con lo stesso nome, è necessario eliminare la cartella xe impegnarla prima .

Aggiornato da @ ujjwal-singh:

L'impegno non è necessario, la messa in scena è sufficiente .. git add/git rm -r


L'impegno è stato quello che mi mancava. Risposta breve, ma corretta!
Qqwy

3
Non è necessario impegnarsi, la messa in scena è sufficiente .. git add/gir rm -r
Ujjwal Singh,

3

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

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

Ad esempio: hai una cartella di temi chiamata AwesomeThemeche è un repository dedicato, prova a scaricarlo direttamente nel tuo repository principale come git submodule add sites/themese ottieni questo "AwesomeTheme" index already exists.

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

Quindi, per risolvere, nel tuo repository principale se hai una sites/theme/AwesomeThemedirectory vuota, rimuovila. Se hai già eseguito il commit con la sites/theme/AwesomeThemedirectory nel tuo repository principale, devi eliminare tutta la sua storia con un comando come questo:

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

Adesso puoi correre git submodule add git@AwesomeTheme.repowhateverurlthing sites/themes/AwesomeTheme

Dal momento che il repository principale non ha mai visto nulla (noto anche come indicizzato) sites/themes/AwesomeThemeprima, ora può crearlo.


1

L'ho fatto funzionare facendolo al contrario. A partire da un repository vuoto, aggiungendo il sottomodulo in una nuova cartella denominata "projectfolder / common_code". Successivamente è stato possibile aggiungere il codice del progetto nella cartella del progetto. I dettagli sono mostrati di seguito.

In un repository vuoto digitare:

git submodule add url_to_repo projectfolder/common_code

Ciò creerà la struttura di cartelle desiderata:

repo
|-- projectfolder
    |-- common_code

Ora è possibile aggiungere più sottomoduli e il codice del progetto può essere aggiunto alla cartella del progetto.

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


0

Non so se questo è utile, anche se ho avuto lo stesso problema quando ho provato a eseguire il commit dei miei file da IntelliJ 15. Alla fine ho aperto SourceTree e lì ho potuto semplicemente eseguire il commit del file. Problema risolto. Non c'è bisogno di emettere alcun comando git di fantasia. Basta menzionarlo nel caso in cui qualcuno abbia lo stesso problema.


0

Vai alla cartella del repository. Elimina i sottomoduli pertinenti da .gitmodules. Seleziona Mostra file nascosti. Vai alla cartella .git, elimina i sottomoduli dalla cartella del modulo e config.


0

Ciò accade se il file .git manca nel percorso di destinazione. Mi è successo dopo che ho eseguito git clean -f -d.

Ho dovuto eliminare tutte le cartelle di destinazione mostrate nel messaggio e quindi in esecuzione git submodule update --remote


-18

Nella tua directory git, supponi di avere sincronizzato tutte le modifiche.

rm -rf .git 

rm -rf .gitmodules

Quindi fa:

git init
git submodule add url_to_repo projectfolder

2
questo eliminerà l'intera storia del progetto!
redbandit
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.