git archive — loyihani arxivlash

~10 daq · Git · Ilg'or Git

Muammodan boshlaylik

Mijozga v2.5.0 versiyasining manba kodini yuborish kerak. Yoki serverga Git siz deploy qilish. Oddiy yo'l:

zip -r dokon.zip dokon/

Natija — 450 MB. Ichida:

  • .git/ — butun tarix (mijozga kerak emas, va unda eski sirlar bo'lishi mumkin!)
  • node_modules/ — 40 000 fayl
  • .env — production parollari
  • dist/, loglar, .DS_Store
  • Va bu — joriy holat, v2.5.0 emas: commit qilinmagan o'zgarishlaringiz ham

Kerak — Git dagi aniq versiyaning toza nusxasi, faqat kuzatiladigan fayllar bilan. Bu — git archive.


Asosiy foydalanish

git archive --format=zip --output=dokon-v2.5.0.zip v2.5.0

Natija — 2 MB:

  • ✅ Faqat Git kuzatadigan fayllar — .gitignore dagilar avtomatik chiqarib tashlanadi (11-dars)
  • ✅ Aynan v2.5.0 tegidagi holat — ishchi papkadagi o'zgarishlardan qat'i nazar
  • ❌ .git/ yo'q — tarix yo'q

Istalgan commit yoki branch:

git archive --output=dokon.zip HEAD
git archive --output=dokon.zip main
git archive --output=dokon.zip a3f9c2b

Formatlar

git archive --format=zip -o dokon.zip v2.5.0
git archive --format=tar.gz -o dokon.tar.gz v2.5.0
git archive -o dokon.tar.gz v2.5.0          # kengaytmadan avtomatik aniqlanadi
git archive --list                           # mavjud formatlar

Linux serverlar uchun — .tar.gz, odamlar uchun — .zip (Linux kursi, 31-dars).


Papka prefiksi

Standart holatda fayllar arxiv ildiziga tushadi — ochganda joriy papkaga "sochilib" ketadi. Prefiks bilan — hammasi bitta papkada:

git archive --prefix=dokon-2.5.0/ -o dokon-2.5.0.tar.gz v2.5.0
tar -tzf dokon-2.5.0.tar.gz | head -3
dokon-2.5.0/
dokon-2.5.0/.gitignore
dokon-2.5.0/README.md

Oxiridagi / muhim. GitHub Releases dagi (41-dars) avtomatik "Source code" arxivlari aynan shunday yaratiladi.


Faqat ma'lum papkalar

git archive -o frontend.zip HEAD apps/web/
git archive -o docs.zip v2.5.0 docs/ README.md LICENSE

.gitattributes bilan chiqarib tashlash

Ba'zi fayllar Git da kerak, lekin arxivda — yo'q: testlar, CI sozlamalari, ichki hujjatlar. .gitattributes (52-dars):

# .gitattributes
/tests              export-ignore
/.github            export-ignore
.gitattributes      export-ignore
.gitignore          export-ignore
/docs/ichki         export-ignore

Endi git archive bu fayllarni avtomatik o'tkazib yuboradi — GitHub dagi "Download ZIP" va reliz arxivlari ham. Composer kabi paket menejerlari ham shu arxivlardan foydalanadi: kutubxonangiz foydalanuvchilariga testlaringiz kerak emas.

Versiyani faylga yozish

# .gitattributes
VERSION   export-subst
# VERSION fayli
$Format:%H %cd$

Arxivda bu qator haqiqiy commit hash va sanaga almashtiriladi — "bu arxiv qaysi versiyadan?" degan savolga javob.


Masofaviy va pipe orqali

To'g'ridan-to'g'ri serverga, oraliq faylsiz (Linux kursi, 35-dars):

git archive --format=tar v2.5.0 | ssh deploy@dokon.uz "mkdir -p /opt/dokon/2.5.0 && tar -x -C /opt/dokon/2.5.0"

Git siz serverga aniq versiyani deploy qilish — bir qator.

GitHub dan arxiv olish (clone siz):

curl -L -o dokon.tar.gz https://github.com/otabek/dokon/archive/refs/tags/v2.5.0.tar.gz
gh release download v2.5.0 --archive=tar.gz

archive va bundle

Arxiv — tarixsiz fayllar. Agar tarix bilan to'liq repozitoriyni bitta faylga o'rash kerak bo'lsa (masalan, internetsiz joyga fleshka orqali):

git bundle create dokon.bundle --all
# ... boshqa kompyuterda:
git clone dokon.bundle dokon
git archive git bundle
Ichida Fayllar (bitta versiya) To'liq repozitoriy (tarix, branch lar)
Kimga Mijoz, server, foydalanuvchi Boshqa dasturchi, zaxira
Ochish unzip, tar git clone, git fetch

Nima uchun shunday?

Nima uchun oddiy zip emas, git archive?

Chunki zip disk holatini oladi, git archive esa Git holatini — va bu ikkisi turlicha narsa. Disk holatida — tasodifiy, vaqtinchalik va maxfiy narsalar: commit qilinmagan tajribalar, .env, build qoldiqlari, butun .git tarixi. Git holati esa — aniq, takrorlanadigan va ko'rib chiqilgan: v2.5.0 arxivini bugun yoki bir yildan keyin, sizning yoki hamkasbning kompyuterida yaratsangiz — natija bit-ma-bit bir xil. Bu reliz va deploy uchun aynan kerakli xususiyat. Va .gitignore bilan sozlangan himoya avtomatik ishlaydi — sir sizib chiqishi uchun hech kim "unutishi" shart emas.


Xulosa

Eslab qoling:

  • git archive -o fayl.zip <teg|branch|commit> — aniq versiyaning toza nusxasi
  • Faqat kuzatiladigan fayllar; .git, .gitignore dagilar — yo'q
  • --format=zip|tar.gz; --prefix=nom/ — bitta papka ichida
  • Papka bo'yicha: git archive -o x.zip HEAD apps/web/
  • .gitattributes da export-ignore — testlar, CI ni chiqarib tashlash
  • git archive ... | ssh server "tar -x -C ..." — Git siz deploy
  • Tarix bilan to'liq nusxa kerak bo'lsa — git bundle

Keyingi dars

49-dars: Bare Repository — server uchun repository