6-bo‘lim

Fayllarni boshqarish va .gitignore

Fayllarni o'chirish, ko'chirish, nomini o'zgartirish va keraksiz fayllarni .gitignore bilan chetlab o'tish.

🕑 17 daqiqa o‘qish 📄 783 so‘z 👁 5 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Faylni o'chirish
  2. Kuzatuvdan chiqarish, lekin diskda qoldirish
  3. Papkani o'chirish
  4. Nomini o'zgartirish va ko'chirish
  5. .gitignore
  6. Shablon qoidalari
  7. Allaqachon kuzatilayotgan fayl
  8. Tekshirish
  9. Bo'sh papka masalasi
  10. Global .gitignore
  11. Tayyor shablonlar
  12. .gitattributes
  13. Fayllarni vaqtincha e'tiborsiz qoldirish
  14. Toza holatga keltirish
  15. Xulosa

Loyiha o'sgani sari fayllarni ko'chirish, o'chirish va ba'zilarini umuman Git dan yashirish kerak bo'ladi.

Faylni o'chirish #

Terminal
git rm eski-fayl.txt
git status
Natija
On branch main
Changes to be committed:
        deleted:    eski-fayl.txt
Terminal
git commit -m "Ishlatilmaydigan fayl o'chirildi"
rm va git rm farqi

Oddiy rm fayl.txt bilan o'chirsangiz, keyin git add fayl.txt yoki git add -A qilish kerak bo'ladi.

git rm ikkalasini birga bajaradi: faylni diskdan o'chiradi va o'chirishni sahnaga qo'yadi.

Kuzatuvdan chiqarish, lekin diskda qoldirish #

Terminal
git rm --cached maxfiy.env

Fayl diskda qoladi, lekin Git uni endi kuzatmaydi.

Bu eng ko'p kerak bo'ladigan buyruq

Parol yoki katta fayl tasodifan kommit qilinganda aynan shu ishlatiladi:

Terminal
git rm --cached .env
echo ".env" >> .gitignore
git commit -m ".env kuzatuvdan chiqarildi"

Lekin eski kommitlarda u hali ham turadi. Agar u parol bo'lsa, parolni albatta almashtiring - tarixdan o'chirish yetarli emas.

Papkani o'chirish #

Terminal
git rm -r eski-papka/

# Majburan (o'zgarishlar saqlanmagan bo'lsa ham)
git rm -f fayl.txt

Nomini o'zgartirish va ko'chirish #

Terminal
git mv eski-nom.php yangi-nom.php
git mv index.php manba/index.php
Terminal
git status
Natija
Changes to be committed:
        renamed:    index.php -> manba/index.php
Git nomni saqlamaydi

Aslida git mv shunchaki uch amalning qisqartmasi:

Terminal
mv eski.php yangi.php
git rm eski.php
git add yangi.php

Git nom o'zgarishini alohida saqlamaydi - u buni mazmun o'xshashligi bo'yicha taxmin qiladi. Shuning uchun faylni ko'chirib, bir vaqtda ichini ham ko'p o'zgartirsangiz, Git buni "o'chirish va yangi yaratish" deb ko'rsatishi mumkin.

.gitignore #

Har bir loyihada Git kuzatmasligi kerak bo'lgan fayllar bor:

Repozitoriyga nima kirmaydi Hech qachon • Parollar, kalitlar, .env fayllar • Shaxsiy ma'lumot, mijoz bazasi • SSH kalitlari, sertifikatlar Odatda kerak emas • node_modules/, vendor/ • Kompilyatsiya natijasi: dist/, build/ • Log fayllar, keshlar, vaqtinchalik Tizim fayllari • .DS_Store (macOS) • Thumbs.db, desktop.ini (Windows) • .idea/, .vscode/ (muharrir) Albatta kiritiladi • Manba kodi • composer.json, package.json • README, LICENSE, .env.example
To'g'ri .gitignore repozitoriyni toza va yengil saqlaydi

Loyiha ildizida .gitignore fayl yarating:

Natija
# Muhit sozlamalari
.env
.env.local
config/database.php

# Bog'liqliklar
node_modules/
vendor/

