Mundarija (38)
- Bu darsda
- 1. Nega bu kerak?
- 2. Birinchi .gitignore
- 2.1 Keraksiz fayllar paydo bo'ldi
- 2.2 Faylni yozish
- 2.3 Chetlatilganlarni ko'rish: --ignored
- 3. Qaysi qoida ishladi: git check-ignore -v
- 4. Allaqachon commit qilingan fayl
- 4.1 .gitignore uni "ko'rmaydi"
- 4.2 git rm --cached
- 4.3 Tarix esa eslaydi
- 5. Naqshlar to'liq
- 5.1 / boshida — faqat ildiz
- 5.2 / oxirida — faqat papka
- 5.3 O'rtada / — nisbiy yo'l
- 5.4 ** — istalgan chuqurlik
- 5.5 ! — istisno
- 5.6 ! ning chegarasi
- 6. Qoidalar qayerda yashaydi
- 6.1 Uch joy
- 6.2 .git/info/exclude — shaxsiy ro'yxat
- 6.3 Global ignore fayli
- 7. Tayyor shablonlar
- 8. Ko'p uchraydigan xatolar
- 8.1 .gitignore yozildi, lekin fayl baribir ko'rinyapti
- 8.2 PowerShell'da echo bilan yozilgan fayl
- 8.3 Fayl nomi xato
- 8.4 Chetlatilgan faylni qo'shishga urinish
- 8.5 node_modules ni bir marta commit qilib qo'yish
- 9. Mashqlar
- 1-mashq (oson): Naqshni o'qing
- 2-mashq (o'rta): Bo'sh joylarni to'ldiring
- 3-mashq (qiyin): Stajyorning .gitignore i
- 4-mashq: Portfolio qadami — to'liq .gitignore
- 10. Real ishda
- Hujumchi nigohi
- Xulosa
- Manbalar
.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": ulargit statusda chiqmaydi vagit add .bilan qo'shilmaydi. Har loyihada birinchi kundannode_modules/,.env, loglar va OS xizmat fayllari (.DS_Store,Thumbs.db) chetlatiladi. Qaysi qoida ishlaganinigit check-ignore -vaytadi. Allaqachon commit qilingan faylga.gitignoreta'sir qilmaydi — unigit rm --cachedbilan kuzatuvdan chiqarish kerak.
Bu darsda
.gitignoreqaysi muammoni hal qilishini va unga nimalar yozilishini bilasiz.*,**,?,!,/naqshlarini o'qiysiz va yozasiz.git check-ignore -vvagit status --ignoredbilan qoidalarni tekshirasiz.- Tasodifan commit qilingan faylni
git rm --cachedbilan repodan chiqarasiz. .git/info/excludeva 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:
- Qayta yaratiladigan fayllar.
node_modules/—npm installunipackage-lock.jsondan istalgan payt qayta yaratadi. Unda minglab fayl bo'lishi mumkin. Build natijasi (dist/), test hisobotlari (coverage/) ham shunday. - Maxfiy fayllar.
.env— parollar va API kalitlari (YAML, TOML, INI va .env darsida ".envdoim.gitignoreda" degan edik). U GitHub'ga chiqsa, begona odam kalitingizdan foydalanadi. - 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:
git status -s?? 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):
# Operatsion tizim xizmat fayllari
.DS_Store
Thumbs.db
desktop.ini
# Loglar
*.logQoidalar:
- 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 darsidagifind -name "*.html"kabi).*.log—.logbilan tugaydigan hamma fayllar.- Naqshda
/bo'lmasa, u istalgan papkada ishlaydi..DS_Storeham ildizdagi, hamassets/images/dagi faylga mos keladi. - Qator oxirida tasodifan qolgan bo'sh joylarni Git tashlab yuboradi —
*.logham*.logkabi ishlaydi. Biz buni ham sinab ko'rdik.
Natija:
git status -s?? .gitignoreTo'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:
git status -s --ignored?? .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:
.gitignoreda*.logyozilgan.assets/eski/bron.logfayli 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:
git check-ignore -v xato.log.gitignore:7:*.log xato.logNatija: 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:
git check-ignore -v menyu/index.htmlHech 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:
git check-ignore -v assets/css/.DS_StoreBo'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:
git check-ignore -v --no-index assets/css/.DS_Store.gitignore:2:.DS_Store assets/css/.DS_StoreNaqsh 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.
git rm --cached assets/css/.DS_Store
git status -srm 'assets/css/.DS_Store'
D assets/css/.DS_Store
?? .gitignoreD chap ustunda — "keyingi commitda bu fayl bo'lmaydi". Diskda-chi?
ls -a assets/css.
..
.DS_Store
asosiy.cssFayl 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):
git add .gitignore
git commit -m "Git: OS xizmat fayllari va loglarni chetlab o't"[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_StoreEndi eski .DS_Store ham chetlatilganlar qatorida:
git status -s --ignored!! assets/css/.DS_Store
!! assets/images/.DS_Store
!! assets/images/Thumbs.db
!! assets/images/desktop.ini
!! xato.logflowchart 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 --> CNimaga 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
.envni.gitignorega yozish.
Tekshirib ko'ring: Aziz
.gitignoregaxato.logni yozdi, lekingit statusdaM xato.logchiqyapti. 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:
/todo.txt
build/
*.log
!muhim.log
docs/**/*.png
dist
.env
src/rasm?.pngHar bir qator qanday ishlaganini check-ignore -v bilan tekshirdik.
5.1 / boshida — faqat ildiz
git check-ignore -v todo.txt src/todo.txt.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
git check-ignore -v build/app.js src/build/x.js.gitignore:2:build/ build/app.js
.gitignore:2:build/ src/build/x.jsbuild/ — 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:
.gitignore:6:dist dist/index.html5.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.
.gitignore:8:src/rasm?.png src/rasm1.png5.4 ** — istalgan chuqurlik
git check-ignore -v docs/rasm/a.png docs/b.png.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
git check-ignore -v muhim.log xato.log.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:
git check-ignore -v build/app.js.gitignore:2:build/ build/app.jsIshlamadi! 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/*:
.gitignore:9:!build/app.js build/app.jsEndi 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:
.gitignoreda.envva.env.*bor..env.exampleni 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:
echo 'eslatmalarim.txt' >> .git/info/exclude
git check-ignore -v eslatmalarim.txt.git/info/exclude:7:eslatmalarim.txt eslatmalarim.txt7-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:
git config --global core.excludesFileBo'sh — sozlanmagan (exit code 1). Unda Git standart joyni o'qiydi: ~/.config/git/ignore. Fayl bo'lmasa, uni yaratish kifoya:
mkdir -p ~/.config/git
echo '*.tmp' >> ~/.config/git/ignoreTekshiruv (bizning sinov muhitimizda yo'l vaqtinchalik papkada edi):
C:/Users/.../git/ignore:1:*.tmp qoralama.tmpBoshqa joydagi faylni ishlatmoqchi bo'lsangiz — git config --global core.excludesFile <yo'l>.
Maslahat: Global fayl qulay, lekin jamoa loyihasida OS fayllarini
.gitignorega ham yozish odat. Sababi: jamoadagi hamma ham global faylni sozlamagan..DS_Storeni 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:
file .gitignore
git status -s.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:
.gitignore: ASCII text
?? .gitignore8.3 Fayl nomi xato
Windows fayl kengaytmalarini yashirishi mumkin. Explorer'da "yangi matnli fayl" yaratib, nomini gitignore qilsangiz, aslida gitignore.txt bo'ladi:
?? 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
git add a.logThe 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?
*.log/config.jsontemp/!muhim.txt
Ishora: «Naqshlar to'liq» bo'limidagi / ning uch o'rni.
Yechim
- Istalgan papkadagi
.logbilan tugaydigan fayllar. - Faqat ildizdagi
config.json(boshdagi/— langar). - Istalgan joydagi
tempnomli papka va uning ichidagi hamma narsa.tempnomli oddiy faylga tegmaydi. - O'zi hech narsani chetlatmaydi — oldingi qoida chetlatgan
muhim.txtni 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:
node_modules/
coverage/
npm-debug.log*
.env
.env.
.env.example
rasmlar//*.jpgIshora: «! — istisno» va «** — istalgan chuqurlik» bo'limlari.
Yechim
.env.*, !.env.example, rasmlar/**/*.jpg. Biz sinov repoda tekshirdik:
git check-ignore -v .env.local .env.example rasmlar/katta/b.jpg.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:
!dist/index.html
dist/
.envgit status da .env ko'rinib turibdi, dist/index.html esa ko'rinmayapti. Sardor ikkalasini ham aksincha kutgan edi.
- Nega
.envko'rinyapti? Qanday tekshirasiz? - Nega
dist/index.htmlko'rinmayapti? - To'g'ri
.gitignoreni yozing.
Ishora: check-ignore -v va --no-index; «! ning chegarasi» bo'limi.
Yechim
- Ehtimol
.envallaqachon commit qilingan (tracked). Tekshirish:git check-ignore -v .envbo'sh,git check-ignore -v --no-index .envesa.gitignore:3:.envko'rsatsa — shunday. Yechim:git rm --cached .env, commit va — agar repo GitHub'ga yuborilgan bo'lsa —.envdagi hamma kalitlarni almashtirish. - Ikki sabab. Birinchidan,
!dist/index.htmldist/dan oldin — oxirgi mos qoida yutadi. Ikkinchidan, tartib to'g'ri bo'lsa hamdist/papkaning o'zini chetlatadi va uning ichidagi faylni qaytarib bo'lmaydi. - To'g'risi:
.env
dist/*
!dist/index.html4-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.
- Portfolio'da
git status -s --ignoredni ishga tushiring — hozir nima chetlatilgan? .gitignoreni quyidagi mazmun bilan yangilang (VS Code'da):
# 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- Tekshirish uchun sinov fayllarini yarating:
echo 'TOKEN=sinov' > .envvaecho 'x' > npm-debug.log.git status -sda ular ko'rinmasligi kerak. git check-ignore -vbilan har biri qaysi qator bilan chetlatilganini ko'ring.git ls-files | grep -i ds_store— ilgari commit qilingan.DS_Storebormi? (Thumbs.dbuchun ham xuddi shunday.) Bo'lsa —git rm --cached.git diffbilan o'zgarishni ko'rib, commit qiling. Sinov fayllarini o'chiring.mashqlarreposida ham.gitignoreni to'ldiring (qo'shimcha qator —dist/) va avval commit qilingan06/tailwind/dist/ni kuzatuvdan chiqaring.
Yechim
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.logBiz qisqa portfolio nusxasida sinadik (unga sayt/.DS_Store ham qo'shgan edik). Yangi .gitignore bilan:
M .gitignoregit status -s da faqat .gitignore ning o'zi. --ignored bilan:
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:
.gitignore:5:.env .env
.gitignore:10:*.log npm-debug.log
.gitignore:2:node_modules/ node_modulesCommit:
[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:
cd ~/kurs/mashqlar
git ls-files 0606/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:
git check-ignore -v 06/tailwind/dist/chiqish.css
git rm -r --cached 06/tailwind/dist
git add .gitignore
git status -srm '06/tailwind/dist/chiqish.css'
M .gitignore
D 06/tailwind/dist/chiqish.csscheck-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:
[main 3980799] Git: dist va OS fayllarini chetlab o't
2 files changed, 10 insertions(+), 1 deletion(-)
delete mode 100644 06/tailwind/dist/chiqish.cssOxirida shu darsning mashq javoblarini 07/08-gitignore/javoblar.md ga yozib, alohida commit qiling.
10. Real ishda
- Loyiha boshlanishi. Yangi loyihada
git initdan keyingi birinchi fayl —.gitignore. Vite, Next.js kabi vositalar yangi loyihani tayyor.gitignorebilan 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.
.envni.gitignorega yozish — xavfsizlikning birinchi qadami. - Boshqa vositalar ham o'qiydi.
rgqidiruvi (Fayl qidirish), Tailwind (06-qismda ko'rgan edingiz) va Prettier'ning 3-versiyasi.gitignoredagi 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.htmlvalidateignoreham shunday. Bugungi naqshlar ularning hammasida ishlaydi. - Intervyuda: "
.gitignorega yozdim, lekin fayl baribir commitga tushyapti — nega?" — klassik savol. Javob: fayl allaqachon tracked,git rm --cachedkerak.
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.jsonkabi 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:
.envbirinchi commitdan oldin.gitignoreda; jamoaga faqat qiymatsiz.env.example;git add .dan keyin doimgit status -s; commitdan oldingit diff --staged(git diff). Kalit sizib chiqsa —git rm --cachedemas, avval kalitni almashtirish.
Xulosa
.gitignorenaqshlariga mos untracked fayllarni Git ko'rsatmaydi vagit 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
.gitignoreta'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.excludesFilestandart joyi), "git-check-ignore", "git-rm" (--cached) — git-scm.com/docs - GitHub hujjati: "Ignoring files" — docs.github.com
github/gitignoreshablonlar reposi — github.com/github/gitignore
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!