- COMP.CS.140
- 10. Työnjako ja tiimityöskentely
- 10.1 Työnjako
- 10.1.3 Tekninen näkökulma: Submoduulit Gitissä
Tekninen näkökulma: Submoduulit Gitissä¶
On tavallista, että projektin aikana huomataan, että projektissa tarvitsee käyttää toisen projektin koodia. Tällaisia tilanteita ovat esimerkiksi toisten kehittämät kirjastot tai tilanne, jossa projektin toteuttaminen on useamman koodarin vastuulla ja tehdään toisista erillään. Tarvitaan siis kaksi toisistaan erillään olevaa projektia, mutta samalla toiselle mahdollisuus käyttää toista.
Git ratkaisee tilanteen submoduuleilla. Submoduulit mahdollistavat yhden Git repositorion sijoittamisen toisen gitrepositorion alihakemistoksi. Näin saadaan toinen projekti kloonattua osaksi omaa projektia, mutta samalla commit-historiat pysyvät siististi erillään. Submoduulin tietovarastossa olevia asioita voidaan siis kehittää täysin erillään päätietovarastosta, mutta se käyttäytyy samalla tavoin kuin mikä tahansa muukin tietovarasto.
Submodulet käytännössä¶
Omaan repositorioon saa lisättyä submodulen komennolla git submodule add URL <polku>
.
Komento siis kloonaa submoduulin annetusta urlista määriteltyyn polkuun.
Kannattaa kuitenkin huomioida, että submodulen lisääminen luo uuden tiedoston .gitmodules
.
Tämän tiedoston tehtävä on tallettaa tieto siitä, miten repositoriot sijoittuvat.
Tämä tiedosto on versionhallinnan alla.
Submoduleja sisältävän projektin kloonaaminen¶
Kun kloonaat projektin, jossa on submodule (tai useita), et saa submoduleissa sijaitsevia tiedostoja itsellesi, vaikka saatkin submodulen hakemiston.
Tiedostot saadaksesi, sinun pitää ajaa kaksi komentoa git submodule init
ja git submodule update
.
Ensimmäinen alustaa paikallisen konfiguraatiotiedostosi ja jälkimmäinen hakee submodulen sisällön. Esimerkiksi:
git clone tietovaraston-URL
cd <tietovarasto>
git submodule init
git submodule update
Helpompi ja siten suositeltava tapa on käyttää kloonamisen yhteydessä lisävipua --recurse-submodules
, jolloin alustus ja sisällön päivittäminen tapahtuu automaattisesti ja rekursiivisesti
eli jos submoduulissa itsessään on submoduuleja, nekin päivittyvät.
git clone --recurse-submodules tietovaraston-URL
Submoduulit ja projektin eteneminen¶
Työn edetessä submoduuliin tulleet uudet päivitykset pitää tasaisin väliajoin hakea itselle käyttöön. On kuitenkin keskeistä tiedostaa, että päätietovarastossa määritetään, mikä submoduulin commit tai haara on käytössä. Voi siis olla tilanteita, jossa submoduuli tulee asettaa johonkin tiettyyn versioon tai seuraamaan jotain tiettyä tietovaraston haaraa. Näin voidaan varmistua, ettei submoduulin projektissa mahdollisesti tapahtuvat muutokset aiheuta odottamattomia muutoksia päätietovarastossa.
Submoduulin päivittäminen tapahtuu komennolla
git submodule update --remote <submoduuli>
Oletusarvoisesti komento olettaa, että submoduulista halutaan hakea main
. Tämän voi määrittää .gitmodules-tiedostoon komennolla
git config -f .gitmodules submodule.submoduulin_nimi.branch <haara>
Koska submoduuli on tietovarasto tietovarastossa, sitä voi päivittää myös aivan normaalina tietovarastona siirtymällä sen kansioon ja ajamalla git fetch
ja git merge
normaalisti.
Lisätietoa¶
Lisää submoduleista löydät esim. Git bookista. Submodule-dokumentaatio on saatavilla: https://git-scm.com/docs/git-submodule.