Hai aggiunto vendor/plugins/open_flash_chart_2
la voce "gitlink", ma non l'hai mai definita come sottomodulo. In effetti stai usando la funzione interna che usa git submodule (voci gitlink) ma non stai usando la funzione sottomodule stessa.
Probabilmente hai fatto qualcosa del genere:
git clone git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
git add vendor/plugins/open_flash_chart_2
Quest'ultimo comando è il problema. La directory vendor/plugins/open_flash_chart_2
inizia come repository Git indipendente. Di solito tali sotto-repository vengono ignorati, ma se si dice a git add di aggiungerlo in modo esplicito, verrà creata una voce gitlink che punta al commit HEAD del repository invece di aggiungere il contenuto della directory. Potrebbe essere bello se git add si rifiuta di creare tali "semi-sottomoduli".
Le directory normali sono rappresentate come oggetti albero in Git; gli oggetti albero danno nomi e autorizzazioni agli oggetti che contengono (di solito altri oggetti albero e BLOB, rispettivamente directory e file). I sottomoduli sono rappresentati come voci "gitlink"; Le voci gitlink contengono solo il nome oggetto (hash) del commit HEAD del sottomodulo. Il “repository di origine” per il commit di un gitlink è specificato nel .gitmodules
file (e nel .git/config
file una volta inizializzato il sottomodulo).
Quello che hai è una voce che punta a un particolare commit, senza registrare il repository di origine per quel commit. Puoi risolvere questo problema trasformando il tuo gitlink in un sottomodulo appropriato, oppure rimuovendo il gitlink e sostituendolo con contenuto "normale" (file e directory semplici).
Trasformalo in un sottomodulo appropriato
L'unico bit mancante da definire correttamente vendor/plugins/open_flash_chart_2
come sottomodulo è un .gitmodules
file. Normalmente (se non lo avessi già aggiunto come voce gitlink nuda), useresti semplicemente git submodule add
:
git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
Come hai trovato, questo non funzionerà se il percorso esiste già nell'indice. La soluzione è rimuovere temporaneamente la voce gitlink dall'indice e quindi aggiungere il sottomodulo:
git rm --cached vendor/plugins/open_flash_chart_2
git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
Questo utilizzerà il tuo repository esistente (ovvero non clonerà nuovamente il repository di origine) e metterà in scena un .gitmodules
file simile al seguente:
[submodule "vendor/plugins/open_flash_chart_2"]
path = vendor/plugins/open_flash_chart_2
url = git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
Inoltre, inserirà una voce simile nel repository principale .git/config
(senza path
impostazione).
Commettilo e avrai un sottomodulo adeguato. Quando clonate il repository (o spingete su GitHub e clonate da lì), dovreste essere in grado di reinizializzare il sottomodulo tramite git submodule update --init
.
Sostituiscilo con contenuto semplice
Il passaggio successivo presuppone che il proprio sotto-repository vendor/plugins/open_flash_chart_2
non abbia alcuna cronologia locale che si desidera conservare (ovvero, tutto ciò che ci interessa è l'albero di lavoro corrente del sottopository, non la cronologia).
Se si dispone della cronologia locale nel repository di cui si è interessati, è necessario eseguire il backup della .git
directory del repository prima di eliminarla nel secondo comando di seguito. (Considera anche l' esempio di sottostruttura git che segue che conserva la cronologia di HEAD del repository).
git rm --cached vendor/plugins/open_flash_chart_2
rm -rf vendor/plugins/open_flash_chart_2/.git # BACK THIS UP FIRST unless you are sure you have no local changes in it
git add vendor/plugins/open_flash_chart_2
Questa volta quando si aggiunge la directory, non si tratta di un repository, quindi i file verranno aggiunti normalmente. Sfortunatamente, poiché abbiamo eliminato la .git
directory non esiste un modo semplicissimo per mantenere le cose aggiornate con il repository di origine.
In alternativa, potresti prendere in considerazione l'utilizzo di un'unione di sottostruttura . Ciò ti consentirà di estrarre facilmente le modifiche dal repository di origine mantenendo i file "piatti" nel tuo repository (senza sottomoduli). Il comando di sottotree git di terze parti è un buon wrapper per la funzionalità di unione delle sottostrutture.
git rm --cached vendor/plugins/open_flash_chart_2
git commit -m'converting to subtree; please stand by'
mv vendor/plugins/open_flash_chart_2 ../ofc2.local
git subtree add --prefix=vendor/plugins/open_flash_chart_2 ../ofc2.local HEAD
#rm -rf ../ofc2.local # if HEAD was the only tip with local history
Dopo:
git remote add ofc2 git://github.com/korin/open_flash_chart_2_plugin.git
git subtree pull --prefix=vendor/plugins/open_flash_chart_2 ofc2 master
git subtree push --prefix=vendor/plugins/open_flash_chart_2 git@github.com:me/my_ofc2_fork.git changes_for_pull_request
git subtree ha anche --squash
un'opzione che ti consente di evitare di incorporare la cronologia del repository di origine nella cronologia ma ti consente comunque di inserire le modifiche a monte.