IlmHamroh
JavaScript Full-stack/7-qism. Git va GitHub asoslari8/36-dars18 daqiqa
Mundarija (38)

.gitignore: to'liq qo'llanma — naqshlar, check-ignore va git rm --cached

Qisqacha: .gitignore — repo ildizidagi matnli fayl; unga yozilgan naqshlarga mos fayllarni Git "ko'rmaydi": ular git status da chiqmaydi va git add . bilan qo'shilmaydi. Har loyihada birinchi kundan node_modules/, .env, loglar va OS xizmat fayllari (.DS_Store, Thumbs.db) chetlatiladi. Qaysi qoida ishlaganini git check-ignore -v aytadi. Allaqachon commit qilingan faylga .gitignore ta'sir qilmaydi — uni git rm --cached bilan kuzatuvdan chiqarish kerak.

Bu darsda

  • .gitignore qaysi muammoni hal qilishini va unga nimalar yozilishini bilasiz.
  • *, **, ?, !, / naqshlarini o'qiysiz va yozasiz.
  • git check-ignore -v va git status --ignored bilan qoidalarni tekshirasiz.
  • Tasodifan commit qilingan faylni git rm --cached bilan repodan chiqarasiz.
  • .git/info/exclude va global ignore faylini qachon ishlatishni bilasiz.

Oldin bilishingiz kerak: Birinchi repo, Yaxshi commit, YAML, TOML, INI va .env.

1. Nega bu kerak?

Har loyihada commit qilinmasligi kerak bo'lgan fayllar bor. Ular uch turga bo'linadi:

  1. Qayta yaratiladigan fayllar. node_modules/ — npm install uni package-lock.json dan istalgan payt qayta yaratadi. Unda minglab fayl bo'lishi mumkin. Build natijasi (dist/), test hisobotlari (coverage/) ham shunday.
  2. Maxfiy fayllar. .env — parollar va API kalitlari (YAML, TOML, INI va .env darsida ".env doim .gitignore da" degan edik). U GitHub'ga chiqsa, begona odam kalitingizdan foydalanadi.
  3. Shaxsiy va tasodifiy fayllar. Operatsion tizim xizmat fayllari, loglar, muharrirning vaqtinchalik fayllari.

Fayl qidirish darsida .gitignore bilan qisqa tanishgan edik: "Git e'tibor bermasligi kerak bo'lgan fayllar ro'yxati". Birinchi repo darsida portfolio'ga bitta qatorli .gitignore yozdik — node_modules/. Bugun uning to'liq qoidalarini o'rganamiz.

Oldingi ikki darsda ham bir muammo ko'zga tashlangan edi. Malika «Bahor»ga tasodifan assets/css/.DS_Store ni commit qilib qo'ygan (git log darsida --stat orqali topdik). Bugun uni ham tozalaymiz.

2. Birinchi .gitignore

2.1 Keraksiz fayllar paydo bo'ldi

Malika yana rasmlar papkasini yubordi. Aziz Windows'da papkani ochgan edi, u yerda ham xizmat fayllari paydo bo'ldi. Brauzer xatosini tekshirish uchun Aziz log fayl ham yozdi:

bash
git status -s
text
?? assets/images/.DS_Store
?? assets/images/Thumbs.db
?? assets/images/desktop.ini
?? xato.log
  • .DS_Store — macOS'ning Finder dasturi papka sozlamalarini saqlaydigan fayl.
  • Thumbs.db — Windows'ning rasmlar uchun kichik nusxalar (eskiz) keshi.
  • desktop.ini — Windows papkasining ko'rinish sozlamasi.
  • xato.log — dasturlar yozadigan jurnal fayl.

Birortasi saytga kerak emas. git add . yozilsa, hammasi commitga tushadi — Malika bilan aynan shunday bo'lgan edi.

2.2 Faylni yozish

