GITPROTOCOL-COMMON(5) Git Manual GITPROTOCOL-COMMON(5)

gitprotocol-common - موارد مشترک میان پروتکل‌های گوناگون انتقال گیت

<over-the-wire-protocol>

این سند موارد مشترک میان پروتکل‌های گوناگون انتقال بر بستر شبکه (over-the-wire) و قالب‌های فایل مورد استفاده در گیت را تعریف می‌کند.

از نشانه‌گذاری ABNF مطابق با RFC 5234 در اسناد پروتکل استفاده می‌شود، به جز قواعد بنیادین زیر که جایگزین شده‌اند:

HEXDIG    =  DIGIT / "a" / "b" / "c" / "d" / "e" / "f"

همچنین قواعد مشترک زیر تعریف می‌شوند:

NUL       =  %x00
zero-id   =  40*"0"
obj-id    =  40*(HEXDIGIT)
refname  =  "HEAD"
refname /=  "refs/" <see discussion below>

یک refname رشته‌ای سلسله‌مراتبی از بایت‌ها (octet string) است که با "refs/" آغاز می‌شود و قواعد اعتبارسنجی دستور git-check-ref-format را نقض نمی‌کند. به طور دقیق‌تر:

1.می‌تواند شامل اسلش / برای گروه‌بندی سلسله‌مراتبی (دایرکتوری) باشد، اما هیچ بخشی که با اسلش جدا شده است نمی‌تواند با نقطه آغاز شود ..
2.باید حداقل شامل یک / باشد. این امر وجود یک دسته‌بندی مانند heads/، tags/ و غیره را الزامی می‌کند، اما نام‌های واقعی محدودیتی ندارند.
3.نمی‌تواند شامل دو نقطه پیاپی . در هیچ کجای خود باشد.
4.نمی‌تواند کاراکترهای کنترلی ASCII (یعنی بایت‌هایی با مقدار کمتر از \040 یا \177 DEL)، فاصله، مدک ~، هشتک ^، دو نقطه :، علامت سوال ?، ستاره *، یا قلاب باز [ را در هیچ کجای خود داشته باشد.
5.نمی‌تواند با اسلش / یا نقطه . پایان یابد.
6.نمی‌تواند با توالی .lock پایان یابد.
7.نمی‌تواند شامل توالی @{ باشد.
8.نمی‌تواند شامل \\ باشد.

بخش عمده‌ای از بار داده (payload) پیرامون خطوط بسته‌ای (pkt-line) توصیف می‌شود.

یک pkt-line یک رشته باینری با طول متغیر است. چهار بایت نخست خط، یعنی pkt-len، طول کل خط را در مبنای شانزده نشان می‌دهد. مقدار pkt-len خود شامل این ۴ بایت که برای نمایش هگزادسیمال طول استفاده شده‌اند نیز می‌شود.

یک pkt-line می‌تواند شامل داده‌های باینری باشد، بنابراین پیاده‌سازان باید اطمینان حاصل کنند که روال‌های تجزیه و قالب‌بندی pkt-line به صورت 8-bit clean عمل می‌کنند.

یک خط غیرباینری باید با یک LF خاتمه یابد، که در صورت وجود باید در طول کل محاسبه شود. گیرنده‌ها باید با pkt-lineهای حاوی داده‌های غیرباینری به طور یکسان رفتار کنند چه شامل LF پایانی باشند و چه نباشند (حذف LF در صورت وجود، و بدون اشکال‌گیری در صورت عدم وجود آن).

بیشینه طول بخش داده‌های یک pkt-line برابر با ۶۵۵۱۶ بایت است. پیاده‌سازی‌ها نباید pkt-lineهایی ارسال کنند که طول آن‌ها از ۶۵۵۲۰ تجاوز کند (۶۵۵۱۶ بایت بار داده + ۴ بایت داده‌های طول).

پیاده‌سازی‌ها نباید یک pkt-line خالی ("0004") ارسال کنند.

یک pkt-line با فیلد طول 0 ("0000")، که flush-pkt نامیده می‌شود، یک حالت خاص است و باید رفتاری متفاوت از یک pkt-line خالی ("0004") با آن شود.

pkt-line     =  data-pkt / flush-pkt
data-pkt     =  pkt-len pkt-payload
pkt-len      =  4*(HEXDIG)
pkt-payload  =  (pkt-len - 4)*(OCTET)
flush-pkt    = "0000"

مثال‌ها (به صورت رشته‌های سبک C):

pkt-line          actual value
---------------------------------
"0006a\n"         "a\n"
"0005a"           "a"
"000bfoobar\n"    "foobar\n"
"0004"            ""

بخشی از مجموعه git(1)

2026-06-29 Git 2.55.0