مخزنی دیگر درون مخزن شما، سنجاقشده به یک کامیت: یک کیت رابط کاربری مشترک، یک کتابخانهٔ آوردهشده، یک دیتاست. zev خودش در clone، checkout و pull آن را میآورد و بهروز میکند، سنجاق را در فایلی نگه میدارد که بازبینی میکنید، و کاری را که درونش انجام شده هرگز دور نمیریزد. همان چیزی که زیرماژولهای Git باید میبودند.
گاهی یک پروژه به پروژهای دیگر با نسخهای دقیق درون خودش نیاز دارد، مثل کیت رابط کاربریای که سه برنامه از آن استفاده میکنند، کتابخانهای که وصلهاش میکنید، یا یک دیتاست. پاسخ Git زیرماژولهاست، و بیشتر کسانی که با آنها کار کردهاند از آنها دوری میکنند:
- `--recursive` را فراموش کنید و پوشه خالی است؛
- کد درونش روی HEAD جداشده است، پس کاری که آنجا انجام میشود بهآسانی گم میشود؛
- نسخهای که به آن وابستهاید ورودیای نامرئی است که بازبینیها نشانش نمیدهند.
**زیرمخزنهای** zev ایده را نگه میدارند و تلهها را کنار میگذارند.
```diagram
type: cards
title: تفاوت زیرمخزنها با زیرماژولها
---
📄 | سنجاق فایلی است که میخوانید | .zevsubs نشانی، شاخه و کامیت هرکدام را فهرست میکند؛ هر تغییرش در هر دیف و بازبینی دیده میشود
🔁 | چیزی برای به یاد سپردن نیست | zev clone، checkout و pull خودشان زیرمخزنها را میآورند و سر سنجاقشان میگذارند
🛟 | کار شما امن است | زیرمخزنی با تغییرات ذخیرهنشده یا کامیتهای خودش هرگز جابهجا نمیشود؛ zev بهجایش این را میگوید
🌿 | همیشه روی یک شاخه | HEAD جداشدهای در کار نیست: درونش مثل هر مخزنی کامیت کنید
```
## افزودن
```bash
zev sub add zaryn/ui-kit lib/ui
```
zev مخزن را در `lib/ui` کلون میکند، نشانی، شاخه و کامیت کنونیاش را در `.zevsubs` مینویسد و آن فایل را مرحلهبندی میکند. کامیتش کنید:
```bash
zev commit -m "استفاده از کیت رابط کاربری مشترک"
```
```text
# Subrepositories: see them with zev sub, fetch them with zev sub update.
[lib/ui]
url = zaryn/ui-kit
branch = main
commit = 8fef7c70fd8de3da1fed658b65bab8d1c3296c6f07f4e550274e43a3fde39a9c
```
مخزن والد هرگز فایلهای زیرمخزن را ردیابی نمیکند. `zev status` و `zev add .` کاری به آنها ندارند، چون آن فایلها به تاریخچهٔ خود زیرمخزن تعلق دارند.
## همه آن را با همان نسخه میگیرند
```bash
zev clone you/app
sub lib/ui: fetched, at its pin
```
یک کلون هر زیرمخزن را میآورد و سر کامیت سنجاقشدهاش میگذارد. `zev checkout`، `zev switch` و `zev pull` هم هر وقت سنجاق عوض شود همین کار را میکنند: به شاخهای بروید که نسخهای قدیمیتر را سنجاق کرده و زیرمخزن دنبالش میآید، برگردید و آن هم برمیگردد. نه `--recursive` لازم است و نه گام بهروزرسانی جداگانه.
## رفتن به نسخهای تازهتر
```bash
zev sub pull # شاخهٔ هر زیرمخزن را pull و آنچه آمد را سنجاق میکند
zev commit -m "کیت رابط کاربری ۲٫۴"
```
`zev sub pin` آنچه یک زیرمخزن اکنون در آن است را ثبت میکند، مثلاً پس از اینکه اصلاحی را درونش کامیت کردهاید. آن اصلاح را از درون زیرمخزن هم push کنید تا دیگران بتوانند کامیتی را که سنجاق کردهاید بیاورند.
## ببینید کجا هستند
```bash
$ zev sub
✓ lib/ui zaryn/ui-kit @ 8fef7c70
at its pin
! vendor/parser zaryn/parser @ 1c2d3e4f
has commits newer than the pin: zev sub pin records them
```
هر زیرمخزن یا سر سنجاقش است، یا پشت آن، یا جلوتر از آن (کامیتهای خودتان)، یا جای دیگر، یا نیست، یا تغییرات ذخیرهنشده دارد، و zev برای هرکدام میگوید چه چیزی را اجرا کنید. `--brief` برای هرکدام یک خط میدهد و `--json` مسیر، نشانی، شاخه، سنجاق، کامیت کنونی، وضعیت و شمار تغییرات را.
## کار شما درون آن هرگز گم نمیشود
زیرمخزن مخزنی عادی روی شاخهای عادی است. `cd lib/ui` کنید، ویرایش، کامیت و push کنید، مثل همیشه. zev تنها وقتی جابهجایش میکند که چیزی از دست نرود:
- **تغییرات ذخیرهنشده** درونش: zev هرگز جابهجایش نمیکند و این را میگوید؛
- **کامیتهای خودتان** فراتر از سنجاق: عوض کردن شاخهٔ والد آن را دستنخورده میگذارد و دلیلش را میگوید. `zev sub pin` آنها را ثبت میکند؛ `zev sub update --force` آن را به سنجاق برمیگرداند، و `zev undo` درون زیرمخزن این را برمیگرداند.
## دستورها
```text
zev sub هرکدام کجاست و چه نیاز دارد
zev sub add <address> <folder> [--branch B] آوردن یک مخزن، سنجاقشده
zev sub update [<folder>…] [--force] آوردن، و گذاشتن هرکدام سر سنجاقش
zev sub pin [<folder>…] ثبت کامیت کنونی هرکدام
zev sub pull [<folder>…] pull شاخهٔ هرکدام، سپس سنجاق
zev sub remove <folder> دیگر اینجا دنبالش نکن (فایلهایش میمانند)
```
## آمدن از زیرماژولهای Git
`zev import-git` زیرماژولهایی را که پیدا کرده فهرست میکند. وقتی مخزنهایشان روی zev بود (آنها را هم با `zev import-git` بیاورید)، برای هرکدام `zev sub add <address> <folder>` را اجرا کنید.
| زیرماژولهای Git | زیرمخزنهای zev |
|---|---|
| `git clone --recursive`، یا پس از آن `git submodule update --init` | `zev clone`؛ پس از آن هیچ |
| یک ورودی درخت و `.gitmodules`؛ نسخه در بازبینیها دیده نمیشود | `.zevsubs`، یک فایل خوانا که کامیت در آن است |
| HEAD جداشده درونش | روی یک شاخه |
| `git submodule update` میتواند کامیتهای ساختهشده درونش را دور بریزد | بی `--force` هرگز روی کار ذخیرهنشده یا کامیتهای خودتان جابهجا نمیشود، و برگشتپذیر است |
| `git status` دربارهٔ وضعیت درونش چیز کمی میگوید | `zev sub` میگوید هرکدام کجاست و چه چیزی را اجرا کنید |
همچنین ببینید: [شاخهها و ادغام](/docs/fa/branches)، [مهاجرت از Git](/docs/fa/from-git).
گاهی یک پروژه به پروژهای دیگر با نسخهای دقیق درون خودش نیاز دارد، مثل کیت رابط کاربریای که سه برنامه از آن استفاده میکنند، کتابخانهای که وصلهاش میکنید، یا یک دیتاست. پاسخ Git زیرماژولهاست، و بیشتر کسانی که با آنها کار کردهاند از آنها دوری میکنند:
--recursive را فراموش کنید و پوشه خالی است؛
کد درونش روی HEAD جداشده است، پس کاری که آنجا انجام میشود بهآسانی گم میشود؛
نسخهای که به آن وابستهاید ورودیای نامرئی است که بازبینیها نشانش نمیدهند.
زیرمخزنهای zev ایده را نگه میدارند و تلهها را کنار میگذارند.
تفاوت زیرمخزنها با زیرماژولها
📄
سنجاق فایلی است که میخوانید
.zevsubs نشانی، شاخه و کامیت هرکدام را فهرست میکند؛ هر تغییرش در هر دیف و بازبینی دیده میشود
🔁
چیزی برای به یاد سپردن نیست
zev clone، checkout و pull خودشان زیرمخزنها را میآورند و سر سنجاقشان میگذارند
🛟
کار شما امن است
زیرمخزنی با تغییرات ذخیرهنشده یا کامیتهای خودش هرگز جابهجا نمیشود؛ zev بهجایش این را میگوید
🌿
همیشه روی یک شاخه
HEAD جداشدهای در کار نیست: درونش مثل هر مخزنی کامیت کنید
zev مخزن را در lib/ui کلون میکند، نشانی، شاخه و کامیت کنونیاش را در .zevsubs مینویسد و آن فایل را مرحلهبندی میکند. کامیتش کنید:
Terminal
zev commit -m "استفاده از کیت رابط کاربری مشترک"
Text
# Subrepositories: see them with zev sub, fetch them with zev sub update.[lib/ui]url = zaryn/ui-kitbranch = maincommit = 8fef7c70fd8de3da1fed658b65bab8d1c3296c6f07f4e550274e43a3fde39a9c
مخزن والد هرگز فایلهای زیرمخزن را ردیابی نمیکند. zev status و zev add . کاری به آنها ندارند، چون آن فایلها به تاریخچهٔ خود زیرمخزن تعلق دارند.
یک کلون هر زیرمخزن را میآورد و سر کامیت سنجاقشدهاش میگذارد. zev checkout، zev switch و zev pull هم هر وقت سنجاق عوض شود همین کار را میکنند: به شاخهای بروید که نسخهای قدیمیتر را سنجاق کرده و زیرمخزن دنبالش میآید، برگردید و آن هم برمیگردد. نه --recursive لازم است و نه گام بهروزرسانی جداگانه.
zev sub pull # شاخهٔ هر زیرمخزن را pull و آنچه آمد را سنجاق میکندzev commit -m "کیت رابط کاربری ۲٫۴"
zev sub pin آنچه یک زیرمخزن اکنون در آن است را ثبت میکند، مثلاً پس از اینکه اصلاحی را درونش کامیت کردهاید. آن اصلاح را از درون زیرمخزن هم push کنید تا دیگران بتوانند کامیتی را که سنجاق کردهاید بیاورند.
$ zev sub✓ lib/ui zaryn/ui-kit @ 8fef7c70 at its pin! vendor/parser zaryn/parser @ 1c2d3e4f has commits newer than the pin: zev sub pin records them
هر زیرمخزن یا سر سنجاقش است، یا پشت آن، یا جلوتر از آن (کامیتهای خودتان)، یا جای دیگر، یا نیست، یا تغییرات ذخیرهنشده دارد، و zev برای هرکدام میگوید چه چیزی را اجرا کنید. --brief برای هرکدام یک خط میدهد و --json مسیر، نشانی، شاخه، سنجاق، کامیت کنونی، وضعیت و شمار تغییرات را.
زیرمخزن مخزنی عادی روی شاخهای عادی است. cd lib/ui کنید، ویرایش، کامیت و push کنید، مثل همیشه. zev تنها وقتی جابهجایش میکند که چیزی از دست نرود:
تغییرات ذخیرهنشده درونش: zev هرگز جابهجایش نمیکند و این را میگوید؛
کامیتهای خودتان فراتر از سنجاق: عوض کردن شاخهٔ والد آن را دستنخورده میگذارد و دلیلش را میگوید. zev sub pin آنها را ثبت میکند؛ zev sub update --force آن را به سنجاق برمیگرداند، و zev undo درون زیرمخزن این را برمیگرداند.
zevsubهرکدام کجاست و چه نیاز داردzevsubadd<address><folder>[--branch B]آوردنیکمخزن،سنجاقشدهzevsubupdate[<folder>…][--force]آوردن، و گذاشتن هرکدام سر سنجاقشzevsubpin[<folder>…]ثبت کامیت کنونی هرکدامzevsubpull[<folder>…]pull شاخهٔ هرکدام، سپس سنجاقzevsubremove<folder>دیگر اینجا دنبالش نکن (فایلهایش میمانند)
zev import-git زیرماژولهایی را که پیدا کرده فهرست میکند. وقتی مخزنهایشان روی zev بود (آنها را هم با zev import-git بیاورید)، برای هرکدام zev sub add <address> <folder> را اجرا کنید.
زیرماژولهای Git
زیرمخزنهای zev
git clone --recursive، یا پس از آن git submodule update --init
zev clone؛ پس از آن هیچ
یک ورودی درخت و .gitmodules؛ نسخه در بازبینیها دیده نمیشود
.zevsubs، یک فایل خوانا که کامیت در آن است
HEAD جداشده درونش
روی یک شاخه
git submodule update میتواند کامیتهای ساختهشده درونش را دور بریزد
بی --force هرگز روی کار ذخیرهنشده یا کامیتهای خودتان جابهجا نمیشود، و برگشتپذیر است
git status دربارهٔ وضعیت درونش چیز کمی میگوید
zev sub میگوید هرکدام کجاست و چه چیزی را اجرا کنید