# Kompilyatsiya natijasi
dist/
build/
*.min.js
*.min.css

# Loglar
*.log
logs/
storage/logs/

# Kesh va vaqtinchalik
*.tmp
*.cache
.sass-cache/
storage/cache/

# Muharrir va IDE
.idea/
.vscode/
*.sublime-workspace
*.swp
*~

# Operatsion tizim
.DS_Store
Thumbs.db
desktop.ini

# Zaxira nusxalar
*.sql
*.zip
*.bak

Shablon qoidalari #

NaqshNimani mos keladi
fayl.txtIstalgan papkadagi shu nomli fayl
/fayl.txtFaqat ildizdagi fayl
papka/Papka va uning butun ichi
*.logBarcha .log fayllar
*.[oa].o va .a fayllar
hisobot?.txthisobot1.txt, hisobotA.txt
manba/**/test/manba ostidagi istalgan chuqurlikdagi test
!muhim.logIstisno - bu faylni kuzat
Natija
# Barcha log fayllarni yashiramiz
*.log

# Lekin bu bittasini kuzatamiz
!muhim.log

# Barcha rasmlar
rasmlar/*

# Lekin logotip kerak
!rasmlar/logo.png
Istisno ishlamasligi mumkin

Agar papka butunlay chetlab o'tilgan bo'lsa, uning ichidagi faylni istisno qilib bo'lmaydi:

Natija
rasmlar/          # butun papka chetlab o'tildi
!rasmlar/logo.png # BU ISHLAMAYDI

To'g'ri variant - papka o'rniga uning ichidagilarni ko'rsatish:

Natija
rasmlar/*
!rasmlar/logo.png

Allaqachon kuzatilayotgan fayl #

.gitignore kuzatilayotgan faylga ta'sir qilmaydi

Agar fayl allaqachon kommit qilingan bo'lsa, uni .gitignore ga qo'shish hech nima o'zgartirmaydi - Git uni kuzatishda davom etadi.

Avval kuzatuvdan chiqarish kerak:

Terminal
git rm --cached fayl.log
echo "*.log" >> .gitignore
git commit -m "Log fayllar kuzatuvdan chiqarildi"

Butun kesh ni tozalash:

Terminal
git rm -r --cached .
git add .
git commit -m ".gitignore qoidalari qo'llanildi"

Tekshirish #

Terminal
# Nima uchun bu fayl chetlab o'tilyapti?
git check-ignore -v storage/logs/xato.log
Natija
.gitignore:12:*.log    storage/logs/xato.log

12-satrdagi *.log qoidasi sabab bo'lgan.

Terminal
# Chetlab o'tilgan fayllarni ko'rish
git status --ignored

# Kuzatilayotgan fayllar ro'yxati
git ls-files

Bo'sh papka masalasi #

Git bo'sh papkani saqlamaydi

Git fayllarni kuzatadi, papkalarni emas. Bo'sh papka kommit qilinmaydi.

Agar papka tuzilmasi kerak bo'lsa (masalan, storage/cache/), ichiga .gitkeep nomli bo'sh fayl qo'ying:

Terminal
mkdir -p storage/cache
touch storage/cache/.gitkeep
git add storage/cache/.gitkeep

.gitkeep - rasmiy standart emas, shunchaki kelishuv. Nomi istalgancha bo'lishi mumkin.

Ichini yashirib, papkani saqlash:

Natija
storage/cache/*
!storage/cache/.gitkeep

Global .gitignore #

Muharrir va tizim fayllarini har bir loyihada takrorlamaslik uchun:

Terminal
git config --global core.excludesfile ~/.gitignore_global
Natija
# ~/.gitignore_global
.DS_Store
Thumbs.db
.idea/
.vscode/
*.swp
Loyiha .gitignore siga nima yozish kerak?

Loyihaga tegishli narsalar: node_modules/, vendor/, .env.

Sizga tegishli narsalar (muharriringiz, operatsion tizimingiz) global faylga yozilishi kerak - jamoadagi boshqalar boshqa muharrirdan foydalanadi.

Tayyor shablonlar #

GitHub har bir til uchun tayyor .gitignore shablonlarini saqlaydi:

Natija
github.com/github/gitignore

Yangi repozitoriy yaratayotganda GitHub o'zi taklif qiladi. PHP loyihasi uchun namuna:

Natija
/vendor/
composer.phar
.env
.env.backup
.phpunit.result.cache
storage/*.key
public/hot
public/storage
npm-debug.log
yarn-error.log

.gitattributes #

Bu fayl Git ga fayllar bilan qanday ishlashni aytadi:

Natija
# Satr oxirini avtomatik boshqarish
* text=auto

# Bu fayllar har doim LF bilan
*.sh text eol=lf
*.php text eol=lf

# Bu fayllar har doim CRLF bilan
*.bat text eol=crlf

# Bu fayllar ikkilik - diff ko'rsatma
*.png binary
*.jpg binary
*.pdf binary

# Arxivga kirmasin
tests/ export-ignore
.github/ export-ignore
Diff ni chiroyliroq qilish
Natija
*.php diff=php
*.css diff=css
*.html diff=html

Bu Git ga funksiya nomlarini tanib olishga yordam beradi - diff da @@ satrida qaysi funksiya ichida o'zgarish borligi ko'rinadi.

Fayllarni vaqtincha e'tiborsiz qoldirish #

Sozlama faylini o'zgartirdingiz, lekin kommit qilmoqchi emassiz:

Terminal
git update-index --skip-worktree config/local.php

# Qaytarish
git update-index --no-skip-worktree config/local.php

# Ro'yxatni ko'rish
git ls-files -v | grep "^S"
Bu vaqtinchalik yechim

--skip-worktree faqat sizning kompyuteringizda ishlaydi va uni unutib qo'yish oson. Keyin "nima uchun mening o'zgarishim push bo'lmayapti?" degan savol tug'iladi.

To'g'ri yechim - sozlamani .env ga chiqarish va .env.example faylini repozitoriyda saqlash.

Toza holatga keltirish #

Terminal
# Kuzatilmayotgan fayllarni ko'rish (o'chirmasdan)
git clean -n

# O'chirish
git clean -f

# Papkalar bilan birga
git clean -fd

# Chetlab o'tilgan fayllarni ham
git clean -fdx
git clean -fdx qaytarib bo'lmaydi

Bu buyruq kuzatilmayotgan hamma narsani o'chiradi - shu jumladan .env faylingizni va node_modules/ ni.

Har doim avval -n bilan tekshiring:

Terminal
git clean -ndx
Amaliy topshiriq
  1. Loyihangizda .gitignore fayl yarating.
  2. *.log, .env va node_modules/ ni chetlab o'ting.
  3. xato.log fayl yarating va git status da ko'rinmasligini tekshiring.
  4. git check-ignore -v xato.log bilan qaysi qoida ishlaganini ko'ring.
  5. Bir faylni kommit qiling, keyin uni .gitignore ga qo'shing - hali ham kuzatilayotganini ko'ring.
  6. git rm --cached bilan uni kuzatuvdan chiqaring.
  7. storage/cache/ papkasini .gitkeep bilan saqlang.
  8. git mv bilan bitta faylni boshqa papkaga ko'chiring va kommit qiling.
  9. git clean -n bilan qanday fayllar o'chirilishini ko'ring.

Xulosa #

  • git rm faylni ham diskdan, ham kuzatuvdan o'chiradi.
  • git rm --cached faylni diskda qoldiradi, faqat kuzatuvdan chiqaradi.
  • git mv - ko'chirish va nomini o'zgartirish uchun.
  • .gitignore keraksiz fayllarni kuzatuvdan chiqarib turadi.
  • .gitignore allaqachon kuzatilayotgan faylga ta'sir qilmaydi.
  • git check-ignore -v qaysi qoida ishlaganini ko'rsatadi.
  • Git bo'sh papkani saqlamaydi - .gitkeep ishlating.
  • Shaxsiy sozlamalarni global .gitignore ga chiqaring.
  • git clean ni har doim avval -n bilan sinang.

Keyingi bo'limda xatolarni bekor qilish yo'llarini o'rganamiz.

Xatolik topdingizmi?

Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.