2014-08-29 11 views
6

Ho seguito this excellent answer per estrarre una sottodirectory del mio repository git nel proprio repository, mantenendo la cronologia completa.Sottotitolo Git diviso due directory

mio repository assomiglia:

src/ 
    http/ 
    math/ 
tests/ 
    http/ 
    math/ 

Voglio creare un nuovo ramo che contiene solo le src/math e tests/math directory.

Se si esegue il seguente comando:

git subtree split -P src/math -b math 

Si crea un ramo che contiene il contenuto della directory src/math, ma scarta il prefisso src/math/.

Se provo lo stesso comando con due directory:

git subtree split -P src/math -P tests/math -b math 

Estrae solo il contenuto del tests/math, ignorando src/math, e anche scartare il prefisso tests/math.

Per riassumere, vorrei che il mio deposito finale per assomigliare:

src/ 
    math/ 
tests/ 
    math/ 

Cioè, mantenendo la struttura di directory originale, ma scartando tutto ciò che non è esplicitamente menzionato nella riga di comando.

Come posso farlo?

+1

Downvoter, ti interessa spiegare perché? – Benjamin

+1

Immagino che Downvoter non abbia capito la domanda. –

+0

questo non è esattamente un dup di http://stackoverflow.com/questions/2982055/detach-many-subdirectories-into-a-new-separate-git-repository ma richiede lo stesso risultato. È solo che qui la domanda è specifica per 'git subtree split'. Ho seguito la procedura nella prima risposta e funziona come un fascino – Hilikus

risposta

3

A seconda delle esigenze, è possibile scappare con git filter-branch.

Non sono del tutto sicuro di ciò che si sta cercando di ottenere, ma se si desidera semplicemente avere un repository con due directory rimosse (nella cronologia?) Questo è probabilmente il tuo colpo migliore.

Vedere anche Rewriting Git History.

$ git filter-branch --tree-filter 'rm -rf tests/http src/http' --prune-empty HEAD 

Questo cercherà in ogni commit e rimuoverà le due directory da questo commit. Tieni presente che questa cronologia riscrive (ad es. Modifica il tuo commit sha) e causerà mal di testa se hai una storia comune con un altro repository.

+0

In realtà, il mio esempio era una semplificazione eccessiva e ho molte più cartelle oltre a 'http' e' math'. C'è un modo in cui posso solo specificare quali tenere e non quali eliminare? – Benjamin

+0

in sostanza puoi inserire uno script di bash lì. puoi 'rm' gestire ciò che vorresti mantenere -> no. può bash fare, sì. prova a capire come usare 'find' per soddisfare le tue esigenze. http://www.gnu.org/software/findutils/manual/html_mono/find.html – Alex

+0

inoltre puoi usare le espressioni regolari per abbinare le tue directory. è ** più semplice ** e ** più veloce ** per dire a 'rm' cosa eliminare. – Alex