
Mikä on git hook? Tarkoitus, käyttö ja esimerkit
Oletko joskus huomannut työntäneesi rikkinäistä koodia versionhallintaan ja toivoneet, että joku olisi varoittanut etukäteen? Git-hookit ovat juuri tähän tarkoitukseen suunniteltuja automaattisia skriptejä, jotka tarkistavat koodin laadun ennen kuin se päätyy repositoryyn.
Git-koukkujen määrä: yli 20 eri tapahtumakoukkua ·
Yleisin käyttötarkoitus: commit-viestien tarkistus ennen tallennusta ·
Sijainti: .git/hooks -kansio ·
Oletustilassa aktiiviset koukut: 0 (esimerkkitiedostot)
Pikakatsaus
- Git-hookit ovat automaattisia skriptejä (Seravo tietopankki)
- Ne sijaitsevat .git/hooks -kansiossa (Pro Git Book)
- Koukut suoritetaan automaattisesti tiettyjen tapahtumien yhteydessä (Seravo tietopankki)
- Tarkkaa määrää eri koukkutyyppejä ei ole standardoitu Gitin eri versioissa
- Koukkujen yhteensopivuus eri käyttöjärjestelmien välillä voi vaihdella
- pre-commit -hook suoritetaan ennen commitin tallentamista (Seravo tietopankki)
- post-commit -hook suoritetaan heti commitin jälkeen (Pro Git Book)
- pre-push -hook tarkistaa koodin ennen etärepoon työntämistä (Seravo tietopankki)
- GitHub Actions ja GitLab CI/CD laajentavat koukkujen automaatiota
- Yhteisön kehittämät työkalut, kuten pre-commit framework, yksinkertaistavat hookien hallintaa
Viisi keskeistä tosiasiaa tiivistettynä: Git-hookit ovat joustava tapa hallita laadunvarmistusta suoraan versionhallinnan tasolla.
Faktojen tiivistys: Git-hookeja on yli 20 eri tyyppiä, ne sijaitsevat .git/hooks-kansiossa, ja niiden avulla voidaan automatisoida laadunvarmistus ennen kuin koodi päätyy repositoryyn.
| Ominaisuus | Tieto |
|---|---|
| Määritelmä | Git-hook on skripti, joka suoritetaan automaattisesti Git-tapahtuman yhteydessä (Seravo tietopankki) |
| Sijainti | .git/hooks -kansio jokaisessa Git-repositoriossa (Pro Git Book) |
| Tapahtumat | Yli 20 eri koukkua, kuten pre-commit, post-commit, pre-push (Git hooks documentation) |
| Koukkutyypit | Client-side-hookit (paikalliset) ja server-side-hookit (palvelinpuolen) (Pro Git Book) |
| Jakelu tiimille | Git ei kopioi hookeja push- tai pull-toimintojen yhteydessä (Seravo tietopankki) |
| Skriptikielet | Bash, Python, Ruby, Node.js tai mikä tahansa suoritettava skripti |
| Virheenkäsittely | Jos hook palauttaa virhekoodin, tapahtuma (esim. commit) keskeytyy (Seravo tietopankki) |
| Käyttötarkoitus | Laadunvarmistus, syntaksitarkistukset, testien ajo, commit-viestien validointi (Atlassian Git-tutoriaalit) |
Malli: Taulukko osoittaa, miten hookit kattavat sekä määritelmän, sijainnin että käytännön käyttötapaukset – jokainen rivi tuo oman palikkansa kokonaiskuvaan.
Mikä on git-hookin tarkoitus?
Git-hookin ydinajatus on yksinkertainen: se on automaattinen skripti, joka suoritetaan tietyn Git-tapahtuman yhteydessä. Kun kehittäjä tekee commitin, pushin tai mergen, Git tarkistaa ennalta määritellyt hookit ja suorittaa ne joko ennen tapahtumaa tai sen jälkeen. Tämä mahdollistaa työnkulun mukauttamisen ilman erillisiä ulkoisia työkaluja.
Git-hookit automaattisina skripteinä
- Hook-skripti voi olla mikä tahansa suoritettava tiedosto – yleisimmin Bash, Python tai Node.js (Pro Git Book)
- Git suorittaa hookin automaattisesti ilman kehittäjän erillistä toimintoa (Seravo tietopankki)
- Hookin paluuarvo määrää, jatkuuko tapahtuma vai keskeytyykö se
Koukkujen rooli laadunvarmistuksessa
Koukkujen tärkein käyttökohde on laadunvarmistus ennen kuin koodi päätyy versionhallintaan. Pre-commit-hook voi esimerkiksi tarkistaa koodin syntaksin, ajaa yksikkötestejä tai varmistaa, että commit-viesti noudattaa sovittua formaattia. Jos hook-skripti palauttaa virhekoodin, commit keskeytyy ja kehittäjä saa välittömän palautteen ongelmasta (Seravo tietopankki).
Tämä on huomattavasti tehokkaampaa kuin laadunvalvonta vasta CI/CD-putkessa, koska virheet havaitaan jo ennen kuin ne päätyvät jaettavaan repositoryyn.
Kehittäjä säästää aikaa, koska virheellinen koodi ei koskaan päädy muiden tiimiläisten nähtäväksi. Tiimi välttää turhat CI-ajot ja repositoryn historia pysyy siistinä ilman korjauskommitteja.
Käytännön seuraus: Hookien avulla laatuongelmat korjataan siellä, missä ne syntyvät – kehittäjän omalla koneella.
Mikä on hook GitHubissa?
GitHubissa termi “hook” viittaa kahteen eri asiaan: paikallisiin Git-hookeihin, jotka toimivat jokaisen kehittäjän omalla koneella, ja GitHubin omiin palvelinhookeihin, jotka reagoivat tapahtumiin GitHubin palvelimella. Molemmat palvelevat automaatiota, mutta toimivat eri tasoilla.
GitHubin koukkujen erityispiirteet
- GitHub tukee sekä asiakaspuolen (client-side) että palvelinpuolen (server-side) koukkuja (Pro Git Book)
- Palvelinkoukut, kuten pre-receive ja post-receive, toimivat GitHubin palvelimella push-tapahtuman yhteydessä (GitHub Docs – Webhooks)
- GitHub Webhooks mahdollistavat integraatiot ulkoisiin palveluihin, kuten CI/CD-järjestelmiin ja viestintätyökaluihin (Atlassian Git-tutoriaalit)
Yhteys paikallisiin ja palvelinkoukkuihin
Paikalliset hookit ovat täysin kehittäjän itsensä hallinnassa, eikä GitHub voi pakottaa niitä käyttöön. Palvelinhookit sen sijaan ovat repositoryn ylläpitäjän määriteltävissä ja pakottavia – ne suoritetaan ennen pushin hyväksymistä tai sen jälkeen. Esimerkiksi pre-receive-hook voi hylätä pushin, jos commit-viestit eivät täytä määriteltyjä vaatimuksia.
Käytännössä monet tiimit käyttävät molempia: paikalliset hookit varmistavat peruslaadun kehittäjän koneella, ja palvelinhookit toimivat viimeisenä tarkastuspisteenä ennen koodin päätymistä päähaaraan.
Paikallinen hook on kehittäjän oma turvaverkko. Palvelinhook on tiimin yhteinen portinvartija. Ilman palvelinhookeja kukaan ei voi pakottaa tiimin sääntöjä – ne ovat aina ohitettavissa paikallisella tasolla git commit -n-komennolla (Seravo tietopankki).
Keskeinen ero: Paikalliset hookit ovat vapaaehtoisia, palvelinhookit pakottavia – tämä raja määrittää, miten tiimi voi valvoa laatukäytäntöjään.
mistä löydän git-hookit?
Git-hookit sijaitsevat jokaisen Git-repositorion sisällä tietyssä hakemistossa. Ne ovat osa Gitin paikallista konfiguraatiota, eivätkä ne siirry versionhallinnan mukana.
.git/hooks -kansion rakenne
- Koukut sijaitsevat projektin
.git/hooks-kansiossa (Seravo tietopankki) - Kansio on jokaisessa Git-repositoriossa, mutta se on oletuksena tyhjä tai sisältää vain esimerkkitiedostoja
- Git ei kopioi hookeja automaattisesti push- tai pull-toimintojen yhteydessä (Seravo tietopankki)
Esimerkkitiedostojen tarkastelu
Kun alustat uuden Git-repositorion, .git/hooks-kansioon luodaan joukko esimerkkiskriptejä. Nämä tiedostot päättyvät .sample-tarkenteeseen, eivätkä ne ole aktiivisia. Voit tarkastella niitä avataksesi tiedoston tekstieditorissa – ne näyttävät, millainen skripti kunkin koukun kohdalla on tyypillisesti käytössä. Git luo hooks-hakemistoon esimerkkiskriptejä, joista monet ovat käyttökelpoisia sellaisenaan pienillä muutoksilla (Pro Git Book).
Esimerkkitiedostot eivät ole aktiivisia ennen kuin poistat .sample-päätteen ja asetat ne suoritettaviksi.
Käytännön neuvo: Jos haluat ottaa esimerkkitiedoston käyttöön, poista .sample-pääte ja anna sille suoritusoikeus – tämä on nopein tapa aloittaa.
Miten luon git-hookin?
Oman git-hookin luominen on yksinkertainen prosessi, joka koostuu kolmesta vaiheesta. Tässä on konkreettinen esimerkki commit-viestin tarkistuksesta.
Vaihe 1: Skriptin luominen ja nimeäminen
- Hook-tiedosto nimetään tapahtuman mukaan, esimerkiksi
pre-committaicommit-msg(Pro Git Book) - Tiedosto sijoitetaan
.git/hooks-kansioon - Skripti voi olla mikä tahansa suoritettava tiedosto – yleisimmin Bash
Esimerkki yksinkertaisesta pre-commit-hookista Bashilla:
#!/bin/bash
echo "Tarkistan koodin ennen commitia..."
# Tässä voisi ajaa esimerkiksi syntaksitarkistuksen
if [ -f "package.json" ]; then
npm run lint || exit 1
fi
Vaihe 2: Suoritusoikeuksien asettaminen
- Tiedostolle on asetettava suoritusoikeus komennolla
chmod +x .git/hooks/pre-commit(Seravo tietopankki) - Ilman suoritusoikeutta Git ohittaa hookin hiljaisesti
- Suoritusoikeus on asetettava jokaisella koneella erikseen, koska hookit eivät siirry versionhallinnassa
Vaihe 3: Esimerkki commit-viestin tarkistuksesta
Commit-msg-hookilla voit varmistaa, että commit-viestit noudattavat tiettyä muotoa. Alla oleva skripti hylkää commitin, jos viesti on lyhyempi kuin 10 merkkiä:
#!/bin/bash
commit_msg=$(cat "$1")
if [ ${#commit_msg} -lt 10 ]; then
echo "Virhe: commit-viestin on oltava vähintään 10 merkkiä pitkä."
exit 1
fi
Tämä on hyödyllinen tapa varmistaa, että kaikki commitit sisältävät kuvaavat viestit ilman erillistä muistuttelua.
Miten tämä auttaa: Kehittäjä saa välittömän palautteen, jos commit-viesti on liian lyhyt, mikä parantaa repositoryn historian luettavuutta.
Miten git-hook suoritetaan?
Git-hookin suoritus on täysin automaattista – kun olet määritellyt hookin oikein, Git hoitaa loput. Koukku suoritetaan automaattisesti ennen tai jälkeen tapahtuman riippuen koukun tyypistä (Pro Git Book).
Automaattinen suoritus tapahtuman yhteydessä
- Pre-commit-hook suoritetaan ennen commitin tallentamista (Seravo tietopankki)
- Post-commit-hook suoritetaan heti onnistuneen commitin jälkeen
- Pre-push-hook tarkistaa koodin ennen etärepoon työntämistä
- Koukku suoritetaan aina, kun vastaava tapahtuma käynnistetään – sitä ei tarvitse erikseen kutsua
Koukun testaaminen ja virheiden käsittely
Hook-skriptejä voidaan testata ajamalla ne suoraan komentoriviltä: .git/hooks/pre-commit. Tämä on nopein tapa varmistaa, että skripti toimii odotetusti ennen kuin luotat siihen oikeissa tilanteissa (Seravo tietopankki).
Jos hook epäonnistuu ja palauttaa virhekoodin, Git keskeyttää tapahtuman ja näyttää hookin tuottaman virheviestin. Kehittäjä voi korjata ongelman ja yrittää uudelleen. Tarvittaessa hookin voi ohittaa tilapäisesti komennolla git commit -n -m "Viesti" (Seravo tietopankki).
Hookin ohittaminen -n-lipulla on kätevä hätätilanteissa, mutta toistuva ohittaminen heikentää koukkujen hyötyä. Tiimin säännöt kannattaa määritellä palvelinhookeissa, joita ei voi ohittaa paikallisesti.
Käytännön seuraus: Jos hookia ohitetaan jatkuvasti, se on merkki siitä, että säännöt kannattaa siirtää palvelinpuolelle.
Vahvistetut faktat
Vahvistetut faktat
- Git-hookit ovat skriptejä, jotka suoritetaan automaattisesti Git-tapahtumien yhteydessä (Seravo tietopankki)
- Ne sijaitsevat .git/hooks -kansiossa jokaisessa repositoriossa (Pro Git Book)
- Koukut suoritetaan automaattisesti ennen tai jälkeen tapahtuman (Seravo tietopankki)
- Gitissä on sekä client-side- että server-side-hookeja (Pro Git Book)
- Koukkua varten tiedostolle on asetettava suoritusoikeus (Seravo tietopankki)
Käytännön esimerkkejä ja lainauksia
Git-hookit ovat skriptejä, jotka suoritetaan automaattisesti tiettyjen tapahtumien yhteydessä. Ne mahdollistavat työnkulun mukauttamisen ja laadunvarmistuksen suoraan versionhallinnan tasolla.
Gitissä on laaja valikoima hookeja, jotka voidaan jakaa kahteen pääryhmään: client-side-hookit, jotka toimivat paikallisesti commit- ja merge-toiminnoissa, ja server-side-hookit, jotka toimivat verkkotoiminnoissa kuten pushin vastaanotossa.
Pro Git Book (Scott Chacon ja Ben Straub)
Hookeja käytetään laadunvalvontaan, esimerkiksi estämään syntaksivirheitä sisältävän koodin päätyminen Git-repoon. Tämä säästää aikaa ja pitää repositoryn historian siistinä.
Seravo tietopankki (WordPress-palveluntarjoaja)
Git on hajautettu versionhallintajärjestelmä, jonka kehityksen aloitti Linus Torvalds Linuxin ytimen kehitystä varten. Sen joustava hook-järjestelmä on olennainen osa Gitin muokattavuutta.
Git-hookit ovat osoittautuneet erityisen arvokkaiksi tiimeille, jotka haluavat varmistaa koodin laadun ilman, että jokaisen commitin kohdalla tarvitsee manuaalisesti tarkistaa sääntöjen noudattamista. Ne eivät korvaa CI/CD-putkea, mutta täydentävät sitä toimimalla ensimmäisenä tarkastuspisteenä kehittäjän omalla koneella. Suomenkielisille kehittäjille koukkujen käyttöönotto madaltaa kynnystä automatisoida työnkulkua – ilman että tarvitsee turvautua monimutkaisiin ulkoisiin työkaluihin.
book.sovelluskontti.com, ohshitgit.com, youtube.com, tkt-lapio.github.io
Jos haluat nähdä lisää git-hookien käytännön esimerkkejä, kannattaa tutustua hollanninkieliseen oppaaseen, joka avaa aihetta konkreettisten esimerkkien kautta.
Usein kysytyt kysymykset
Voiko git-hookin poistaa käytöstä?
Kyllä. Voit poistaa hookin käytöstä joko poistamalla tiedoston .git/hooks-kansiosta tai nimeämällä sen uudelleen. Jos haluat ohittaa hookin tilapäisesti, käytä git commit -n-lippua (Seravo tietopankki).
Mitä tapahtuu, jos git-hook epäonnistuu?
Jos hook-skripti palauttaa virhekoodin (muun kuin 0), Git keskeyttää tapahtuman. Saat virheviestin, jonka hook on tuottanut, ja voit korjata ongelman ennen uutta yritystä (Seravo tietopankki).
Ovatko git-hookit pakollisia?
Git ei pakota hookien käyttöä. Ne ovat täysin vapaaehtoisia työkaluja, jotka kehittäjä tai tiimi ottaa käyttöön omien tarpeidensa mukaan. Palvelinhookit voivat kuitenkin olla pakottavia, jos repositoryn ylläpitäjä on määritellyt ne (Pro Git Book).
Toimiiko git-hook kaikissa käyttöjärjestelmissä?
Kyllä, git-hookit toimivat kaikissa käyttöjärjestelmissä, joissa Git on saatavilla (Linux, macOS, Windows). Skriptien on kuitenkin oltava yhteensopivia käyttöjärjestelmän kanssa – esimerkiksi Bash-skriptit toimivat Linuxissa ja macOS:ssä, mutta Windowsissa tarvitaan PowerShell tai WSL.
Miten git-hookin virheilmoituksia käsitellään?
Hook-skripti tulostaa virheilmoitukset suoraan komentoriville. Jos skripti palauttaa nollasta poikkeavan paluuarvon, Git näyttää hookin tuottaman tulosteen ja keskeyttää tapahtuman. Virheilmoituksen muotoilu on täysin skriptin kirjoittajan vastuulla.
Miten jaan hookit tiimilleni?
Koska Git ei kopioi hookeja automaattisesti, tiimin hookit kannattaa tallentaa projektin juureen omaan hakemistoon (esim. .githooks/) ja konfiguroida Git käyttämään tätä hakemistoa komennolla git config core.hooksPath .githooks. Vaihtoehtoisesti voit käyttää pre-commit-työkalua, joka hallinnoi hookeja keskitetysti.
Voinko käyttää JavaScriptiä hook-skripteinä?
Kyllä. Git-hookit voivat olla mitä tahansa suoritettavia tiedostoja. Jos haluat käyttää JavaScriptiä, lisää #!/usr/bin/env node skriptin alkuun ja varmista, että tiedosto on suoritettava.