2. témakör · Helyi munka: az első commitok · 9. fejezet
Nem minden fájl való a repóba. A letöltött csomagok, a fordítás kimenete, a naplófájlok és főleg a
jelszavak kimaradnak. Ebben a fejezetben megtanulod, hogyan mondod meg a Gitnek a
.gitignore fájllal, mit hagyjon figyelmen kívül, és mit tegyél, ha valami már bekerült.
.gitignore fájlt, és ismered a minták szabályait: *, / a végén és az elején, **, !.dotnet new gitignore).git rm --cached), és tudod, mi a teendő, ha titok került a repóba.git status --ignored, git check-ignore -v, és ugyanezt a Desktopban.Az alapelv: a repóba az kerül, amit ember ír (forráskód, képek, dokumentáció, beállítások), és amiből a projekt bármelyik gépen újra előállítható. Ami ebből gépi úton keletkezik, ami csak a te gépedre tartozik, vagy ami titok, az kimarad.
| Mi? | Példák | Miért marad ki? |
|---|---|---|
| Függőségek | node_modules/, vendor/, packages/ |
Hatalmas (akár több száz MB), és a package.json alapján az npm install bárhol újra letölti. |
| Build-kimenet | bin/, obj/ (C#), dist/, build/, *.exe |
A forráskódból fordítással keletkezik, minden fordításkor változik, és ütközéseket okoz. |
| Titkok | .env, jelszavak, API-kulcsok, tanúsítványok |
Aki látja a repót, látja a jelszót is. Egy nyilvános repóból automata programok percek alatt kigyűjtik. |
| Naplók, ideiglenes fájlok | *.log, *.tmp, *.cache |
Futás közben keletkeznek, és semmi közük a forráshoz. |
| Szerkesztő és rendszer fájljai | .vs/, .idea/, Thumbs.db, .DS_Store, desktop.ini |
A te gépedhez és programodhoz tartoznak, a csapattársaidnak zavaróak. |
A package-lock.json (C#-ban a packages.lock.json) gépi úton készül, mégis a
repóba való: ez rögzíti a csomagok pontos verzióját, így mindenki ugyanazt telepíti.
Egy webes és egy C#-os projekt fájljai. Döntsd el mindegyikről!
A .gitignore egy egyszerű szövegfájl, általában a repó gyökerében. Minden sora egy
minta: az ennek megfelelő, még nem követett fájlokat a Git nem mutatja a git status-ban,
és a git add . sem veszi fel őket. A .gitignore-t magát commitolni kell,
hogy a csapat minden tagjánál ugyanúgy működjön.
# Függőségek node_modules/ # Build-kimenet dist/ # Naplók *.log # Titkok, de a minta maradhat .env !.env.example # Rendszerfájlok Thumbs.db
Létrehozás parancssorból (PowerShell):
PS> "node_modules/" | Set-Content .gitignore PS> Add-Content .gitignore "*.log" PS> code .gitignore # vagy a VS Code-ban
Utána commitold a többi fájllal együtt:
PS> git add .gitignore PS> git commit -m "chore: .gitignore"
1. A fájlnév. A neve pontosan .gitignore: ponttal kezdődik, és nincs kiterjesztése.
A Jegyzettömb szívesen ment .gitignore.txt-t (a Fájlkezelő ezt el is rejti, ha ki van kapcsolva a
kiterjesztések mutatása). Ezt a Git nem olvassa. Készítsd a VS Code-ban vagy parancssorból!
2. A kódolás. A Windows PowerShell 5.1 > és >> jele
UTF-16 kódolású fájlt ír, ezt a Git nem érti, a minták hatástalanok lesznek. Használd a
Set-Content / Add-Content parancsot vagy a VS Code-ot. (A szimulátor ezt is jelzi.)
| Minta | Mire illeszkedik? | Példa, amit kizár |
|---|---|---|
debug.log | ilyen nevű fájl vagy mappa bármelyik mappában | debug.log, src/debug.log |
*.log | * = bármennyi karakter (a / kivételével) | app.log, logs/hiba.log |
kep?.png | ? = pontosan egy karakter | kep1.png, de nem kep10.png |
*.[oa] | […] = a felsorolt karakterek egyike | main.o, lib.a |
build/ | a / a végén: csak mappa, bármelyik szinten, a teljes tartalmával | build/, app/build/, de egy build nevű fájlt nem |
/config.json | a / az elején: csak a .gitignore mappájában | config.json, de nem src/config.json |
doc/*.pdf | ha középen van /, az útvonal a .gitignore helyétől számít | doc/a.pdf, de nem doc/2026/a.pdf |
doc/**/*.pdf | ** = bármennyi mappaszint (akár nulla) | doc/a.pdf, doc/2026/09/a.pdf |
!fontos.log | ! = kivétel: egy korábbi minta hatását visszavonja | (a fontos.log mégis bekerül) |
# megjegyzés | a #-tel kezdődő és az üres sorokat a Git kihagyja | — |
*.log után álló !fontos.log működik, fordított sorrendben nem.logs/ mappa ki van zárva, a
!logs/fontos.log hatástalan, mert a Git bele sem néz a mappába. Megoldás:
logs/* (a mappa tartalma), majd !logs/fontos.log./, Windowson is. A kis- és nagybetűt a windowsos Git nem különbözteti meg..gitignore csak a még nem követett fájlokra hat. Ami már commitolva van, azt a Git továbbra is követi (6. szakasz).Írd a mintákat a bal oldali mezőbe! Jobb oldalt azonnal látszik, melyik fájl marad ki, és melyik sor zárta ki
(ugyanezt mutatja a valódi git check-ignore -v). Oldd meg a feladványokat, vagy kísérletezz szabadon!
Nem kell fejből tudni, mit hagy maga után egy Node.js-, C#- vagy Python-projekt. Mindegyikhez van bevált sablon:
github.com/github/gitignore repóban van, pl. Node.gitignore, VisualStudio.gitignore.dotnet new gitignore, ez a Visual Studio-sablont teszi a mappába.
A Visual Studio új projekt vagy új Git-repó létrehozásakor magától is készít egyet.gitignore.io oldalon (ma a Toptal üzemelteti) összeválogathatod, pl. Node, VisualStudioCode, Windows.Node.js / webes projekt (részlet)
node_modules/ dist/ build/ .env .env.*.local npm-debug.log* *.log .vscode/* !.vscode/extensions.json
C# / Visual Studio (részlet)
[Bb]in/ [Oo]bj/ .vs/ *.user *.suo [Dd]ebug/ [Rr]elease/ packages/ TestResults/
A [Bb]in/ a bin/ és a Bin/ mappára is illeszkedik. A
.vscode/* + !.vscode/extensions.json pár a mappa tartalmát kizárja, egyetlen
közös fájlt viszont megtart. A sablon csak kiindulópont, nyugodtan bővítsd a projekted saját fájljaival.
A leggyakoribb meglepetés: beírod a .gitignore-ba a *.log-ot, de a
debug.log továbbra is ott van a git status-ban. Az ok: ezt a fájlt
korábban már commitoltad, a Git tehát követi, a .gitignore pedig csak a követetlen fájlokra hat.
debug.log-ot.*.log, de a status továbbra is modified-ot ír.git rm --cached debug.log: kikerül az indexből, a lemezen megmarad.git commit -m "chore: debug.log kivétele a repóból". Innentől ignorált.PS> git rm --cached debug.log rm 'debug.log' PS> git rm -r --cached node_modules # egy egész mappa: -r PS> git commit -m "chore: generált fájlok kivétele a repóból"
A git rm debug.log (--cached nélkül) a fájlt a lemezről is törli. Ha
csak a követésből akarod kivenni, a --cached kötelező.
A git rm --cached után a fájl a következő commitokból hiányzik, de a régiekben benne marad,
és a git show-val előhozható. Egy óriási mappánál ez csak helyet foglal, egy jelszónál viszont
komoly baj (7. szakasz). A csapattársaknál a következő git pull (18. fejezet) törli a fájlt a munkakönyvtárból,
ezért szólj nekik előre.
A jelszavakat, API-kulcsokat, adatbázis-elérést soha nem írjuk a forráskódba és nem commitoljuk. A bevált
módszer: a titkok egy .env fájlba kerülnek, amely ignorált, mellé pedig egy
.env.example kerül a repóba, a kulcsok nevével, értékek nélkül. Így a csapattárs tudja, mit kell kitöltenie.
.env — kimarad (ignorált)
DB_HOST=localhost DB_JELSZO=Titok123! API_KULCS=sk_live_51Hx…
.env.example — a repóba kerül
DB_HOST=localhost DB_JELSZO= API_KULCS=
C#-ban ugyanerre való a User Secrets (dotnet user-secrets set "Db:Jelszo" "…"), amely a projekten kívül, a
felhasználói profilodban tárolja a titkokat.
1. Azonnal tedd érvénytelenné (kérj új kulcsot, változtasd meg a jelszót). Ez a legfontosabb lépés. A feltöltött titkot kompromittáltnak kell tekinteni: egy nyilvános repóban automaták percek alatt megtalálják.
2. Utána vedd ki a követésből (git rm --cached .env), tedd a .gitignore-ba, és commitold.
Ez önmagában nem elég, mert a régi commitokban a titok továbbra is olvasható. A történetből eltávolítani csak
speciális eszközökkel lehet, és ez minden csapattagot érint. Ezért az érvénytelenítés az igazi megoldás.
A GitHub push protection és secret scanning funkciója sok ismert kulcsformátumot felismer, és már a feltöltéskor figyelmeztet vagy megállít. Erre azért ne építs!
| Hol? | Kire vonatkozik? | Mire jó? |
|---|---|---|
.gitignore a gyökérben | mindenkire (commitolva) | a projekt közös szabályai: ez a fő hely |
.gitignore egy almappában | mindenkire, csak abban a mappában és alatta | pl. docs/.gitignore a dokumentáció saját ideiglenes fájljaira |
.git/info/exclude | csak rád, ebben az egy repóban | saját jegyzetek, próbafájlok, amelyekről a csapatnak nem kell tudnia |
globális fájl (core.excludesFile) | csak rád, minden repódban | a saját gépedre jellemző szemét: Thumbs.db, desktop.ini, a szerkesztőd fájljai |
PS> "Thumbs.db" | Set-Content ~\.gitignore_global PS> git config --global core.excludesFile ~/.gitignore_global
A Git fájlokat követ, mappákat nem: egy üres mappa nem kerül a repóba. Ha mégis kell (pl. egy
uploads/ mappa, amelybe futás közben kerülnek fájlok), tegyél bele egy üres
.gitkeep fájlt. Ez nem Git-parancs, csak egy elterjedt szokás. Ha a mappa tartalmát ignorálnád, a fájl maradjon kivétel:
uploads/* !uploads/.gitkeep
| Parancs | Mit tud? |
|---|---|
git status --ignored | a szokásos állapot mellett az ignorált fájlokat is listázza |
git check-ignore -v .env | megmondja, melyik fájl hányadik sora zárja ki: .gitignore:11:.env |
git ls-files | a követett fájlok listája: itt látszik, ha valami már bekerült |
git add -f fájl | egy ignorált fájl felvétele „erővel”, kivételesen (utána követett lesz) |
| Tünet | Valószínű ok | Megoldás |
|---|---|---|
| a fájl modified-ként látszik | már követett | git rm --cached + commit |
| semmilyen minta nem hat | a fájl neve .gitignore.txt, vagy rossz mappában van | átnevezés; ls -Force megmutatja a valódi nevet |
| semmilyen minta nem hat | UTF-16 kódolás (PowerShell >) | újraírás Set-Content-tel vagy VS Code-ban (jobb alsó sarok: UTF-8) |
a !kivétel nem működik | a szülőmappa ki van zárva, vagy a kivétel a kizáró sor előtt áll | mappa/* + !mappa/fájl, a kivétel kerüljön a végére |
| egy almappa fájlja nem marad ki | a minta /-rel kezdődik, így csak a gyökérre vonatkozik | a kezdő / elhagyása vagy **/ |
.gitignore módosításként megjelenik a listában: commitold!.gitignore-t..gitignore legyen UTF-8..gitignore, megjelenik a
Choose .gitignore template választó..env és a hasonló titkok feltöltésére a push protection figyelmeztethet.A hazi-app Node.js-projektben rendetlenség van: letöltött csomagok, fordított fájl, jelszavas
.env, és egy korábban véletlenül commitolt naplófájl. Rakj rendet! A .gitignore-t így
írhatod: "node_modules/" | Set-Content .gitignore, majd soronként bővítheted:
Add-Content .gitignore "dist/". A cat .gitignore megmutatja a tartalmát.
⭐ alap · ⭐⭐ haladó · ⭐⭐⭐ kihívás
A saját repódban készíts .gitignore-t, amely kizárja a *.log fájlokat és a
temp/ mappát! Hozz létre egy proba.log-ot és egy temp/a.txt-t,
majd hasonlítsd össze a git status és a git status --ignored kimenetét.
Nyisd meg a github/gitignore repóban a Node.gitignore és a
VisualStudio.gitignore fájlt! Keress bennük három olyan mintát, amelyet a fejezet táblázata alapján el tudsz magyarázni, és egyet, amelyiket nem.
Oldd meg a Minta-tesztelő mind az öt feladványát úgy, hogy egyiknél sem nézed meg a megoldást!
Commitolj egy jegyzet.log fájlt, utána írd a *.log-ot a
.gitignore-ba, és módosítsd a fájlt. Mit mutat a status? Vedd ki a követésből úgy, hogy a lemezen megmaradjon, és ellenőrizd a
git ls-files és a git check-ignore -v jegyzet.log paranccsal.
A GitHub Desktopban hozz létre egy debug.log fájlt, és a Changes listában jobb klikkel add a
.gitignore-hoz („Ignore all .log files”)! Nézd meg a Repository settings → Ignored files fület, és commitold a változást.
Egy C#-os konzolprojektben (dotnet new console) futtasd a dotnet new gitignore-t, majd a
dotnet build-et! Ellenőrizd, hogy a bin/ és az obj/ nem jelenik meg a statusban.
Készíts egy kis Node.js-projektet, amely egy .env-ből olvas be egy „titkot”! A repóban legyen
.env.example és README-leírás arról, hogyan kell kitölteni. Egy társad klónozza, és próbálja elindítani csak a README alapján.
Az egyválasztós kérdéseknél kattints a válaszra. A többválasztósaknál jelöld be az összes helyeset, majd nyomd meg az Ellenőrzés gombot.
| Fogalom | Jelentés |
|---|---|
.gitignore | szövegfájl a mintákkal, amelyekre illeszkedő, még nem követett fájlokat a Git figyelmen kívül hagy |
| minta (pattern) | a .gitignore egy sora: *.log, build/, /config.json … |
| ignorált fájl | a mintára illeszkedő fájl: nem látszik a statusban, és az add . kihagyja |
kivétel (!) | egy korábbi minta hatásának visszavonása egy fájlra |
| függőség | letöltött külső csomag (node_modules/); a leírója (package.json) kerül a repóba |
| build-kimenet | fordítással keletkező fájlok (bin/, obj/, dist/) |
.env / .env.example | titkok helyi fájlja (ignorált) / a kitöltendő kulcsok mintája (a repóban) |
git rm --cached | fájl kivétele a követésből úgy, hogy a lemezen megmarad |
git check-ignore -v | megmutatja, melyik minta zár ki egy fájlt |
.git/info/exclude | csak helyben érvényes kizárási lista (nem kerül a repóba) |
core.excludesFile | globális, minden repódra érvényes kizárási fájl beállítása |
.gitkeep | üres „helyőrző” fájl, hogy egy üres mappa is bekerüljön a repóba |
.gitignore a gyökérben van, soronként egy minta, és commitolni kell. Sablonból érdemes indulni.*, ?, mappa/ (csak mappa), /gyoker (csak a gyökérben),
** (bármennyi szint), !kivétel. Az utolsó illeszkedő minta dönt..gitignore csak a követetlen fájlokra hat. Ami már bekerült: git rm --cached + commit.git status --ignored, git check-ignore -v.A következő fejezetben megtanuljuk visszavonni a változásokat: restore, reset,
revert és --amend.