.gitignore — qaysi fayllarni kuzatmaslik, shablonlar, global gitignore

~15 daq · Git · Git Asoslari

Muammodan boshlaylik

Yangi Node.js loyihasida npm install qildingiz va:

git status
Untracked files:
        .env
        .DS_Store
        node_modules/
        dist/
        npm-debug.log
        .vscode/

node_modules — 40 000 fayl, 300 MB. .env — baza paroli va API kalitlari. dist/ — build natijasi, har safar qayta yaratiladi. .DS_Store — macOS ning keraksiz fayli.

Bularning hech biri repozitoriyga kirmasligi kerak. Lekin git status ularni har safar ko'rsatadi, va git add . ularni qo'shib yuboradi. Yechim — .gitignore.


.gitignore nima?

Loyiha ildizidagi oddiy matnli fayl. Har bir qator — Git e'tiborsiz qoldirishi kerak bo'lgan fayl yoki naqsh:

# Bog'liqliklar
node_modules/

# Muhit o'zgaruvchilari — SIRLAR
.env
.env.local

# Build natijalari
dist/
build/

# Loglar
*.log

# OS fayllari
.DS_Store
Thumbs.db

# Muharrir sozlamalari
.vscode/
.idea/

Endi:

git status
Untracked files:
        .gitignore

Faqat .gitignore ning o'zi. Uni commit qiling — jamoadagi hamma bir xil qoidalardan foydalansin.


Naqsh sintaksisi

Naqsh Nimaga mos keladi
fayl.txt Istalgan joydagi fayl.txt
/fayl.txt Faqat ildizdagi fayl.txt
papka/ Istalgan joydagi papka nomli papka
*.log Barcha .log fayllar
temp* temp bilan boshlanadiganlar
?.txt a.txt, 1.txt (bitta belgi)
**/logs Istalgan chuqurlikdagi logs
docs/**/*.pdf docs ichidagi barcha PDF lar
!muhim.log Istisno — e'tiborsiz qoldirmaslik
# ... Izoh

Istisnolar

# Barcha .env fayllarni yashirish...
.env*

# ...lekin namunani saqlash
!.env.example

.env.example — haqiqiy qiymatlarsiz namuna: yangi dasturchi nima sozlash kerakligini biladi:

# .env.example
DATABASE_URL=mysql://user:parol@localhost:3306/dokon
JWT_SECRET=
PAYME_KEY=

[!WARNING] Agar papka butunlay e'tiborsiz qoldirilgan bo'lsa (logs/), uning ichidagi faylni ! bilan qaytarib bo'lmaydi. To'g'ri usul: logs/* (papka ichidagilar) va keyin !logs/.gitkeep.

Bo'sh papkalar

Git bo'sh papkalarni kuzatmaydi (u faqat fayllarni biladi). Bo'sh papka kerak bo'lsa (masalan, uploads/) — ichiga bo'sh .gitkeep fayli qo'yiladi (bu shunchaki an'ana, maxsus nom emas):

