19-bo‘lim
Jamoaviy ish va yaxshi amaliyotlar
Katta fayllar, submodullar, monorepo, xavfsizlik, hujjatlar va kundalik ishning eng yaxshi odatlari.
Ushbu bo‘lim mundarijasi
Git ni bilish - bu bir narsa. Uni jamoada to'g'ri ishlatish - butunlay boshqa mahorat.
Katta fayllar va Git LFS #
Har bir rasm versiyasi to'liq saqlanadi - Git ular orasidagi farqni hisoblay olmaydi.
10 MB lik dizayn fayli 20 marta o'zgartirilsa - repozitoriy 200 MB ga o'sadi. Va bu abadiy qoladi: faylni o'chirsangiz ham tarixda turaveradi.
Git LFS (Large File Storage) buni hal qiladi:
# O'rnatish
git lfs install
# Qaysi fayllarni LFS orqali saqlash
git lfs track "*.psd"
git lfs track "*.mp4"
git lfs track "*.zip"
# .gitattributes avtomatik yaratiladi
git add .gitattributes
git commit -m "chore: LFS sozlandi"
# .gitattributes
*.psd filter=lfs diff=lfs merge=lfs -text
*.mp4 filter=lfs diff=lfs merge=lfs -text
# Holat
git lfs ls-files
git lfs status
Repozitoriyda faylning o'zi emas, kichik matnli ko'rsatkich saqlanadi:
version https://git-lfs.github.com/spec/v1
oid sha256:4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393
size 12480
Haqiqiy fayl alohida serverda turadi va faqat kerak bo'lganda yuklanadi.
GitHub bepul rejada 1 GB saqlash va oyiga 1 GB trafik beradi. Katta media loyihalarda buni hisobga oling.
Submodullar #
Boshqa repozitoriyni loyiha ichiga qo'shish:
git submodule add https://github.com/kimdir/kutubxona.git vendor/kutubxona
git commit -m "chore: kutubxona submodul sifatida qo'shildi"
# .gitmodules
[submodule "vendor/kutubxona"]
path = vendor/kutubxona
url = https://github.com/kimdir/kutubxona.git
# Submodulli loyihani klonlash
git clone --recurse-submodules https://github.com/husanboy/loyiha.git
# Yoki keyin
git submodule update --init --recursive
# Submodullarni yangilash
git submodule update --remote
# Barcha submodullarda buyruq bajarish
git submodule foreach 'git pull origin main'
Ular ma'lum kommitga bog'lanadi, tarmoqqa emas. Bu ko'p muammo tug'diradi:
- Jamoadagilar
--initni unutadi va bo'sh papka oladi - Submoduldagi o'zgarish asosiy repozitoriyda ko'rinmaydi
- Har bir yangilanish alohida kommit talab qiladi
Alternativa: paket menejeridan foydalaning - Composer, npm, pip. Ular shu vazifani ancha yaxshi bajaradi.
Monorepo #
Bir nechta loyihani bitta repozitoriyda saqlash:
loyiha/
├── ilovalar/
│ ├── veb/
│ ├── admin/
│ └── api/
├── paketlar/
│ ├── umumiy/
│ └── ui/
└── hujjatlar/
| Afzalligi | Kamchiligi |
|---|---|
| Bitta joyda hamma kod | Repozitoriy kattalashadi |
| Atomik o'zgarishlar (bir PR - bir necha loyiha) | CI murakkablashadi |
| Kodni ulashish oson | Huquqlarni ajratish qiyin |
| Bir xil vositalar va standartlar | Klonlash sekinlashadi |
# Faqat o'zgargan qismni sinash
on:
push:
paths:
- 'ilovalar/veb/**'
- 'paketlar/umumiy/**'
# Katta monorepo uchun - qisman klonlash
git clone --filter=blob:none --sparse https://github.com/.../monorepo.git
cd monorepo
git sparse-checkout set ilovalar/veb paketlar/umumiy
Xavfsizlik #
- Parollar va API kalitlari
- SSH va SSL maxfiy kalitlari
- Baza zaxira nusxalari (
.sql) .envfayllar- Mijozlar shaxsiy ma'lumotlari
- Ichki hujjatlar va shartnomalar
Tasodifan tushib qolsa #
# 1. DARHOL parolni almashtiring
# Tarixdan o'chirish YETARLI EMAS - u allaqachon ko'chirilgan bo'lishi mumkin
# 2. Keyin tarixdan tozalang
pip install git-filter-repo
git filter-repo --path .env --invert-paths
# 3. Majburan yuborish (jamoani ogohlantiring!)
git push origin --force --all
git push origin --force --tags
# 4. Jamoa qayta klonlashi kerak
Bu barcha kommit xeshlarini o'zgartiradi. Jamoadagi hamma:
- Ishini saqlab qo'yishi
- Repozitoriyni qayta klonlashi kerak
Buni qilishdan oldin albatta hammani ogohlantiring.
Oldini olish #
# Sirlarni qidiruvchi vositalar
pip install detect-secrets
detect-secrets scan > .secrets.baseline
# gitleaks
gitleaks detect --source .
# .github/workflows/xavfsizlik.yml
- name: Sirlarni tekshirish
uses: gitleaks/gitleaks-action@v2
GitHub o'zi ham Secret scanning bilan mashhur xizmatlar kalitlarini avtomatik aniqlaydi va sizni ogohlantiradi.
Repozitoriy tuzilishi #
loyiha/
├── .github/
│ ├── workflows/ # CI/CD
│ ├── ISSUE_TEMPLATE/ # Issue shablonlari
│ ├── pull_request_template.md
│ └── CODEOWNERS
├── .githooks/ # umumiy hook lar
├── manba/ # asosiy kod
├── testlar/
├── hujjatlar/
├── .editorconfig
├── .gitattributes
├── .gitignore
├── .env.example
├── CHANGELOG.md
├── CONTRIBUTING.md
├── LICENSE
└── README.md
.editorconfig #
root = true
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
indent_style = space
indent_size = 4
[*.{yml,yaml,json}]
indent_size = 2
[*.md]
trim_trailing_whitespace = false
Barcha zamonaviy muharrirlar .editorconfig ni tan oladi.
Otstup va satr oxiri butun jamoada bir xil bo'ladi - "butun fayl
o'zgaribdi" muammosi yo'qoladi.
Litsenziya tanlash #
| Litsenziya | Ma'nosi |
|---|---|
| MIT | Deyarli hamma narsa mumkin, mualliflikni saqlash sharti bilan |
| Apache 2.0 | MIT ga o'xshash + patent himoyasi |
| GPL v3 | Sizning kodingizdan foydalangan loyiha ham ochiq bo'lishi shart |
| Litsenziyasiz | Hech kim foydalana olmaydi (barcha huquqlar muallifda) |
choosealicense.com yordam beradi.
Ko'pchilik "GitHub da ochiq bo'lsa - foydalansa bo'ladi" deb o'ylaydi. Bu noto'g'ri.
Litsenziya bo'lmasa, standart mualliflik huquqi amal qiladi: hech kim kodingizni ishlatishi, nusxalashi yoki o'zgartirishi mumkin emas.
Kundalik odatlar #
1. Kunni pull bilan boshlang
git switch main && git pull
2. Kichik va mazmunli kommit qiling Bitta kommit - bitta mantiqiy o'zgarish. "Hamma narsa" degan kommit yozmang.
3. Kommitdan oldin git diff --staged ni o'qing
Nima kommit qilayotganingizni bilib turing.
4. Kunni push bilan tugating Kompyuter buzilsa, ishingiz serverda qoladi.
5. Tarmoqni uzoq ushlab turmang Bir haftadan oshsa - konflikt kafolatlangan.
6. Tarmoqni tez-tez main bilan yangilang
git fetch origin && git rebase origin/main
7. Merge qilingan tarmoqlarni o'chiring
8. main ga to'g'ridan-to'g'ri push qilmang
| Odat | Nima uchun yomon |
|---|---|
| Kuniga bitta ulkan kommit | Xatoni topib bo'lmaydi, revert qilib bo'lmaydi |
| "fix", "update", "asdf" xabarlari | Tarix ma'nosiz bo'lib qoladi |
git add . ni ko'rmasdan | Keraksiz fayl tushib qoladi |
main ga to'g'ridan-to'g'ri push | Tekshiruvsiz kod ishlab chiqarishda |
--force ulashilgan tarmoqda | Hamkasbning ishi yo'qoladi |
| Vendor papkasini kommit qilish | Repozitoriy og'irlashadi |
| Bir haftalik tarmoq | Ulkan konflikt |
Foydali sozlamalar #
# Chiroyli tarix
git config --global alias.tarix "log --graph --pretty=format:'%C(yellow)%h%Creset %C(blue)%an%Creset %C(green)%ar%Creset%C(auto)%d%Creset %s'"
# Oxirgi kommit
git config --global alias.oxirgi "log -1 HEAD --stat"
# Sahnadagi farq
git config --global alias.tekshir "diff --staged"
# Tarmoqlar oxirgi faollik bo'yicha
git config --global alias.tarmoqlar "branch --sort=-committerdate -v"
# Kommitni bekor qilish
git config --global alias.bekor "reset --soft HEAD~1"
# Barcha o'zgarishlarni kommit qilish
git config --global alias.hammasi "!git add -A && git commit -m"
git tarix -10
git oxirgi
git hammasi "feat: yangi imkoniyat"
Xatolarni oldini olish #
# main ga tasodifan push qilishni taqiqlash
git config branch.main.pushRemote no_push
# Har doim rebase bilan pull
git config --global pull.rebase true
# Push da faqat joriy tarmoq
git config --global push.default current
# Fayl nomlaridagi katta-kichik harf farqini sezish
git config --global core.ignorecase false
# Ranglar
git config --global color.ui auto
Hujjatlashtirish #
| Fayl | Nima yoziladi |
|---|---|
README.md | Loyiha nima, qanday ishga tushiriladi |
CONTRIBUTING.md | Ish oqimi, kod uslubi, PR talablari |
CHANGELOG.md | Versiyalar bo'yicha o'zgarishlar |
LICENSE | Foydalanish shartlari |
.env.example | Kerakli muhit o'zgaruvchilari (qiymatsiz) |
hujjatlar/ | Arxitektura, API, qarorlar |
Arxitektura qarorlari (ADR) #
# 003. Ma'lumotlar bazasi sifatida MySQL tanlandi
Sana: 2026-06-15
Holat: Qabul qilindi
## Kontekst
Loyihaga relyatsion baza kerak. PostgreSQL va MySQL ko'rib chiqildi.
## Qaror
MySQL 8.0 tanlandi.
## Sabablar
- Jamoada MySQL tajribasi ko'proq
- Hosting provayderi MySQL ni standart qo'llab-quvvatlaydi
- Loyiha talablari PostgreSQL ning ilg'or imkoniyatlarini talab qilmaydi
## Oqibatlari
- JSON bilan ishlash PostgreSQL dagidek qulay bo'lmaydi
- Kelajakda migratsiya kerak bo'lsa, qo'shimcha ish talab qilinadi
Har bir muhim qaror uchun shunday fayl - bir yildan keyin "nima uchun shunday qilgan edik?" degan savolga javob beradi.
- Loyihangizda
.editorconfigyarating. LICENSEfayl qo'shing (MIT tavsiya etiladi).CONTRIBUTING.mdyozing..env.exampleyarating - haqiqiy qiymatlarsiz.- Kamida 5 ta foydali
aliassozlang. git lfs track "*.psd"ni sinab ko'ring.- Bitta ADR hujjati yozing.
- Repozitoriyingizni yuqoridagi tuzilma bo'yicha qayta tartibga soling.
- "Yomon odatlar" jadvalini o'qing va o'zingizda qaysi biri borligini belgilang.
gitleaksyokidetect-secretsbilan repozitoriyingizni skanerlang.
Xulosa #
- Katta ikkilik fayllar uchun Git LFS ishlating - ular tarixda abadiy qoladi.
- Submodullar chalkash - paket menejeri ko'pincha yaxshiroq yechim.
- Monorepo kodni ulashishni osonlashtiradi, lekin CI ni murakkablashtiradi.
- Sir tushib qolsa - avval parolni almashtiring, keyin tarixni tozalang.
.editorconfigformatlash konfliktlarini oldini oladi.- Litsenziyasiz repozitoriydan hech kim qonuniy foydalana olmaydi.
- Kunni
pullbilan boshlang,pushbilan tugating. - Kommitlar kichik va mazmunli bo'lsin.
- Tarmoqni bir haftadan ortiq ushlab turmang.
- ADR hujjatlari muhim qarorlar sababini saqlaydi.
Keyingi - yakuniy bo'lim: to'liq amaliy loyiha.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
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.