19-bo‘lim

Jamoaviy ish va yaxshi amaliyotlar

Katta fayllar, submodullar, monorepo, xavfsizlik, hujjatlar va kundalik ishning eng yaxshi odatlari.

🕑 15 daqiqa o‘qish 📄 898 so‘z 👁 5 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Katta fayllar va Git LFS
  2. Submodullar
  3. Monorepo
  4. Xavfsizlik
  5. Tasodifan tushib qolsa
  6. Oldini olish
  7. Repozitoriy tuzilishi
  8. .editorconfig
  9. Litsenziya tanlash
  10. Kundalik odatlar
  11. Foydali sozlamalar
  12. Xatolarni oldini olish
  13. Hujjatlashtirish
  14. Arxitektura qarorlari (ADR)
  15. Xulosa

Git ni bilish - bu bir narsa. Uni jamoada to'g'ri ishlatish - butunlay boshqa mahorat.

Katta fayllar va Git LFS #

Git ikkilik fayllarni yaxshi ko'rmaydi

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:

Terminal
# 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"
Natija
# .gitattributes
*.psd filter=lfs diff=lfs merge=lfs -text
*.mp4 filter=lfs diff=lfs merge=lfs -text
Terminal
# Holat
git lfs ls-files
git lfs status
LFS qanday ishlaydi?

Repozitoriyda faylning o'zi emas, kichik matnli ko'rsatkich saqlanadi:

Natija
version https://git-lfs.github.com/spec/v1
oid sha256:4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393
size 12480

Haqiqiy fayl alohida serverda turadi va faqat kerak bo'lganda yuklanadi.

LFS kvotasi cheklangan

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:

Terminal
git submodule add https://github.com/kimdir/kutubxona.git vendor/kutubxona
git commit -m "chore: kutubxona submodul sifatida qo'shildi"
Natija
# .gitmodules
[submodule "vendor/kutubxona"]
    path = vendor/kutubxona
    url = https://github.com/kimdir/kutubxona.git
Terminal
# 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'
Submodullar chalkash

Ular ma'lum kommitga bog'lanadi, tarmoqqa emas. Bu ko'p muammo tug'diradi:

  • Jamoadagilar --init ni 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:

Natija
loyiha/
├── ilovalar/
│   ├── veb/
│   ├── admin/
│   └── api/
├── paketlar/
│   ├── umumiy/
│   └── ui/
└── hujjatlar/
AfzalligiKamchiligi
Bitta joyda hamma kodRepozitoriy kattalashadi
Atomik o'zgarishlar (bir PR - bir necha loyiha)CI murakkablashadi
Kodni ulashish osonHuquqlarni ajratish qiyin
Bir xil vositalar va standartlarKlonlash sekinlashadi
YAML
# Faqat o'zgargan qismni sinash
on:
  push:
    paths:
      - 'ilovalar/veb/**'
      - 'paketlar/umumiy/**'
Terminal
# 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 #

Repozitoriyga hech qachon tushmasligi kerak
  • Parollar va API kalitlari
  • SSH va SSL maxfiy kalitlari
  • Baza zaxira nusxalari (.sql)
  • .env fayllar
  • Mijozlar shaxsiy ma'lumotlari
  • Ichki hujjatlar va shartnomalar

Tasodifan tushib qolsa #

Terminal
# 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
Tarixni qayta yozish - oxirgi chora

Bu barcha kommit xeshlarini o'zgartiradi. Jamoadagi hamma:

  • Ishini saqlab qo'yishi
  • Repozitoriyni qayta klonlashi kerak

Buni qilishdan oldin albatta hammani ogohlantiring.

Oldini olish #

Terminal
# Sirlarni qidiruvchi vositalar
pip install detect-secrets
detect-secrets scan > .secrets.baseline

# gitleaks
gitleaks detect --source .
YAML
# .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 #

Natija
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 #

INI
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
Bu bitta fayl ko'p konfliktdan saqlaydi

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 #

LitsenziyaMa'nosi
MITDeyarli hamma narsa mumkin, mualliflikni saqlash sharti bilan
Apache 2.0MIT ga o'xshash + patent himoyasi
GPL v3Sizning kodingizdan foydalangan loyiha ham ochiq bo'lishi shart
LitsenziyasizHech kim foydalana olmaydi (barcha huquqlar muallifda)

choosealicense.com yordam beradi.

Litsenziyasiz repozitoriy

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 #

Kundalik tsikl 1. pull - yangilanish 2. tarmoq yaratish 3. kichik kommitlar 4. push va PR 5. tekshiruv, merge Har kuni takrorlanadi
Oddiy va takrorlanuvchi tsikl - chalkashlikning eng yaxshi dushmani
Yaxshi odatlar

1. Kunni pull bilan boshlang

Terminal
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

Terminal
git fetch origin && git rebase origin/main

7. Merge qilingan tarmoqlarni o'chiring

8. main ga to'g'ridan-to'g'ri push qilmang

Yomon odatlar
OdatNima uchun yomon
Kuniga bitta ulkan kommitXatoni topib bo'lmaydi, revert qilib bo'lmaydi
"fix", "update", "asdf" xabarlariTarix ma'nosiz bo'lib qoladi
git add . ni ko'rmasdanKeraksiz fayl tushib qoladi
main ga to'g'ridan-to'g'ri pushTekshiruvsiz kod ishlab chiqarishda
--force ulashilgan tarmoqdaHamkasbning ishi yo'qoladi
Vendor papkasini kommit qilishRepozitoriy og'irlashadi
Bir haftalik tarmoqUlkan konflikt

Foydali sozlamalar #

Terminal
# 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"
Terminal
git tarix -10
git oxirgi
git hammasi "feat: yangi imkoniyat"

Xatolarni oldini olish #

Terminal
# 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 #

Loyihada bo'lishi kerak bo'lgan hujjatlar
FaylNima yoziladi
README.mdLoyiha nima, qanday ishga tushiriladi
CONTRIBUTING.mdIsh oqimi, kod uslubi, PR talablari
CHANGELOG.mdVersiyalar bo'yicha o'zgarishlar
LICENSEFoydalanish shartlari
.env.exampleKerakli muhit o'zgaruvchilari (qiymatsiz)
hujjatlar/Arxitektura, API, qarorlar

Arxitektura qarorlari (ADR) #

MARKDOWN
# 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.

Amaliy topshiriq
  1. Loyihangizda .editorconfig yarating.
  2. LICENSE fayl qo'shing (MIT tavsiya etiladi).
  3. CONTRIBUTING.md yozing.
  4. .env.example yarating - haqiqiy qiymatlarsiz.
  5. Kamida 5 ta foydali alias sozlang.
  6. git lfs track "*.psd" ni sinab ko'ring.
  7. Bitta ADR hujjati yozing.
  8. Repozitoriyingizni yuqoridagi tuzilma bo'yicha qayta tartibga soling.
  9. "Yomon odatlar" jadvalini o'qing va o'zingizda qaysi biri borligini belgilang.
  10. gitleaks yoki detect-secrets bilan 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.
  • .editorconfig formatlash konfliktlarini oldini oladi.
  • Litsenziyasiz repozitoriydan hech kim qonuniy foydalana olmaydi.
  • Kunni pull bilan boshlang, push bilan 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.

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.