Soluzione dettagliata
Vedi la nota alla fine di questa risposta (ultimo paragrafo) per una rapida alternativa ai sottomoduli git usando npm;)
Nella seguente risposta, saprai come estrarre una cartella da un repository e creare un repository git da esso e quindi includerlo come sottomodulo anziché come cartella.
Ispirato dall'articolo di Gerg Bayer Spostamento di file da un repository Git a un altro, preservando la storia
All'inizio abbiamo qualcosa del genere:
<git repository A>
someFolders
someFiles
someLib <-- we want this to be a new repo and a git submodule!
some files
Nelle fasi sotto riportate, farò riferimento questo someLib
come <directory 1>
.
Alla fine, avremo qualcosa del genere:
<git repository A>
someFolders
someFiles
@submodule --> <git repository B>
<git repository B>
someFolders
someFiles
Crea un nuovo repository git da una cartella in un altro repository
Passo 1
Ottieni una nuova copia del repository da dividere.
git clone <git repository A url>
cd <git repository A directory>
Passo 2
La cartella corrente sarà il nuovo repository, quindi rimuovi il telecomando corrente.
git remote rm origin
Passaggio 3
Estrai la cronologia della cartella desiderata e salvala
git filter-branch --subdirectory-filter <directory 1> -- --all
Ora dovresti avere un repository git con i file dalla directory 1
radice del tuo repository con tutta la cronologia dei commit correlata.
Passaggio 4
Crea il tuo repository online e invia il tuo nuovo repository!
git remote add origin <git repository B url>
git push
Potrebbe essere necessario impostare il upstream
ramo per il primo push
git push --set-upstream origin master
Clean <git repository A>
(opzionale, vedi commenti)
Vogliamo eliminare le tracce (file e cronologia dei commit) di <git repository B>
da, <git repository A>
quindi la cronologia per questa cartella è presente solo una volta.
Si basa sulla rimozione dei dati sensibili da GitHub.
Vai in una nuova cartella e
git clone <git repository A url>
cd <git repository A directory>
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch <directory 1> -r' --prune-empty --tag-name-filter cat -- --all
Sostituisci <directory 1>
con la cartella che desideri rimuovere. -r
lo farà ricorsivamente all'interno della directory specificata :). Ora spingere origin/master
con--force
git push origin master --force
Fase Boss (vedi nota sotto)
Crea un sottomodulo da <git repository B>
into<git repository A>
git submodule add <git repository B url>
git submodule update
git commit
Verifica se tutto ha funzionato come previsto e push
git push origin master
Nota
Dopo aver fatto tutto questo, mi sono reso conto nel mio caso che era più appropriato utilizzare npm per gestire invece le mie dipendenze. Possiamo specificare gli URL e le versioni di git, vedere gli URL di git package.json come dipendenze .
Se lo si fa in questo modo, il repository che si desidera utilizzare come requisito deve essere un modulo NPM quindi deve contenere un package.json
file o si otterrà questo errore: Error: ENOENT, open 'tmp.tgz-unpack/package.json'
.
tldr (soluzione alternativa)
Potresti trovare più facile usare npm e gestire le dipendenze con gli URL git :
- Sposta la cartella in un nuovo repository
- eseguito
npm init
all'interno di entrambi i repository
- esegui
npm install --save git://github.com/user/project.git#commit-ish
dove vuoi installare le tue dipendenze