1/27/2013

Submoduły na github.com

Submoduły

Submoduły, czyli co zrobić, żeby np. na githubie w jednym repo umieścić inne repozytoria, aby wyglądało to tak jak poniżej, a nie tak jak na przykład tutaj.


Do czego się w ogóle przydają submoduły i dlaczego powinieneś je stosować? Wyobraź sobie, że tworzysz swoje repozytorium, które do poprawnej pracy wymaga innych, konkretnych repozytoriów gita. I tutaj z pomocą przychodzą submoduły. Dzięki nim twoje repozytorium będzie posiadało informacje o tym, gdzie dany submoduł się znajduje (jego adres) oraz jego ostatnie commit ID.

Dzięki takiemu zabiegowi, inni developerzy, którzy sklonują twoje repo (które wykorzystuje inne repozytoria), nie będą musieli się martwić, czy wszystko będzie działało tak jak powinno. Unikniesz przez to czasami dziwnych błędów. Np. ktoś dociągnie zbyt stare repozytorium lub zbyt nowe, albo całkowicie inną gałąź, niż tą które wykorzystuje twoje repo ;)

Osobiście póki co, użyłem submodułów w moim repo dotfiles.

Dodawanie submodułów

Załóżmy, że chcesz dodać jako submoduł repozytorium hubble, wystarczy wykonać komendę:
git submodule add https://github.com/jaymedavis/hubble.git
I to tyle, jeśli chodzi o dodawanie submodułów.

Klonowanie repozytorium z submodułami

Powiedzmy, że chcesz sklonować moje repozytorium ;) dotfiles, które posiada kilka submodułów. Repo klonujesz normalnie, jak każde inne. Po sklonowaniu jednak submoduły są puste, nic w nich nie ma, nie panikuj! Wystarczy wpisać dwie poniższe komendy:
git submodule init
git submodule update
W ten sposób git dociągnie wszystkie wymagane submoduły. Jeżeli autor repozytorium, które sklonowałeś, ustawił, że dany submoduł ma być w danej wersji, git sobie z tym poradzi i dociągnie dokładnie tą wersję. Jeżeli autor nie użył by submodułów mógłbyś mieć problem, bo skąd masz wiedzieć, jaką wersję danego repo masz sklonować?

Usuwanie submodułów

Z usuwaniem może być czasami trochę problemów. Najlepiej jest to zrobić w ten sposób:
  1. Usuwasz odpowiednią sekcję z pliku .gitmodules oraz .git/config
  2. Wykonujesz komendę git rm --cached ścieżka_do_submodułu (bez ukośników)
  3. Commitujesz i usuwasz nieśledzony już moduł
I to tyle ile wystarczy wiedzieć o submodułach na początek. Więcej informacji znajdziesz w dokumentacji.