# کامیت‌های امضاشده

> zev هر کامیت تازه را روی رایانهٔ شما با کلید Ed25519 مخزن امضا می‌کند. کلید را یک بار به حساب‌تان بیفزایید تا Zaryn آن کامیت‌ها را با نام شما «تأییدشده» نشان دهد.

Source: https://zaryn.xyz/docs/fa/signed-commits

هر کامیت می‌گوید چه کسی آن را نوشته، اما هر کسی می‌تواند هر نامی را در تنظیمات zev خود بنویسد. **امضا** ثابت می‌کند کدام کلید کامیت را ساخته است. zev هر کامیت تازه را روی رایانهٔ شما امضا می‌کند و Zaryn کامیت را تنها وقتی **تأییدشده** نشان می‌دهد که کلیدِ امضاکننده روی همان حسابی باشد که نامش آمده.

```diagram
type: cards
title: معنای هر برچسب
---
✓ | تأییدشده | امضای درست با کلیدی که روی یک حساب است؛ فهرست کامیت‌ها نام آن حساب را می‌آورد
✍ | امضاشده | امضای درست با کلیدی که هنوز هیچ حسابی آن را نیفزوده
· | بی‌برچسب | بی‌امضا، مثلاً کامیتی که با commit.sign false ساخته شده
```

## چطور کار می‌کند

```diagram
type: sequence
title: از zev commit تا تأییدشده
lanes: رایانهٔ شما | Zaryn
alt: zev commit هش کامیت را با کلید مخزن امضا می‌کند و امضا را در ‎.zev/signatures نگه می‌دارد؛ zev push کامیت و سپس امضاها را می‌فرستد؛ Zaryn هر امضا را با کامیتش می‌سنجد و اگر کلید روی حسابی باشد آن را تأییدشده نشان می‌دهد
---
note رایانهٔ شما : zev commit: امضای «zev commit <hash>» با ‎.zev/identity | accent
رایانهٔ شما -> Zaryn : zev push: اشیای کامیت، سپس امضاهایش
note Zaryn : سنجش هر امضا با هش کامیتش؛ نخستین امضا می‌ماند | good
Zaryn --> رایانهٔ شما : چند امضا نگه داشته شد و چندتا روی حساب شما تأییدشده است
```

- امضا هش کامیت را می‌پوشاند و هش، فایل‌ها، پیام، نویسنده و کامیت والد را. یک بایت را عوض کنید و امضا دیگر جور نمی‌شود.
- هر مخزن کلید خودش را دارد، در ‎`.zev/identity`. دستور `zev signing-key` آن را چاپ می‌کند.
- zev امضاها را در ‎`.zev/signatures` نگه می‌دارد و در push بعدی، پس از کامیت‌ها، می‌فرستد. امضایی که سرور دارد دوباره فرستاده نمی‌شود.
- سرور هر امضا را پیش از نگه‌داشتن می‌سنجد. هر کامیت نخستین امضایش را نگه می‌دارد: امضای بعدی جای آن را نمی‌گیرد.

## کامیت‌هایتان را تأییدشده نشان دهید

در هر مخزنی که از آن push می‌کنید یک بار این را اجرا کنید:

```bash
zev signing-key add --label laptop
```

zev کلید عمومی مخزن را به حساب شما می‌فرستد. از آن پس هر کامیتی که امضا کرده، در فهرست کامیت‌ها و صفحهٔ کامیت با نام شما **✓ تأییدشده** نشان داده می‌شود. کامیت‌هایی که پیش از افزودن کلید امضا شده‌اند هم حساب می‌شوند.

کلید را در وب هم می‌توانید بیفزایید: **امنیت ← کلیدهای امضای کامیت**. در مخزن `zev signing-key` را اجرا کنید و کلیدی را که چاپ می‌کند بچسبانید.

```diagram
type: flow
title: چرا Zaryn هرگز خودش کلیدی را به حسابی پیوند نمی‌دهد
---
push گواه نیست | توکن push ممکن است لو برود؛ چیزی دربارهٔ صاحب کلید نمی‌گوید | warn | 🔑
~ zev signing-key add
فقط خود شما | کلید وقتی حساب می‌شود که حسابش آن را بیفزاید | good | ✓
~ نخستین حساب
هر کلید یک حساب | حتی پس از حذف، کسی دیگر نمی‌تواند آن را بگیرد | accent | 🔒
```

## فقط کامیت‌های تأییدشده ادغام شوند

