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.