2010-03-29 27 views
31

assumere la mia repository git ha la seguente struttura:Estrai parte di un repository git?

/.git 
/Project 
/Project/SubProject-0 
/Project/SubProject-1 
/Project/SubProject-2 

e il repository ha abbastanza alcuni commit. Ora uno dei sottoprogetti (SubProject-0) diventa piuttosto grande e voglio estrarre SubProject-0 e impostarlo come progetto autonomo. È possibile estrarre tutta la cronologia dei commit che coinvolge SubProject-0 dal repository git padre e spostarla in una nuova?

+2

Si noti che questo è un duplicato di http://stackoverflow.com/questions/359424/detach-subdirectory-into-separate-git-repository (come dice Jim DeLaHunt nella sua risposta). –

risposta

36

Vedi http://git-scm.com/docs/git-filter-branch

Penso che è necessario qualcosa di simile

git filter-branch --subdirectory-filter Project/SubProject-0 --prune-empty -- --all 

in un clone del repository.

+0

Grazie! Funziona come un fascino! – Rio

+2

@Rio Si potrebbe anche voler usare l'opzione '--prune-empty' per cancellare i commit che hanno toccato solo' Project/SubProject-0'. –

+0

wow funziona perfettamente! grazie – alvatar

1

Avevo bisogno di fare qualcosa di simile, ma volevo essenzialmente spostare un sottoprogetto da un repository ad un altro. Quello che ho fatto invece è stato usare fetch, dato che può recuperare oggetti da qualsiasi fonte.

Quindi, in pratica, ho creato un nuovo ramo, eliminato il materiale non necessario in quel ramo, quindi ho utilizzato git fetch per estrarre il ramo da un repository all'altro. Una volta avuto gli oggetti, l'unione ha fatto il trucco.

E.g.

Sul repository che ha la roba originale:

git checkout -b temp master 
    git rm -r Unneeded_stuff 
    git commit -m 'pruning' 

Quindi è possibile recuperare quel ramo da un repository in uno completamente diverso (indipendente):

cd /path/to/other/repository 
    git fetch /path/to/source/repo temp:temp 

dove temp: mezzi temporanei "recupera temp alla fonte e salvalo come temp qui dentro". Da lì puoi unire il risultato nel tuo master.

git merge temp 

è possibile eliminare i rami temporanei, in quanto nel primo caso non è qualcosa che si vuole mai a fondersi con il repo originale, e nel secondo caso l'associazione sia avvenuta.

Sono sicuro che questi passaggi potrebbero essere compressi un po ', ma questo set sembra bello e chiaro.

+0

Ci scusiamo per il bug su un vecchio post, ma questo risponde a una domanda utile, ma diversa dall'OP. Potresti creare una nuova coppia q/a per questa risposta? Lo renderebbe molto più facile da trovare. – tacaswell

+0

e sarebbe preferibile utilizzare il metodo di filtro per creare un repository temporaneo includendo solo i file che si desidera spostare e quindi eseguire il passo di unione del repository temporaneo in questo modo ha ancora la cronologia completa del repository originale (solo con un passo di cancellazione come ultimo commit). – tacaswell

Problemi correlati