مدیران یک مخزن می‌توانند این را الزامی کنند: **⚙ تنظیمات ← فقط کامیت‌های تأییدشده ادغام شوند**. از آن پس یک درخواست ادغام تنها وقتی ادغام می‌شود که همهٔ کامیت‌هایی که می‌آورد تأییدشده باشند. فهرست بررسی درخواست ادغام می‌گوید چندتا تأییدشده نیستند، و هیچ‌کس، حتی مدیر، نمی‌تواند ادغام را به زور از آن بگذراند.

```diagram
type: flow
title: یک درخواست ادغام زیر این قاعده
---
کامیت‌های بی‌امضا | فهرست بررسی: ۲ کامیت تأییدشده نیستند؛ ادغام خاموش است | warn | ✍
~ zev sign-commits، zev push
همه تأییدشده | بررسی سبز می‌شود | good | ✓
~ ادغام
ادغام شد | شاخهٔ مقصد همیشه فقط کامیت‌های تأییدشده می‌گیرد | accent | 🔒
```

این قاعده یک شاخه را هم در برابر push مستقیم نگه می‌دارد: `main`، مگر در همان تنظیمات شاخهٔ دیگری نام ببرید. pushی که کامیتی تأییدنشده به آن بیاورد رد می‌شود و zev می‌گوید چندتا و چه باید اجرا کرد. شاخه‌های دیگر هر چیزی را می‌پذیرند، پس می‌توانید کار نیمه‌تمام را push کنید و درخواست ادغام باز کنید؛ بررسی آن این کامیت‌ها را می‌پوشاند. zev امضاها را پیش از جابه‌جا کردن شاخه می‌فرستد، پس push امضاشده در یک گام انجام می‌شود.

```bash
zev push-api origin main
# Push refused: 1 new commit(s) on main aren't Verified, and this repository takes only Verified commits there
zev sign-commits 1
zev push-api origin main     # Push complete
```

اسکریپت‌ها و عامل‌ها هم می‌توانند آن را بخوانند و تنظیم کنند: `GET` و `PUT /v1/repos/<owner>/<repo>/signing-rule` با `{"require_verified": true, "branch": "main"}`. فهرست کامیت‌ها (و ابزار `zaryn_commits` در `zev mcp`) امضای هر کامیت را نشان می‌دهد.

## دستورها

```bash
zev signing-key                    # کلید این مخزن، و این‌که کامیت‌های تازه امضا می‌شوند یا نه
zev signing-key add [--label x]    # افزودن به حساب: کامیت‌هایش تأییدشده نشان داده می‌شوند
zev signing-key ls                 # کلیدهای امضای حساب شما، با شمار کامیت‌هایی که هرکدام امضا کرده
zev signing-key rm <id>            # حذف یکی: کامیت‌هایش امضاشده نشان داده می‌شوند، نه تأییدشده
zev verify <commit>                # سنجش امضای یک کامیت همین‌جا (هش کوتاه کافی است)
zev sign-commits [N]               # امضای N کامیت آخر که امضا ندارند (پیش‌فرض ۱۰۰)
zev config set commit.sign false   # توقف امضای کامیت‌های تازه در این مخزن
```

## پرسش‌ها

**رایانه‌ام را گم کرده‌ام.** کلید را با `zev signing-key rm <id>` یا در صفحهٔ امنیت حذف کنید. کامیت‌هایش دیگر تأییدشده نشان داده نمی‌شوند و هیچ‌کس دیگر نمی‌تواند آن کلید را به حساب خود بیفزاید.

**روی رایانهٔ تازه clone کرده‌ام.** نسخهٔ تازه نخستین باری که امضا می‌کند کلید خودش را می‌گیرد. آنجا هم `zev signing-key add` را اجرا کنید.

**کامیت‌های پیش از امضا.** `zev sign-commits` آن‌ها را با کلید مخزن امضا می‌کند. push کنید تا نشان داده شوند.

**فرقش با `zev sign <cid>` چیست؟** `zev sign` هر شیئی را با هویت شما امضا می‌کند، برای گواهی که به کسی می‌دهید. امضای کامیت خودکار است و در Zaryn نشان داده می‌شود.

همچنین ببینید: [هشدارها و تبار](/docs/fa/advisories) برای علامت‌زدن کامیت‌های آسیب‌دیده، و [ذخیره‌سازی بررسی‌پذیر](/docs/fa/verified-storage) برای گواه این‌که Zaryn آنچه push کرده‌اید را نگه می‌دارد.
