git archive — loyihani arxivlash
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 parollaridist/, loglar,.DS_Store- Va bu — joriy holat,
v2.5.0emas: 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 —
.gitignoredagilar avtomatik chiqarib tashlanadi (11-dars) - ✅ Aynan
v2.5.0tegidagi 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,.gitignoredagilar — yo'q --format=zip|tar.gz;--prefix=nom/— bitta papka ichida- Papka bo'yicha:
git archive -o x.zip HEAD apps/web/ .gitattributesdaexport-ignore— testlar, CI ni chiqarib tashlashgit 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