.gitignore — qaysi fayllarni kuzatmaslik, shablonlar, global gitignore
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 --cachedfaylni faqat keyingi commit lardan olib tashlaydi. Tarixdagi eski commitlarda.envbaribir bor. Agar u GitHub ga push qilingan bo'lsa — undagi barcha parol va kalitlarni darhol almashtiring. Tarixni to'liq tozalash uchun —git filter-repoyoki 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_Storekabilar 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.