Repo ildizida .gitignore nomli fayl yaratamiz (VS Code'da: yangi fayl → nomi .gitignore, kengaytmasiz):

gitignore
# Operatsion tizim xizmat fayllari
.DS_Store
Thumbs.db
desktop.ini

# Loglar
*.log

Qoidalar:

  • Har qator — bitta naqsh (pattern): qaysi fayllarga mos kelishini aytadigan shablon.
  • # bilan boshlangan qator — izoh. Bo'sh qatorlar e'tiborga olinmaydi, ular faqat guruhlash uchun.
  • * — "istalgan belgilar" (Fayl qidirish darsidagi find -name "*.html" kabi). *.log — .log bilan tugaydigan hamma fayllar.
  • Naqshda / bo'lmasa, u istalgan papkada ishlaydi. .DS_Store ham ildizdagi, ham assets/images/ dagi faylga mos keladi.
  • Qator oxirida tasodifan qolgan bo'sh joylarni Git tashlab yuboradi — *.log ham *.log kabi ishlaydi. Biz buni ham sinab ko'rdik.

Natija:

bash
git status -s
text
?? .gitignore

To'rtta fayl ro'yxatdan yo'qoldi. O'rniga yangi fayl bor — .gitignore ning o'zi. U albatta commit qilinadi: qoidalar butun jamoaga tegishli bo'lishi kerak.

2.3 Chetlatilganlarni ko'rish: --ignored

Fayllar o'chmadi — diskda turibdi. Git ularni shunchaki ko'rsatmayapti. Ko'rsatishni so'rash mumkin:

bash
git status -s --ignored
text
?? .gitignore
!! assets/images/.DS_Store
!! assets/images/Thumbs.db
!! assets/images/desktop.ini
!! xato.log

!! — "chetlatilgan (ignored)". git status -s dagi to'rtinchi belgi: ?? untracked, !! ignored.

Tekshirib ko'ring: .gitignore da *.log yozilgan. assets/eski/bron.log fayli chetlatiladimi?

Javob

Ha. Naqshda / yo'q, shuning uchun u repo ichidagi istalgan papkadagi .log faylga mos keladi — qanchalik chuqur bo'lmasin.

3. Qaysi qoida ishladi: git check-ignore -v

Katta .gitignore da qaysi qator faylni yashirganini topish qiyin. Buni Git'ning o'zidan so'raymiz:

bash
git check-ignore -v xato.log
text
.gitignore:7:*.log	xato.log

Natija: qaysi fayl : qaysi qator : qaysi naqsh, keyin fayl nomi. xato.log ni .gitignore ning 7-qatoridagi *.log chetlatdi. -v (verbose) bo'lmasa, faqat fayl nomi chiqadi.

Fayl chetlatilmagan bo'lsa, natija bo'sh:

bash
git check-ignore -v menyu/index.html

Hech narsa chiqmaydi, exit code esa 1. "Nega bu fayl git status da ko'rinmayapti?" yoki aksincha "Nega ko'rinyapti?" degan savol tug'ilsa — birinchi qadam check-ignore -v.

4. Allaqachon commit qilingan fayl

4.1 .gitignore uni "ko'rmaydi"

.DS_Store naqshi bor. Malikaning eski faylini tekshiramiz:

bash
git check-ignore -v assets/css/.DS_Store

Bo'sh! Nega? Chunki assets/css/.DS_Store allaqachon tracked — u commitda bor. .gitignore faqat hali kuzatilmayotgan (untracked) fayllarga ta'sir qiladi. Kuzatilayotgan faylni Git kuzatishda davom etadi: o'zgarsa, git status da ko'rinadi.

--no-index flagi "fayl kuzatilayotganiga qarama, faqat naqshlarni tekshir" deydi:

bash
git check-ignore -v --no-index assets/css/.DS_Store
text
.gitignore:2:.DS_Store	assets/css/.DS_Store

Naqsh mos keladi — lekin bu yetarli emas. Faylni kuzatuvdan o'zimiz chiqarishimiz kerak.

4.2 git rm --cached

Yaxshi commit darsida git rm ning --cached varianti borligini aytgan edik: faylni diskda qoldiradi, faqat Git kuzatuvidan chiqaradi.

bash
git rm --cached assets/css/.DS_Store
git status -s
text
rm 'assets/css/.DS_Store'
D  assets/css/.DS_Store
?? .gitignore

D chap ustunda — "keyingi commitda bu fayl bo'lmaydi". Diskda-chi?

bash
ls -a assets/css
text
.
..
.DS_Store
asosiy.css

Fayl joyida — Malikaning Mac'iga hech narsa bo'lmaydi. Endi .gitignore ni ham qo'shamiz va ikkalasini bitta commitda saqlaymiz — ikkalasi bitta mantiqiy ish (atomar commit):

bash
git add .gitignore
git commit -m "Git: OS xizmat fayllari va loglarni chetlab o't"
text
[main d473f38] Git: OS xizmat fayllari va loglarni chetlab o't
 2 files changed, 7 insertions(+)
 create mode 100644 .gitignore
 delete mode 100644 assets/css/.DS_Store

Endi eski .DS_Store ham chetlatilganlar qatorida:

bash
git status -s --ignored
text
!! assets/css/.DS_Store
!! assets/images/.DS_Store
!! assets/images/Thumbs.db
!! assets/images/desktop.ini
!! xato.log
flowchart TD
  A["Fayl .gitignore<br/>naqshiga mos"] --> B{"Allaqachon<br/>commitda bormi?"}
  B -- "Yo'q (untracked)" --> C["Chetlatiladi:<br/>status'da ko'rinmaydi"]
  B -- "Ha (tracked)" --> D["Kuzatilaveradi"]
  D --> E["git rm --cached<br/>+ commit"]
  E --> C

Nimaga qarang: .gitignore faqat chap yo'lda o'zi ishlaydi. O'ng yo'lda — allaqachon commit qilingan faylda — qo'shimcha qadam kerak.

4.3 Tarix esa eslaydi

git rm --cached faylni bundan keyingi commitlardan chiqaradi. Eski commitlarda u qoladi — git log darsida o'chirilgan faylning tarixini topgan edik. .DS_Store uchun bu muammo emas.

Lekin .env uchun bu jiddiy. Parolli fayl bir marta commit qilinib, GitHub'ga yuborilgan bo'lsa, uni git rm --cached bilan olib tashlash yetarli emas. Eski commitni ochgan har kim parolni ko'radi.

Diqqat: Maxfiy kalit repoga tushib, GitHub'ga chiqqan bo'lsa — birinchi ish: kalitni darhol almashtiring (xizmatning sozlamalarida yangisini yarating, eskisini o'chiring). .env darsidagi "oltin qoida" shu. Tarixni qayta yozish vositalari ham bor, lekin ular kalitni qaytarib bermaydi — u allaqachon boshqalarning kompyuterida bo'lishi mumkin. Eng yaxshi himoya — loyihaning birinchi commitidan oldin .env ni .gitignore ga yozish.

Tekshirib ko'ring: Aziz .gitignore ga xato.log ni yozdi, lekin git status da M xato.log chiqyapti. Nega va nima qilish kerak?

Javob

M — fayl o'zgargan, demak u tracked: oldinroq commit qilingan. .gitignore tracked faylga ta'sir qilmaydi. Yechim: git rm --cached xato.log va commit. Shundan keyin .gitignore qoidasi ishlaydi.

5. Naqshlar to'liq

Qoidalarni tashlab yuboriladigan sinov repoda — kurs/sinov-git/naqsh da — sinadik. Unda turli papkalarda bir xil nomli fayllar bor. .gitignore:

gitignore
/todo.txt
build/
*.log
!muhim.log
docs/**/*.png
dist
.env
src/rasm?.png

Har bir qator qanday ishlaganini check-ignore -v bilan tekshirdik.

5.1 / boshida — faqat ildiz

bash
git check-ignore -v todo.txt src/todo.txt
text
.gitignore:1:/todo.txt	todo.txt

/todo.txt — faqat .gitignore turgan papkadagi (ildizdagi) todo.txt. src/todo.txt chetlatilmadi. Boshdagi / — "shu yerdan boshlab" degan langar.

5.2 / oxirida — faqat papka

bash
git check-ignore -v build/app.js src/build/x.js
text
.gitignore:2:build/	build/app.js
.gitignore:2:build/	src/build/x.js

build/ — build nomli papka va uning ichidagi hamma narsa, istalgan joyda. Agar build nomli oddiy fayl bo'lsa, unga tegmaydi. Oxiridagi / — "faqat papka".

dist (sleshsiz) esa ham faylga, ham papkaga mos keladi:

text
.gitignore:6:dist	dist/index.html

5.3 O'rtada / — nisbiy yo'l

Naqshning o'rtasida / bo'lsa, u .gitignore joylashgan papkaga nisbatan yo'l bo'ladi. src/rasm?.png — faqat src/ dagi rasm1.png, rasm2.png. ? — "aynan bitta istalgan belgi": rasm1 va rasm2 mos, rasm10 esa yo'q.

text
.gitignore:8:src/rasm?.png	src/rasm1.png

5.4 ** — istalgan chuqurlik

bash
git check-ignore -v docs/rasm/a.png docs/b.png
text
.gitignore:5:docs/**/*.png	docs/rasm/a.png
.gitignore:5:docs/**/*.png	docs/b.png

** — "istalgan sondagi papka, nol ham". docs/**/*.png — docs ichidagi hamma .png, qanchalik chuqur bo'lmasin: docs/b.png ham, docs/rasm/a.png ham. Uch shakl bor:

Naqsh Ma'nosi
**/loglar Istalgan joydagi loglar
loglar/** loglar ichidagi hamma narsa
a/**/b a/b, a/x/b, a/x/y/b ...

5.5 ! — istisno

bash
git check-ignore -v muhim.log xato.log
text
.gitignore:4:!muhim.log	muhim.log
.gitignore:3:*.log	xato.log

!muhim.log — "oldingi qoidadan istisno: buni chetlatma". E'tibor bering: muhim.log uchun ham natija chiqdi, lekin naqsh ! bilan — ya'ni fayl qaytarildi. check-ignore -v oxirgi mos kelgan qoidani ko'rsatadi, u "chetlat" ham, "qaytar" ham bo'lishi mumkin.

Tartib muhim: Git qatorlarni yuqoridan pastga o'qiydi, oxirgi mos kelgan qoida yutadi. !muhim.log ni *.log dan oldin yozsangiz, u hech narsa qilmaydi.

5.6 ! ning chegarasi

Bitta tuzoq bor. build/ chetlatilgan, lekin build/app.js ni saqlamoqchimiz. .gitignore oxiriga !build/app.js qo'shamiz:

bash
git check-ignore -v build/app.js
text
.gitignore:2:build/	build/app.js

Ishlamadi! Git hujjati buni ochiq aytadi: fayl joylashgan papka chetlatilgan bo'lsa, faylni qaytarib bo'lmaydi. Git chetlatilgan papkaning ichiga umuman kirmaydi — ichidagi ! qoidalarini ko'rmaydi ham.

Yechim — papkani emas, uning ichidagilarni chetlatish: build/ o'rniga build/*:

text
.gitignore:9:!build/app.js	build/app.js

Endi Git build papkasiga kiradi va app.js ni qaytaradi. Lekin bir farq paydo bo'ldi: build/* da o'rtada / bor, demak u endi faqat ildizdagi build ga tegishli. src/build/ yana ko'rinib qoldi. Naqsh yozishda har bir / ning o'rni muhim.

Tekshirib ko'ring: .gitignore da .env va .env.* bor. .env.example ni commit qilish kerak. Qaysi qator qo'shiladi va qayerga?

Javob

!.env.example — ikkala qatordan keyin. Oxirgi mos qoida yutadi: .env.* uni chetlatadi, keyingi !.env.example qaytaradi. Papka emas, oddiy fayl bo'lgani uchun ! bu yerda ishlaydi.

6. Qoidalar qayerda yashaydi

6.1 Uch joy

Joy Kimga Qachon
.gitignore (repo ichida) Butun jamoa Loyiha fayllari: node_modules/, .env, dist/
.git/info/exclude Faqat shu repo, faqat siz Shu loyihadagi shaxsiy fayllar
Global ignore fayli Kompyuterdagi hamma repo Sizning OS va muharrir fayllari

.gitignore fayli ichki papkalarda ham bo'lishi mumkin — u faqat o'z papkasi va undan pastiga ta'sir qiladi. Lekin ko'p loyihalarda bitta, ildizdagi fayl yetarli.

6.2 .git/info/exclude — shaxsiy ro'yxat

Aziz «Bahor» papkasida o'zi uchun eslatmalarim.txt saqlaydi. Uni jamoaning .gitignore iga yozish shart emas — boshqalarda bunday fayl yo'q. Birinchi repo darsida .git ichida info papkasini ko'rgan edik — mana u nima uchun:

bash
echo 'eslatmalarim.txt' >> .git/info/exclude
git check-ignore -v eslatmalarim.txt
text
.git/info/exclude:7:eslatmalarim.txt	eslatmalarim.txt

7-qator — chunki faylning boshida Git yozgan 6 qator izoh bor. Sintaksis .gitignore bilan bir xil. Farqi: .git ichidagi narsa commit qilinmaydi va boshqalarga yetib bormaydi.

6.3 Global ignore fayli

Mac'dagi .DS_Store yoki Windows'dagi Thumbs.db — sizning kompyuteringiz yaratadigan fayllar. Ularni har bir repoda qayta yozmaslik uchun bitta global fayl bor. Uning joyi core.excludesFile sozlamasida:

bash
git config --global core.excludesFile

Bo'sh — sozlanmagan (exit code 1). Unda Git standart joyni o'qiydi: ~/.config/git/ignore. Fayl bo'lmasa, uni yaratish kifoya:

bash
mkdir -p ~/.config/git
echo '*.tmp' >> ~/.config/git/ignore

Tekshiruv (bizning sinov muhitimizda yo'l vaqtinchalik papkada edi):

text
C:/Users/.../git/ignore:1:*.tmp	qoralama.tmp

Boshqa joydagi faylni ishlatmoqchi bo'lsangiz — git config --global core.excludesFile <yo'l>.

Maslahat: Global fayl qulay, lekin jamoa loyihasida OS fayllarini .gitignore ga ham yozish odat. Sababi: jamoadagi hamma ham global faylni sozlamagan. .DS_Store ni birinchi marta commit qiladigan odam doim global sozlamani bilmaydigan yangi hamkasb bo'ladi — Malika kabi.

7. Tayyor shablonlar

Har safar ro'yxatni noldan yozish shart emas. GitHub'ning github/gitignore nomli ochiq reposida tillar va freymvorklar uchun tayyor shablonlar bor: Node.gitignore, Python.gitignore va boshqalar. GitHub'da yangi repo yaratishda .gitignore shablonini tanlash imkoniyati ham bor — buni GitHub asoslari darsida ko'rasiz.

Shablon — boshlang'ich nuqta, qonun emas. Node.gitignore da yuzga yaqin qator bor, ko'pi siz ishlatmaydigan vositalar uchun. Qoida: loyihangizda haqiqatan paydo bo'ladigan fayllarni yozing va har qatorni tushunib qo'shing.

8. Ko'p uchraydigan xatolar

8.1 .gitignore yozildi, lekin fayl baribir ko'rinyapti

Eng ko'p uchraydigan holat — fayl allaqachon tracked. «Allaqachon commit qilingan fayl» bo'limidagi git rm --cached yo'li. Butun papka bo'lsa — -r: git rm -r --cached node_modules.

8.2 PowerShell'da echo bilan yozilgan fayl

Windows PowerShell 5.1 da echo 'node_modules/' > .gitignore yozsangiz, fayl UTF-16 kodlashda saqlanadi. Git uni tushunmaydi va qoidalar ishlamaydi. Biz sinab ko'rdik:

bash
file .gitignore
git status -s
text
.gitignore: Unicode text, UTF-16, little-endian text, with CRLF line terminators
?? .gitignore
?? node_modules/

node_modules/ yozilgan bo'lsa ham ko'rinib turibdi. file buyrug'i fayl turini aytadi (Matnli va binar fayllar darsida ko'rgansiz; kodlashlar farqi — Matn kodlash). Tuzatish: .gitignore ni VS Code'da yarating yoki Git Bash'da echo ishlating — ikkalasi UTF-8 yozadi. Shundan keyin:

text
.gitignore: ASCII text
?? .gitignore

8.3 Fayl nomi xato

Windows fayl kengaytmalarini yashirishi mumkin. Explorer'da "yangi matnli fayl" yaratib, nomini gitignore qilsangiz, aslida gitignore.txt bo'ladi:

text
?? gitignore.txt
?? node_modules/

Git faqat aynan .gitignore nomini (nuqta bilan, kengaytmasiz) o'qiydi. Tekshirish: ls -a (Fayl tizimi darsidagi yashirin fayllar).

8.4 Chetlatilgan faylni qo'shishga urinish

bash
git add a.log
text
The following paths are ignored by one of your .gitignore files:
a.log
hint: Use -f if you really want to add them.
hint: Disable this message with "git config set advice.addIgnoredFile false"

Tarjimasi: "Quyidagi yo'llar .gitignore fayllaringizdan biri tomonidan chetlatilgan: a.log. Maslahat: haqiqatan qo'shmoqchi bo'lsangiz, -f ishlating". Git sizni himoya qilyapti. git add -f a.log (force) faylni baribir qo'shadi — shundan keyin u tracked bo'ladi va .gitignore unga ta'sir qilmaydi. Buni faqat ongli ravishda qiling. Ikkinchi hint qatorida Git'ning yangi git config set sintaksisini ko'rasiz (Git'ni sozlash).

8.5 node_modules ni bir marta commit qilib qo'yish

Minglab fayl, katta hajm, har npm install da yuzlab o'zgarish. Tuzatish — yuqoridagi "baribir ko'rinyapti" holatidagi kabi: .gitignore ga node_modules/, keyin git rm -r --cached node_modules va commit. Tarixdagi eski commitlar baribir og'ir bo'lib qoladi — shuning uchun .gitignore birinchi commitdan oldin yoziladi.

9. Mashqlar

1-mashq (oson): Naqshni o'qing

Har bir naqsh qaysi fayllarga mos keladi?

  1. *.log
  2. /config.json
  3. temp/
  4. !muhim.txt

Ishora: «Naqshlar to'liq» bo'limidagi / ning uch o'rni.

Yechim
  1. Istalgan papkadagi .log bilan tugaydigan fayllar.
  2. Faqat ildizdagi config.json (boshdagi / — langar).
  3. Istalgan joydagi temp nomli papka va uning ichidagi hamma narsa. temp nomli oddiy faylga tegmaydi.
  4. O'zi hech narsani chetlatmaydi — oldingi qoida chetlatgan muhim.txt ni qaytaradi. Ota papkasi chetlatilgan bo'lsa, ishlamaydi.

2-mashq (o'rta): Bo'sh joylarni to'ldiring

Node loyiha uchun .gitignore. .env va boshqa .env.local kabi fayllar chetlatilsin, .env.example esa qolsin. rasmlar ichidagi hamma .jpg, qanchalik chuqur bo'lmasin, chetlatilsin:

gitignore
node_modules/
coverage/
npm-debug.log*
.env
.env.
.env.example
rasmlar//*.jpg

Ishora: «! — istisno» va «** — istalgan chuqurlik» bo'limlari.

Yechim

.env.*, !.env.example, rasmlar/**/*.jpg. Biz sinov repoda tekshirdik:

bash
git check-ignore -v .env.local .env.example rasmlar/katta/b.jpg
text
.gitignore:5:.env.*	.env.local
.gitignore:6:!.env.example	.env.example
.gitignore:7:rasmlar/**/*.jpg	rasmlar/katta/b.jpg

.env.example qarshisida ! qoidasi — ya'ni u qaytarilgan. git status -s --ignored da .env.example ?? bo'lib ko'rinadi: commitga tayyor.

3-mashq (qiyin): Stajyorning .gitignore i

Sardorning loyihasida quyidagi holat:

gitignore
!dist/index.html
dist/
.env

git status da .env ko'rinib turibdi, dist/index.html esa ko'rinmayapti. Sardor ikkalasini ham aksincha kutgan edi.

  1. Nega .env ko'rinyapti? Qanday tekshirasiz?
  2. Nega dist/index.html ko'rinmayapti?
  3. To'g'ri .gitignore ni yozing.

Ishora: check-ignore -v va --no-index; «! ning chegarasi» bo'limi.

Yechim
  1. Ehtimol .env allaqachon commit qilingan (tracked). Tekshirish: git check-ignore -v .env bo'sh, git check-ignore -v --no-index .env esa .gitignore:3:.env ko'rsatsa — shunday. Yechim: git rm --cached .env, commit va — agar repo GitHub'ga yuborilgan bo'lsa — .env dagi hamma kalitlarni almashtirish.
  2. Ikki sabab. Birinchidan, !dist/index.html dist/ dan oldin — oxirgi mos qoida yutadi. Ikkinchidan, tartib to'g'ri bo'lsa ham dist/ papkaning o'zini chetlatadi va uning ichidagi faylni qaytarib bo'lmaydi.
  3. To'g'risi:
gitignore
.env
dist/*
!dist/index.html

4-mashq: Portfolio qadami — to'liq .gitignore

Portfolio'da hozir bitta qatorli .gitignore bor. Uni to'liq qilamiz. Kelajakda bo'lishi mumkin bo'lgan fayllarni ham oldindan yozamiz — .env hozir yo'q, lekin JavaScript qismlarida paydo bo'lishi mumkin.

  1. Portfolio'da git status -s --ignored ni ishga tushiring — hozir nima chetlatilgan?
  2. .gitignore ni quyidagi mazmun bilan yangilang (VS Code'da):
gitignore
# Bog'liqliklar — npm install qayta yaratadi
node_modules/

# Maxfiy sozlamalar — hech qachon commit qilinmaydi
.env
.env.*
!.env.example

# Loglar
*.log

# Operatsion tizim fayllari
.DS_Store
Thumbs.db
desktop.ini
  1. Tekshirish uchun sinov fayllarini yarating: echo 'TOKEN=sinov' > .env va echo 'x' > npm-debug.log. git status -s da ular ko'rinmasligi kerak.
  2. git check-ignore -v bilan har biri qaysi qator bilan chetlatilganini ko'ring.
  3. git ls-files | grep -i ds_store — ilgari commit qilingan .DS_Store bormi? (Thumbs.db uchun ham xuddi shunday.) Bo'lsa — git rm --cached.
  4. git diff bilan o'zgarishni ko'rib, commit qiling. Sinov fayllarini o'chiring.
  5. mashqlar reposida ham .gitignore ni to'ldiring (qo'shimcha qator — dist/) va avval commit qilingan 06/tailwind/dist/ ni kuzatuvdan chiqaring.
Yechim
bash
cd ~/kurs/portfolio
git status -s --ignored
echo 'TOKEN=sinov' > .env
echo 'x' > npm-debug.log
git status -s
git check-ignore -v .env npm-debug.log node_modules
git ls-files | grep -i ds_store
git diff
git add .gitignore
git commit -m "Git: maxfiy, log va OS fayllarini chetlab o't"
rm .env npm-debug.log

Biz qisqa portfolio nusxasida sinadik (unga sayt/.DS_Store ham qo'shgan edik). Yangi .gitignore bilan:

text
 M .gitignore

git status -s da faqat .gitignore ning o'zi. --ignored bilan:

text
 M .gitignore
!! .env
!! node_modules/
!! npm-debug.log
!! sayt/.DS_Store
!! sayt/assets/images/

Oxirgi qator — images papkasida faqat Thumbs.db bor edi, shuning uchun Git butun papkani !! deb ko'rsatdi. check-ignore -v:

text
.gitignore:5:.env	.env
.gitignore:10:*.log	npm-debug.log
.gitignore:2:node_modules/	node_modules

Commit:

text
[main bf5a397] Git: maxfiy, log va OS fayllarini chetlab o't
 1 file changed, 14 insertions(+)

Qator raqamlari sizda boshqacha bo'lishi mumkin — izoh va bo'sh qatorlar ham sanaladi. grep hech narsa chiqarmasa — tarixga OS fayllari tushmagan.

landing loyihangiz uchun ham xuddi shunday .gitignore kerak bo'ladi — u repo bo'lganda birinchi ish shu fayl.

mashqlar repo. Yaxshi commit darsida mashqlar ni ochganda 06/tailwind/dist/chiqish.css commitga tushgan edi. dist/ — Tailwind yaratgan natija, uni npm run build qayta yaratadi. Endi uni tozalaymiz — «Allaqachon commit qilingan fayl» bo'limidagi yo'l bilan:

bash
cd ~/kurs/mashqlar
git ls-files 06
text
06/tailwind/dist/chiqish.css
06/tailwind/index.html
06/tailwind/package.json

.gitignore ga portfolio'dagi kabi OS va log qatorlarini hamda dist/ ni qo'shamiz. Keyin:

bash
git check-ignore -v 06/tailwind/dist/chiqish.css
git rm -r --cached 06/tailwind/dist
git add .gitignore
git status -s
text
rm '06/tailwind/dist/chiqish.css'
M  .gitignore
D  06/tailwind/dist/chiqish.css

check-ignore bo'sh chiqdi (exit code 1) — fayl tracked edi. git rm -r --cached dan keyin u commitdan chiqadi, lekin diskda qoladi (ls 06/tailwind/dist — chiqish.css joyida). Commit:

text
[main 3980799] Git: dist va OS fayllarini chetlab o't
 2 files changed, 10 insertions(+), 1 deletion(-)
 delete mode 100644 06/tailwind/dist/chiqish.css

Oxirida shu darsning mashq javoblarini 07/08-gitignore/javoblar.md ga yozib, alohida commit qiling.

10. Real ishda

  • Loyiha boshlanishi. Yangi loyihada git init dan keyingi birinchi fayl — .gitignore. Vite, Next.js kabi vositalar yangi loyihani tayyor .gitignore bilan yaratadi — keyingi qismlarda ko'rasiz.
  • Maxfiy ma'lumot sizib chiqishi. GitHub ochiq repolarni avtomatik tekshirib, ichidagi ma'lum turdagi kalitlarni topadigan xizmatga ega. Hujumchilar ham ochiq repolarni shunday skanerlaydi. .env ni .gitignore ga yozish — xavfsizlikning birinchi qadami.
  • Boshqa vositalar ham o'qiydi. rg qidiruvi (Fayl qidirish), Tailwind (06-qismda ko'rgan edingiz) va Prettier'ning 3-versiyasi .gitignore dagi fayllarga tegmaydi. Shuning uchun u faqat Git uchun emas.
  • Docker va npm'ning o'z ro'yxatlari. .dockerignore, .npmignore, .prettierignore — xuddi shu sintaksisdagi fayllar. Portfolio'dagi .htmlvalidateignore ham shunday. Bugungi naqshlar ularning hammasida ishlaydi.
  • Intervyuda: ".gitignore ga yozdim, lekin fayl baribir commitga tushyapti — nega?" — klassik savol. Javob: fayl allaqachon tracked, git rm --cached kerak.

Hujumchi nigohi

.env ni commit qilish — boshlovchi loyihalarida eng ko'p uchraydigan xavfsizlik xatosi.

  • Hujum: hujumchi GitHub'dagi ochiq repolarni avtomatik skaner qiladi va .env, config.json kabi fayllarda kalitlarni qidiradi. Fayl oxirgi commitda o'chirilgan bo'lsa ham, u eski commitlarni ko'radi (git log -- .env — git log darsidagi o'chirilgan fayl tarixi). Topilgan kalit bilan u sizning hisobingizdan xizmatdan foydalanadi yoki ma'lumotlaringizni o'qiydi.
  • Himoya: .env birinchi commitdan oldin .gitignore da; jamoaga faqat qiymatsiz .env.example; git add . dan keyin doim git status -s; commitdan oldin git diff --staged (git diff). Kalit sizib chiqsa — git rm --cached emas, avval kalitni almashtirish.

Xulosa

  • .gitignore naqshlariga mos untracked fayllarni Git ko'rsatmaydi va git add . qo'shmaydi.
  • Har loyihada: node_modules/, .env, loglar, build natijasi, OS fayllari.
  • Naqshlar: *, ?, **; boshdagi / — ildiz, oxiridagi / — papka, o'rtadagi / — nisbiy yo'l; ! — istisno, oxirgi mos qoida yutadi.
  • git check-ignore -v — qaysi qator ishlagani; git status --ignored — chetlatilganlar ro'yxati.
  • Tracked faylga .gitignore ta'sir qilmaydi: git rm --cached + commit; tarixda baribir qoladi.
  • Shaxsiy qoidalar — .git/info/exclude, kompyuter bo'yicha — ~/.config/git/ignore.

Keyingi dars: Xatoni tuzatish 1: restore, amend va xavfsiz bekor qilish — commit qilinmagan o'zgarishni bekor qilish va oxirgi commitni tuzatishni o'rganamiz.

Manbalar

  • Git hujjati: "gitignore" (PATTERN FORMAT, **, ! cheklovi, core.excludesFile standart joyi), "git-check-ignore", "git-rm" (--cached) — git-scm.com/docs
  • GitHub hujjati: "Ignoring files" — docs.github.com
  • github/gitignore shablonlar reposi — github.com/github/gitignore
Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
.gitignore: to'liq qo'llanma — naqshlar, check-ignore va git rm --cached — IlmHamroh