uploads/*
!uploads/.gitkeep

Nimalarni har doim e'tiborsiz qoldirish kerak

Turi Misollar Nima uchun
Sirlar .env, *.pem, credentials.json Xavfsizlik
Bog'liqliklar node_modules/, vendor/, .venv/ Qayta o'rnatiladi (npm install)
Build natijalari dist/, build/, *.pyc, target/ Koddan qayta yaratiladi
Loglar, kesh *.log, .cache/, coverage/ Vaqtinchalik
OS fayllari .DS_Store, Thumbs.db, desktop.ini Keraksiz
Shaxsiy muharrir sozlamalari .idea/, *.swp Har kimniki boshqa

Qoida: koddan qayta yaratilishi mumkin bo'lgan narsa — repozitoriyda emas. package-lock.json esa — repozitoriyda (u bog'liqliklarning aniq versiyalarini qotiradi).

[!INFO] .vscode/ ni butunlay yashirish shart emas: jamoa uchun umumiy sozlamalar (.vscode/extensions.json — tavsiya etilgan kengaytmalar) foydali bo'lishi mumkin. Odatda: .vscode/* va !.vscode/extensions.json.


Tayyor shablonlar

Noldan yozish shart emas:

  • github.com/github/gitignore — har bir til va framework uchun rasmiy shablonlar (Node.gitignore, Python.gitignore, Laravel.gitignore...)
  • gitignore.io — bir nechtasini birlashtiradi: "Node, React, macOS, Windows, VisualStudioCode"
  • GitHub da yangi repozitoriy yaratishda — ".gitignore template" ni tanlash
  • Framework lar o'zi yaratadi: npm create vite, laravel new, create-next-app

Global .gitignore

.DS_Store, Thumbs.db, muharrirning vaqtinchalik fayllari — bular sizning kompyuteringizga tegishli, loyihaga emas. Ularni har bir loyihaning .gitignore iga yozish o'rniga — bir marta, global:

git config --global core.excludesFile ~/.gitignore_global
# ~/.gitignore_global
.DS_Store
Thumbs.db
desktop.ini
*.swp
*~
.idea/

Endi bu fayllar barcha repozitoriylaringizda e'tiborsiz qoldiriladi.

Yana bir variant — .git/info/exclude: faqat shu repozitoriy uchun, lekin commit qilinmaydi (shaxsiy qoidalar uchun).


Allaqachon kuzatilayotgan fayl

Muhim nozik jihat: .gitignore faqat kuzatilmaydigan fayllarga ta'sir qiladi. Agar .env allaqachon commit qilingan bo'lsa, uni .gitignore ga qo'shish hech narsa qilmaydi — Git uni kuzatishda davom etadi.

Yechim — kuzatuvdan chiqarish (fayl diskda qoladi):

git rm --cached .env
git rm -r --cached node_modules
git commit -m "node_modules va .env kuzatuvdan chiqarildi"

[!WARNING] git rm --cached faylni faqat keyingi commit lardan olib tashlaydi. Tarixdagi eski commitlarda .env baribir bor. Agar u GitHub ga push qilingan bo'lsa — undagi barcha parol va kalitlarni darhol almashtiring. Tarixni to'liq tozalash uchun — git filter-repo yoki BFG vositalari, lekin bu barcha nusxalarni qayta yozishni talab qiladi.


Tekshirish va debug

"Bu fayl nega ko'rinmayapti?" yoki "nega e'tiborsiz qolmayapti?":

git check-ignore -v dist/app.js
.gitignore:8:dist/    dist/app.js

Qaysi fayl, qaysi qator, qaysi naqsh sabab bo'lgani.

git status --ignored            # e'tiborsiz qoldirilgan fayllarni ham ko'rsatish

Nima uchun shunday?

Nima uchun node_modules va dist ni repozitoriyda saqlamaslik kerak — ular ham loyihaning bir qismi-ku?

Chunki ular hosila — manba emas. node_modules — package.json va package-lock.json dan bir buyruq bilan aniq qayta yaratiladi; dist — manba koddan. Ularni saqlash: repozitoriy hajmini yuzlab marta oshiradi (clone sekinlashadi), har bir yangilanishda minglab o'zgargan fayl bilan diff larni "ifloslaydi", turli OS larda turlicha kompilyatsiya qilingan modullar bilan muammolar keltiradi, va merge conflict larni keltirib chiqaradi. Repozitoriy — manbalar uchun: odam yozgan va qayta yaratib bo'lmaydigan narsalar uchun.


Xulosa

Eslab qoling:

  • .gitignore — loyiha ildizida; uni commit qiling
  • *.log, papka/, /faqat-ildiz, **/chuqur, !istisno
  • Har doim: sirlar (.env), bog'liqliklar, build natijalari, loglar, OS fayllari
  • .env.example — qiymatsiz namuna, repozitoriyda
  • Bo'sh papka — .gitkeep
  • Shablonlar: github/gitignore, gitignore.io
  • Global: core.excludesFile — .DS_Store kabilar uchun
  • Allaqachon kuzatilayotgan fayl — git rm --cached; sizib chiqqan sirlar — almashtiring
  • git check-ignore -v fayl — debug

Keyingi bo'lim

3-bo'lim: Branch va Merge — parallel ishlash, birlashtirish va conflict lar.