2010-03-29 12 views
31

Załóżmy moim repozytorium git ma następującą strukturę:Wyodrębnij część repozytorium git?

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

i repozytorium ma sporo zobowiązuje. Teraz jeden z podprojektów (SubProject-0) rośnie całkiem nieźle i chcę wyjąć SubProject-0 i ustawić go jako samodzielny projekt. Czy możliwe jest wyodrębnienie całej historii zatwierdzenia z Subproject-0 z nadrzędnego repozytorium git i przeniesienie go na nowy?

+2

Należy pamiętać, że jest to duplikat http://stackoverflow.com/questions/359424/detach-subdirectory-into-separate-git-repository (jak mówi Jim DeLaHunt w swojej odpowiedzi). –

Odpowiedz

36

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

myślę, że trzeba coś takiego

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

w klonem repozytorium.

+0

Dzięki! Działa jak marzenie! – Rio

+2

@Rio Możesz także użyć opcji '--prune-empty', aby zniszczyć zatwierdzenia, które dotknęły tylko' Project/SubProject-0'. –

+0

Wow działa idealnie! dzięki – alvatar

1

Potrzebowałem zrobić coś podobnego, ale chciałem zasadniczo przenieść jeden podprojekt z repo na inny. Zamiast tego użyłem funkcji pobierania, ponieważ może ona pobierać obiekty z dowolnego źródła.

Więc, w zasadzie, stworzyłem nową gałąź, usunąłem niepotrzebne rzeczy z tej gałęzi, a następnie użyłem pobierania git, aby wyciągnąć gałąź z jednego repo na drugie. Kiedy już miałem obiekty, scalenie zrobiło lewę.

E.g.

w repozytorium, który ma oryginalne rzeczy:

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

Następnie można pobierał tę gałąź z jednego repozytorium w zupełnie inną (niezwiązanej):

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

gdzie temp: środki tymczasowe "pobierz temperaturę na źródle i zapisz ją jako temp". Stamtąd możesz połączyć wynik z mistrzem.

git merge temp 

można następnie usunąć gałęzie tymczasowe, ponieważ w pierwszym przypadku to nie jest coś, czego nigdy nie chce się połączyć z oryginalnym repo, aw drugim przypadku połączyły go.

Jestem pewien, że te kroki mogą być nieco skompresowane, ale ten zestaw wydaje się ładny i przejrzysty.

+0

Przykro mi, że robię ci błąd w sprawie starego posta, ale jest to odpowiedź na użyteczne, ale inne pytanie niż OP. Czy możesz stworzyć nową parę q/a dla tej odpowiedzi? Ułatwiłoby to znalezienie. – tacaswell

+0

i lepiej byłoby użyć metody filtru do stworzenia tymczasowego repozytorium zawierającego tylko te pliki, które chcesz przenieść, a następnie wykonanie kroku scalania tymczasowego repozytorium, ponieważ robienie tego w ten sposób wciąż ma pełną historię oryginalnego repo (po prostu z krokiem usuwania jako ostatnim zatwierdzeniem). – tacaswell