6.1 .gitignore

V každom projekte postupne vznikajú súbory, ktoré do repozitára vôbec nechceme dostať - zložka node_modules s tisíckami súborov, skompilované .class alebo .exe súbory, nastavenia tvojho IDE, alebo dokonca súbor so secret API kľúčom. Ak by sme spustili git add . bez rozmýšľania, všetky tieto súbory by sa nám ochotne pridali do repozitára spolu s tými, ktoré tam skutočne patria.

Secret kľúč môže byť napríklad tvoj kľúč do ChatGPT API, kde ťa chargujú podľa množstva použitých tokenov. Akonáhle tvoj kľúč unikne, 10000 rusov bude non-stop tento kľúč používať a o mesiac ti príde faktúra na niekoľko stoviek tisíc. Až také drastické prípady som nezažil, ale odstavenie leaknutých kľúčov je skutočne pain in the ass.

Príklad problému

  1. Vytvoríš si projekt v CLion, ktoré si automaticky vytvorí priečinok .idea s tvojimi osobnými nastaveniami editora
  2. Skompiluješ projekt a vznikne priečinok cmake-build-debug, ktorý sa dá kedykoľvek znova vygenerovať zo zdrojového kódu
  3. Do súboru .env si uložíš prístupový kľúč k databáze

Ak by sa tieto súbory dostali do repozitára, kolega by ti pri git pull prepísal svoje vlastné nastavenia IDE, repozitár by zbytočne narástol o súbory, ktoré sa dajú kedykoľvek znova vygenerovať, a čo je najhoršie - tvoj tajný kľúč by sa dostal (často verejne) na GitHub.

Čo je súbor .gitignore

Dôležité: .gitignore je obyčajný textový súbor, v ktorom pomocou jednoduchých pravidiel (vzorov) povieme Gitu, ktoré súbory a priečinky má úplne ignorovať.

Súbor .gitignore sa zvyčajne umiestňuje do koreňového priečinka repozitára, teda tam, kde sa nachádza aj priečinok .git.

Ako .gitignore funguje

Každý riadok v .gitignore predstavuje jeden vzor. Akonáhle sa nejaký súbor v repozitári zhoduje s niektorým z týchto vzorov, Git ho prestane sledovať - nezobrazí sa v git status a ani git add . ho nepridá medzi staged súbory. Ak ale súbor do .gitignore pridáš až potom, čo si zavolal git add ., Git ho neodstráni z repozitára. Súbor musíš z gitu vypitvať sám.

Ukážkový obsah .gitignore súboru by mohol vyzerať takto:

# Zložka s knižnicami
node_modules/

# Skompilované súbory
build/
*.class

# Súbor špecifický pre operačný systém (macOS)
.DS_Store

# Citlivé údaje
.env

Základné pravidlá zápisu

  • subor.txt - ignoruje konkrétny súbor s týmto názvom, kdekoľvek sa v repozitári nachádza
  • priecinok/ - lomítko na konci znamená, že ide o celý priečinok (spolu so všetkým, čo sa v ňom nachádza)
  • *.log - hviezdička nahrádza ľubovoľný text, takto ignorujeme napríklad všetky súbory s príponou .log
  • # komentár - riadok začínajúci znakom # je komentár a Git ho ignoruje
  • !subor.txt - výkričník je výnimka - aj keď by súbor inak bol ignorovaný (napríklad kvôli vzoru vyššie), tento konkrétny chceme naďalej sledovať

Note: .gitignore ovplyvňuje iba súbory, ktoré Git ešte nesleduje (untracked). Ak už bol súbor predtým pridaný do repozitára (git add + git commit), pridanie do .gitignore ho automaticky neodstráni - na to existujú iné príkazy, ktorým sa budeme venovať neskôr.

Tip: Nemusíš vymýšľať .gitignore od nuly. Na stránke gitignore.io alebo v repozitári github/gitignore nájdeš hotové šablóny pre takmer každý programovací jazyk či nástroj (Java, Kotlin, Android, Node.js, …).