2012-04-26 15 views
8

Więc mam dwa repozytorium git. Pierwszym z nich jest nasz framework (myślę o abstrakcji db, funkcje), a następnie kolejne repozytorium git dla naszego nowego projektu.Jak zagnieżdżać repozytoria git; pobierz i scal

Chcę obejmują repo framework git do git projektu i zgodnie z GitHub Pomocy, to powinno działać:

cd /project 
git remote add framework git://github.com/username/Framework.git 
git fetch framework 
git merge framework/master 

Problem jest, gdy robię scalanie, przynosi wszystko, wszystkie pliki z i po prostu zrzuca je do katalogu głównego projektu. Zamiast tego, w jaki sposób możemy połączyć pliki szkieletowe w katalog podrzędny, taki jak /project/framework/?

Odpowiedz

20

Możesz zajrzeć do pomocy Git's submodule. Podmoduł umożliwia osadzenie jednego repozytorium git wewnątrz innego repozytorium git. Do tego rodzaju rzeczy jest alternative solutions, ale sam ich nie użyłem.

Przykładem może wyglądać następująco:

$ git clone git://github.com/username/project.git 
$ cd project 
$ git submodule add git://github.com/username/framework.git framework 
$ git commit -m "added framework submodule" 

Jeśli klonowania repozytorium z submodules, trzeba użyć opcji --recursive:

$ git clone --recursive git://<repository-with-submodules>.git 

lub alternatywnie, można regularnie sklonować i następnie uruchom:

$ git submodule init 
$ git submodule update 

Przeczytaj powiązany dokument (i git submodule --help), aby uzyskać więcej informacji.

W przypadku wprowadzenia zmian do modułem, wprowadzą je w ten sposób:

# first update the submodule just like any other git repository 
$ cd project/framework 
$ git pull 

# now you have to record the new commit in the parent repository 
$ cd .. 
$ git commit -m "updated framework submodule" 

Ostatnim krokiem jest konieczne, ponieważ git rejestruje specyficzny commit związane z danym modułem (tak, że gdy ktoś klonuje rodzica, otrzymają tę wersję modułu, a nie jego najnowszą wersję, która mogła zostać przełamana, co uniemożliwiłoby jej działanie zgodnie z zamierzeniami w repozytorium nadrzędnym). Więc jeśli zaktualizujesz moduł częściowy, musisz zarejestrować nowy commit w rodzica.

Jeśli dokonasz zmian w module submodułu framework, będziesz ponownie tylko git push, tak jak w przypadku każdego innego repozytorium. Następnie musisz zatwierdzić nową wersję w module nadrzędnym.

+0

Idealne, więc gdy wprowadzane są zmiany w programie Framework, jak mogę je przenieść do projektu teraz, gdy jest to moduł? Ponadto, jeśli wprowadzę zmiany do programu ramowego zamiast projektu, w jaki sposób mogę je ponownie wprowadzić do repozytorium git ramowego? – Justin

+0

Zaktualizowałem swoją odpowiedź. – larsks

+0

Jedna mała uwaga. Moduł podrzędny HEAD jest odłączony, dlatego należy zachować ostrożność podczas wprowadzania zmian w module częściowym. Utwórz oddział (lub przełącz się do oddziału), wprowadź zmiany, zatwierdz, a następnie naciśnij. – GoZoner