Tworzenie projektu na podstawie bazowego

 

Długo poszukiwałem rozwiązania na mój "problem". Jak on brzmiał:

  • Mam jakiś bazowy projekt (w środku są przykładowe foldery: core, templates, package, db) - nazwę go BP
  • Tworzę nowy projekt (P1) na podstawie BP
  • W P1 pracuję głównie w obrębie templates i package, tzn dodaje, edytuje i usuwam pliki
  • Teraz dodaje jakiś super ważny, wspólny komponent dla wszystkich projektów do BP do folderu core i packages
  • P1 chcę zaktualizować, aby miał zmiany z BP zachowując P1

Submoduły odpadają, ponieważ on tworzą tylko 1 pod folder w którym istnieje repo.

Można kombinować z repozytorium w repozytorium, ale to rozwiązanie ogranicza się tak jak submoduły do wybranego folderu, a ja bym chciał coś bardziej globalnego, żeby obejmowało cały projekt.

W poszukiwaniu tego Świętego Graala wpadłem na pewne rozwiązanie, które w 70% mnie zadowala ;)

Spróbujmy…

Mam 2 repozytoria:

  • CMS – bazowy projekt
  • PROJECT – nowy projekt na podstawie bazowego

Najpierw zajmijmy się projektem bazowym. Kopiujemy repozytorium do nas lokalnie, wprowadzamy wszelkie zmiany i wrzucamy do na repo-serwer. Powiedzmy że struktura bazowego folderu będzie wyglądać tak:

1_cms.png

Na ten moment zostawiamy na CMS i idziemy do PROJECTu.

Kopiujemy repozytorium z serwera – niech będzie nowe, świeże. Po wykonaniu tego możemy dodać sobie jakiś plik, żeby wrzucić do na repo-serwer (aby powstał branch master).

Ok, teraz musimy jakoś zapiąć projekt bazowy, czyli CMS. Będę pokazywał jak to zrobić w Tortoise GIT, ponieważ na co dzień go używam w swojej pracy, jednak z poziomu konsoli można robić dokładnie to samo!

Zaczynamy. Dodajemy nowe, zdalne repozytorium. W TGit wybieramy PPM -> TortoiseGit -> Settings. Następnie wybieramy zakładkę Git->Remote .

2_project.png

Dodajemy nowe repozytorium.

3_project.png

Jako remote podajemy własną nazwę (bez polskich znaków i spacji), a jako URL ścieżkę do repo-serwera.

Następnie Tortoise zadaje nam kilka pytań:

Czy wyłączyć system tagów dla dodatkowego remote – wybierzmy YES.

4_project.png

Czy chcesz pobrać informacje na temat branchy z nowego remote? – YES

5_project.png

Klikamy OK i czekamy.

6_project.png

Gotowe, mamy pobrane.

7_project.png

Tak wyglądają nasze zdalne repozytoria po tej operacji

8_project.png 

Teraz musimy pobrać (pull) nasze pliki – robimy to wybierając odpowiednią pozycję z menu przy czym zmieniamy Remote na nasz nowododany – CMS. Po wybraniu ok ściągają nam się pliki z CMSa.

9_project.png 

Popatrzmy teraz na strukturę naszego projektu.

10_project.png 

Jak widać i nasz plik readme.txt (PROJECT) jak i reszta z CMS jest tutaj widoczna!

 

Teraz pracujemy sobie jak gdyby nic z naszym projektem, ale nagle musimy coś dodać (jakiś fix, nową funkcjonalność ). Więc wracamy do naszego CMS. Utworzyłem nowy katalog i dodałem do niego 2 pliki.

11_cms.png 

Teraz standardowo comit i push.

 

A teraz wracamy do PROJECTu. Wybieramy opcję pull z menu kontekstowego Tortoise’a przy czym Remote ustawiamy na cms.

12_cms.png 

Po kliknięciu OK czekamy na pobranie i możemy sprawdzić.

13_project.png

14_project.png

 

Gotowe :) Prawie…. Mamy to na lokalnym repo!

Musimy to wrzucić, więc robimy push, gdzie remote to origin.

15_project.png 

Minus takiego rozwiązania – z poziomu PROJECTu nie możemy aktualizować plików w CMS. Dlatego to rozwiązanie zadowala mnie w 70% :)

 

Jest jednak pewna możliwość aktualizacji. Jako że pisałem to na podstawie Tortoise, jest rozwiązanie z poziomu konsoli (nie testowałem go):

  1. git rebase -i
  2. git push <remotename> <commit SHA>:<remotebranchname>

gdzie commit SHA to nasz ostatni commit, który chcemy wrzucić na zdalne repo.

Zostało to opisane tutaj:
http://stackoverflow.com/questions/3230074/git-pushing-specific-commit

Mi jednak 70% w zupełności wystarczy :)