GITPROTOCOL-HTTP(5) Git Manual GITPROTOCOL-HTTP(5)

gitprotocol-http - پروتکل‌های مبتنی بر HTTP در گیت

<over-the-wire-protocol>

گیت از دو پروتکل انتقال مبتنی بر HTTP پشتیبانی می‌کند: یک پروتکل «ساده» (dumb) که در سمت سرور تنها به یک وب‌سرور استاندارد HTTP نیاز دارد، و یک پروتکل «هوشمند» (smart) که به یک ماژول سرور یا CGI آگاه به گیت نیازمند است. این سند هر دو پروتکل را شرح می‌دهد.

به عنوان یک ویژگی طراحی، کلاینت‌های هوشمند می‌توانند به طور خودکار نشانی‌های URL پروتکل «ساده» را به URLهای «هوشمند» ارتقا دهند. این کار به همه کاربران اجازه می‌دهد از یک نشانی URL منتشرشده یکسان استفاده کنند، و طرفین ارتباط (peers) به طور خودکار بهینه‌ترین روش انتقال در دسترس را انتخاب نمایند.

نشانی‌های اینترنتی (URL) برای مخازن گیت که از طریق HTTP قابل دسترسی هستند از ساختار استاندارد HTTP URL مستندشده در RFC 1738 استفاده می‌کنند، بنابراین به فرم زیر هستند:

http://<host>:<port>/<path>?<searchpart>

در این مستند، عبارت جایگزین $GIT_URL نمایانگر نشانی مخزن http:// واردشده توسط کاربر نهایی خواهد بود.

سرورها باید تمام درخواست‌ها به مسیرهای منطبق با $GIT_URL را مدیریت کنند، زیرا هر دو پروتکل HTTP «هوشمند» و «ساده» مورد استفاده در گیت با افزودن اجزای مسیر اضافی به انتهای رشته $GIT_URL ارائه‌شده توسط کاربر کار می‌کنند.

یک نمونه از یک کلاینت ساده که یک شیء منفرد (loose object) را درخواست می‌کند:

$GIT_URL:     http://example.com:8080/git/repo.git
URL request:  http://example.com:8080/git/repo.git/objects/d0/49f6c27a2244e12041955e262a404c7faba355

یک نمونه از یک درخواست هوشمند به یک درگاه همه‌منظوره (catch-all gateway):

$GIT_URL:     http://example.com/daemon.cgi?svc=git&q=
URL request:  http://example.com/daemon.cgi?svc=git&q=/info/refs&service=git-receive-pack

یک نمونه از یک درخواست به یک زیرماژول (submodule):

$GIT_URL:     http://example.com/git/repo.git/path/submodule.git
URL request:  http://example.com/git/repo.git/path/submodule.git/info/refs

کلاینت‌ها باید در صورت وجود، اسلش پایانی / را از انتهای رشته $GIT_URL ارائه‌شده توسط کاربر حذف کنند تا از ظاهر شدن توکن‌های مسیر خالی (//) در نشانی‌های URL ارسالی به سرور جلوگیری شود. کلاینت‌های سازگار باید $GIT_URL/info/refs را به صورت foo/info/refs گسترش دهند نه foo//info/refs.

در صورتی که برای دسترسی به یک مخزن نیاز به احراز هویت باشد، از احراز هویت استاندارد HTTP استفاده می‌شود و ممکن است توسط نرم‌افزار سرور HTTP پیکربندی و اعمال گردد.

از آنجا که مخازن گیت از طریق اجزای استاندارد مسیر در دسترس هستند، مدیران سرور می‌توانند از مجوزهای مبتنی بر دایرکتوری در وب‌سرور HTTP خود برای کنترل دسترسی به مخزن استفاده کنند.

کلاینت‌ها باید از احراز هویت پایه (Basic authentication) مطابق با RFC 2617 پشتیبانی کنند. سرورها باید با اتکا به سرور HTTP قرار گرفته در جلوی نرم‌افزار سرور گیت، از احراز هویت Basic پشتیبانی نمایند.

سرورها نباید برای اهداف احراز هویت یا کنترل دسترسی نیازمند کوکی‌های HTTP باشند.

کلاینت‌ها و سرورها می‌توانند از سایر روش‌های رایج احراز هویت مبتنی بر HTTP مانند احراز هویت چکیده (Digest authentication) پشتیبانی کنند.

کلاینت‌ها و سرورها باید از SSL پشتیبانی کنند، به ویژه برای محافظت از گذرواژه‌ها هنگام اتکا به احراز هویت Basic در HTTP.

پروتکل گیت روی HTTP (همانند خود HTTP) از دیدگاه سمت سرور HTTP بدون حالت (stateless) است. تمام وضعیت‌ها باید توسط فرآیند کلاینت نگهداری و مدیریت شوند. این امر توزیع بار نوبتی (round-robin load-balancing) ساده در سمت سرور را بدون نیاز به نگرانی درباره مدیریت وضعیت ممکن می‌سازد.

کلاینت‌ها نباید برای عملکرد صحیح نیازمند مدیریت وضعیت در سمت سرور باشند.

سرورها نباید برای عملکرد صحیح نیازمند کوکی‌های HTTP باشند. کلاینت‌ها می‌توانند هنگام پردازش درخواست، مطابق با RFC 2616 (HTTP/1.1) کوکی‌های HTTP را ذخیره و ارسال کنند. سرورها باید کوکی‌های ارسالی توسط کلاینت را نادیده بگیرند.

به جز مواردی که ذکر شده است، تمام رفتارهای استاندارد HTTP باید از سوی هر دو طرف کلاینت و سرور فرض شود. این شامل موارد زیر است (اما لزوماً محدود به آن‌ها نیست):

اگر هیچ مخزنی در $GIT_URL وجود نداشته باشد، یا منبعی که توسط مکانی منطبق بر $GIT_URL اشاره شده موجود نباشد، سرور نباید با پاسخ 200 OK پاسخ دهد. سرور باید با 404 Not Found، 410 Gone، یا هر کد وضعیت مناسب دیگر HTTP که دلالت بر وجود منبع درخواستی ندارد پاسخ دهد.

اگر مخزنی در $GIT_URL وجود داشته باشد اما دسترسی در حال حاضر مجاز نباشد، سرور باید با کد وضعیت HTTP 403 Forbidden پاسخ دهد.

سرورها باید از هر دو نسخه HTTP 1.0 و HTTP 1.1 پشتیبانی کنند. سرورها باید از کدگذاری تکه‌ای (chunked encoding) برای بدنه درخواست و پاسخ پشتیبانی کنند.

کلاینت‌ها باید از هر دو نسخه HTTP 1.0 و HTTP 1.1 پشتیبانی کنند. کلاینت‌ها باید از کدگذاری تکه‌ای (chunked encoding) برای بدنه درخواست و پاسخ پشتیبانی کنند.

سرورها می‌توانند هدرهای ETag و/یا Last-Modified را بازگردانند.

کلاینت‌ها می‌توانند با گنجاندن هدرهای درخواست If-Modified-Since و/یا If-None-Match، موجودیت‌های ذخیره‌شده در حافظه نهان (کَش) را مجدداً اعتبارسنجی کنند.

در صورتی که هدرهای مربوطه در درخواست موجود باشند و موجودیت تغییری نکرده باشد، سرورها می‌توانند 304 Not Modified را بازگردانند. کلاینت‌ها باید با استفاده مجدد از موجودیت ذخیره‌شده، رفتاری کاملاً یکسان با 304 Not Modified نسبت به 200 OK داشته باشند.

اگر هدر Cache-Control و/یا Expires اجازه کش کردن را بدهد، کلاینت‌ها می‌توانند موجودیت ذخیره‌شده را بدون اعتبارسنجی مجدد استفاده کنند. کلاینت‌ها و سرورها باید از RFC 2616 برای کنترل‌های حافظه نهان پیروی کنند.

تمام کلاینت‌های HTTP باید تبادل واکشی (fetch) یا ارسال (push) را با کشف ارجاعات موجود در مخزن راه دور آغاز کنند.

کلاینت‌های HTTP که فقط از پروتکل «ساده» پشتیبانی می‌کنند باید ارجاعات را با ایجاد درخواستی برای فایل ویژه info/refs مخزن کشف نمایند.

کلاینت‌های ساده HTTP باید یک درخواست GET به $GIT_URL/info/refs بدون هیچ پارامتر جستجو یا پرس‌وجو (query parameter) ارسال کنند.

C: GET $GIT_URL/info/refs HTTP/1.0
S: 200 OK
S:
S: 95dcfa3633004da0049d3d0fa03f80589cbcaf31  refs/heads/maint
S: d049f6c27a2244e12041955e262a404c7faba355  refs/heads/master
S: 2cb58b79488a98d2721cea644875a8dd0026b115  refs/tags/v1.0
S: a3c2e2402b99163d1d59756e5f207ae21cccba4c  refs/tags/v1.0^{}

مقدار Content-Type برای موجودیت بازگشتی info/refs باید text/plain; charset=utf-8 باشد، اما می‌تواند هر نوع محتوایی نیز باشد. کلاینت‌ها نباید تلاشی برای اعتبارسنجی Content-Type بازگشتی انجام دهند. سرورهای ساده نباید نوع بازگشتی را با پیشوند application/x-git- بازگردانند.

برای غیرفعال کردن ذخیره موجودیت بازگشتی در حافظه نهان، ممکن است هدرهای Cache-Control بازگردانده شوند.

کلاینت‌ها هنگام بررسی پاسخ فقط باید کد وضعیت HTTP را بررسی کنند. پاسخ‌های معتبر شامل 200 OK یا 304 Not Modified هستند.

محتوای بازگردانده‌شده یک فایل متنی با فرمت یونیکس است که هر ارجاع (ref) و مقدار شناخته‌شده آن را توصیف می‌کند. این فایل باید بر اساس نام و طبق ترتیب C locale مرتب شده باشد. این فایل نباید شامل ارجاع پیش‌فرض به نام HEAD باشد.

info_refs   =  *( ref_record )
ref_record  =  any_ref / peeled_ref
any_ref     =  obj-id HTAB refname LF
peeled_ref  =  obj-id HTAB refname LF
               obj-id HTAB refname "^{}" LF

کلاینت‌های HTTP که از پروتکل «هوشمند» (یا هر دو پروتکل «هوشمند» و «ساده») پشتیبانی می‌کنند باید ارجاعات را با ارسال یک درخواست پارامتری برای فایل info/refs مخزن کشف کنند.

درخواست باید دقیقاً شامل یک پارامتر پرسمان باشد: service=$servicename، که در آن $servicename باید نام سرویسی باشد که کلاینت تمایل دارد برای تکمیل عملیات با آن تماس بگیرد. درخواست نباید حاوی پارامترهای اضافی پرسمان باشد.

C: GET $GIT_URL/info/refs?service=git-upload-pack HTTP/1.0

پاسخ سرور ساده:

S: 200 OK
S:
S: 95dcfa3633004da0049d3d0fa03f80589cbcaf31  refs/heads/maint
S: d049f6c27a2244e12041955e262a404c7faba355  refs/heads/master
S: 2cb58b79488a98d2721cea644875a8dd0026b115  refs/tags/v1.0
S: a3c2e2402b99163d1d59756e5f207ae21cccba4c  refs/tags/v1.0^{}

پاسخ سرور هوشمند:

S: 200 OK
S: Content-Type: application/x-git-upload-pack-advertisement
S: Cache-Control: no-cache
S:
S: 001e# service=git-upload-pack\n
S: 0000
S: 004895dcfa3633004da0049d3d0fa03f80589cbcaf31 refs/heads/maint\0multi_ack\n
S: 003fd049f6c27a2244e12041955e262a404c7faba355 refs/heads/master\n
S: 003c2cb58b79488a98d2721cea644875a8dd0026b115 refs/tags/v1.0\n
S: 003fa3c2e2402b99163d1d59756e5f207ae21cccba4c refs/tags/v1.0^{}\n
S: 0000

کلاینت ممکن است پارامترهای اضافی (Extra Parameters - به gitprotocol-pack(5) مراجعه کنید) را به عنوان رشته‌ای جداشده با دونقطه در هدر HTTP به نام Git-Protocol ارسال کند.

از گزینه --http-backend-info-refs در دستور git-upload-pack(1) استفاده می‌کند.

پاسخ سرور ساده

سرورهای ساده باید با قالب پاسخ سرور ساده پاسخ دهند.

برای توضیح دقیق‌تر پاسخ سرور ساده به بخش قبلی ذیل کلاینت‌های ساده مراجعه کنید.

پاسخ سرور هوشمند

اگر سرور نام سرویس درخواستی را تشخیص ندهد، یا نام سرویس درخواستی توسط مدیر سرور غیرفعال شده باشد، سرور باید با کد وضعیت HTTP 403 Forbidden پاسخ دهد.

در غیر این صورت، سرورهای هوشمند باید با قالب پاسخ سرور هوشمند برای نام سرویس درخواستی پاسخ دهند.

هدرهای Cache-Control باید برای غیرفعال کردن کش شدن موجودیت بازگشتی استفاده شوند.

مقدار Content-Type باید application/x-$servicename-advertisement باشد. کلاینت‌ها در صورتی که نوع محتوای دیگری بازگردانده شود، باید به پروتکل ساده بازگردند (fall back). هنگام بازگشت به پروتکل ساده، کلاینت‌ها نباید درخواست دیگری به $GIT_URL/info/refs ارسال کنند، بلکه باید از پاسخی که در دست دارند استفاده کنند. اگر کلاینت‌ها از پروتکل ساده پشتیبانی نمی‌کنند، نباید ادامه دهند.

کلاینت‌ها باید اعتبارسنجی کنند که کد وضعیت یکی از دو مقدار 200 OK یا 304 Not Modified باشد.

کلاینت‌ها باید اعتبارسنجی کنند که پنج بایت اول پاسخ با عبارت منظم ^[0-9a-f]{4}# مطابقت داشته باشد. اگر این بررسی ناموفق باشد، کلاینت‌ها نباید ادامه دهند.

کلاینت‌ها باید کل پاسخ را به صورت دنباله‌ای از رکوردهای pkt-line تجزیه کنند.

کلاینت‌ها باید بررسی کنند که اولین pkt-line برابر با # service=$servicename باشد. سرورها باید مقدار $servicename را برابر با مقدار پارامتر درخواستی قرار دهند. سرورها باید یک LF در پایان این خط بگنجانند. کلاینت‌ها باید کاراکتر LF در انتهای خط را نادیده بگیرند.

سرورها باید پاسخ را با نشانگر جادویی پایان pkt-line یعنی 0000 خاتمه دهند.

پاسخ بازگردانده‌شده یک جریان از pkt-line است که هر ارجاع و مقدار شناخته‌شده آن را توصیف می‌کند. جریان باید بر اساس نام و مطابق با ترتیب C locale مرتب شده باشد. جریان باید ارجاع پیش‌فرض به نام HEAD را به عنوان اولین ارجاع شامل شود. جریان باید اعلان‌های قابلیت‌ها (capabilities) را پس از یک NUL در اولین ارجاع بگنجاند.

اگر "version=1" به عنوان پارامتر اضافی ارسال شده باشد، پاسخ بازگردانده‌شده حاوی "version 1" خواهد بود.

smart_reply     =  PKT-LINE("# service=$servicename" LF)
                   "0000"
                   *1("version 1")
                   ref_list
                   "0000"
ref_list        =  empty_list / non_empty_list
empty_list      =  PKT-LINE(zero-id SP "capabilities^{}" NUL cap-list LF)
non_empty_list  =  PKT-LINE(obj-id SP name NUL cap_list LF)
                   *ref_record
cap-list        =  capability *(SP capability)
capability      =  1*(LC_ALPHA / DIGIT / "-" / "_")
LC_ALPHA        =  %x61-7A
ref_record      =  any_ref / peeled_ref
any_ref         =  PKT-LINE(obj-id SP name LF)
peeled_ref      =  PKT-LINE(obj-id SP name LF)
                   PKT-LINE(obj-id SP name "^{}" LF

این سرویس از مخزنی که توسط $GIT_URL مشخص شده است می‌خواند.

کلاینت‌ها ابتدا باید فرآیند کشف ارجاع را با $GIT_URL/info/refs?service=git-upload-pack انجام دهند.

C: POST $GIT_URL/git-upload-pack HTTP/1.0
C: Content-Type: application/x-git-upload-pack-request
C:
C: 0032want 0a53e9ddeaddad63ad106860237bbf53411d11a7\n
C: 0032have 441b40d833fdfa93eb2908e52742248faf0ee993\n
C: 0000
S: 200 OK
S: Content-Type: application/x-git-upload-pack-result
S: Cache-Control: no-cache
S:
S: ....ACK %s, continue
S: ....NAK

کلاینت‌ها نباید یک پاسخ ذخیره‌شده در حافظه نهان را مجدداً استفاده یا اعتبارسنجی کنند. سرورها باید هدرهای Cache-Control کافی برای جلوگیری از کش شدن پاسخ را درج نمایند.

سرورها باید از تمام قابلیت‌های تعریف‌شده در اینجا پشتیبانی کنند.

کلاینت‌ها باید حداقل یک دستور "want" را در بدنه درخواست ارسال نمایند. کلاینت‌ها نباید به شناسه‌ای در دستور "want" ارجاع دهند که در پاسخ دریافتی از طریق کشف ارجاع وجود نداشته است، مگر اینکه سرور قابلیت allow-tip-sha1-in-want یا allow-reachable-sha1-in-want را اعلان کرده باشد.

compute_request   =  want_list
                     have_list
                     request_end
request_end       =  "0000" / "done"
want_list         =  PKT-LINE(want SP cap_list LF)
                     *(want_pkt)
want_pkt          =  PKT-LINE(want LF)
want              =  "want" SP id
cap_list          =  capability *(SP capability)
have_list         =  *PKT-LINE("have" SP id LF)

در دست تکمیل: این بخش در آینده کامل‌تر مستندسازی خواهد شد.

محاسبه برای انتخاب کمینه بسته (pack) به صورت زیر پیش می‌رود (C = کلاینت، S = سرور):

گام مقداردهی اولیه:

C: استفاده از فرآیند کشف ارجاع برای دریافت ارجاعات اعلان‌شده.

C: قرار دادن هر شیء دیده‌شده در مجموعه advertised.

C: ساخت یک مجموعه خالی به نام common، برای نگهداری اشیایی که بعداً مشخص می‌شود در هر دو سمت وجود دارند.

C: ساخت یک مجموعه به نام want از اشیای موجود در advertised که کلاینت می‌خواهد بر اساس آنچه حین کشف ارجاع دیده واکشی کند.

C: آغاز یک صف به نام c_pending که بر اساس زمان ثبت (commit time) مرتب شده است (برداشتن جدیدترین‌ها در ابتدا). افزودن تمام ارجاعات کلاینت. هنگامی که یک کامیت از صف برداشته می‌شود، والدین آن باید به طور خودکار دوباره در صف درج شوند. هر کامیت فقط باید یک بار وارد صف شود.

یک گام محاسبه:

C: ارسال یک درخواست $GIT_URL/git-upload-pack:

C: 0032want <want-#1>...............................
C: 0032want <want-#2>...............................
....
C: 0032have <common-#1>.............................
C: 0032have <common-#2>.............................
....
C: 0032have <have-#1>...............................
C: 0032have <have-#2>...............................
....
C: 0000

جریان داده‌ها به صورت «دستورها» سازماندهی شده است، که هر دستور به صورت مجزا در یک pkt-line قرار دارد. در یک خط دستور، متن قبل از اولین فاصله نام دستور است و باقی‌مانده خط تا اولین LF مقدار آن را تشکیل می‌دهد. خطوط دستور با یک LF به عنوان آخرین بایت مقدار pkt-line خاتمه می‌یابند.

دستورها در صورت حضور در جریان درخواست، باید دقیقاً به ترتیب زیر باشند:

•"want"
•"have"

جریان با یک تخلیه‌کننده pkt-line خاتمه می‌یابد (0000).

یک دستور "want" یا "have" منفرد باید دقیقاً دارای یک نام شیء با قالب هگزادسیمال به عنوان مقدار خود باشد. چند نام شیء باید با ارسال چند دستور جداگانه فرستاده شوند. نام‌های اشیاء باید با استفاده از قالب شیء مورد توافق از طریق قابلیت object-format (به طور پیش‌فرض SHA-1) ارائه شوند.

لیست have با بیرون کشیدن ۳۲ کامیت نخست از صف c_pending ایجاد می‌شود. اگر c_pending زودتر خالی شود، تعداد کمتری فرستاده می‌شود.

اگر کلاینت ۲۵۶ کامیت "have" ارسال کرده باشد و هنوز هیچ‌یک از آن‌ها را از طرف s_common دریافت نکرده باشد، یا صف c_pending کلاینت خالی شده باشد، باید دستور "done" را ارسال کند تا به سرور اطلاع دهد کار را ادامه نخواهد داد:

C: 0009done

S: تجزیه درخواست git-upload-pack:

بررسی اینکه تمام اشیای موجود در want مستقیماً از ارجاعات قابل دسترسی باشند.

سرور ممکن است برای مجاز دانستن درخواست‌های کمی قدیمی، تاریخچه را به عقب بپیماید یا در reflog جستجو کند.

اگر هیچ شیء "want" دریافت نشد، یک خطا بفرستد: در دست تکمیل: تعریف خطا در صورتی که هیچ خط "want" درخواست نشده باشد.

اگر هر یک از اشیای "want" قابل دسترسی نباشند، یک خطا بفرستد: هنگامی که یک سرور گیت خط want نامعتبر یا بدریختی دریافت می‌کند، با یک پیام خطا که شامل نام شیء متخلف است پاسخ می‌دهد.

یک لیست خالی به نام s_common بسازد.

اگر "have" ارسال شده بود:

پیمایش روی اشیاء به همان ترتیبی که کلاینت ارائه کرده است.

برای هر شیء، اگر سرور آن شیء را به صورت قابل دسترسی از یک ارجاع داشته باشد، آن را به s_common اضافه کند. اگر کامیتی به s_common اضافه شود، هیچ‌یک از اجداد آن نباید اضافه شوند، حتی اگر آن‌ها نیز در have آمده باشند.

S: ارسال پاسخ git-upload-pack:

اگر سرور مجموعه بسته‌ای از اشیاء را برای بسته‌بندی یافته باشد یا درخواست با "done" خاتمه یافته باشد، با بسته (pack) پاسخ می‌دهد. در دست تکمیل: مستندسازی پاسخ مبتنی بر بسته

S: PACK...

جریان بازگردانده‌شده پروتکل side-band-64k است که توسط سرویس git-upload-pack پشتیبانی می‌شود، و بسته در جریان شماره ۱ جاسازی می‌شود. پیام‌های پیشرفت از سمت سرور ممکن است در جریان شماره ۲ ظاهر شوند.

در اینجا یک «مجموعه بسته از اشیاء» به گونه‌ای تعریف می‌شود که حداقل یک مسیر از هر شیء "want" به حداقل یک شیء "common" وجود داشته باشد.

اگر سرور به اطلاعات بیشتری نیاز داشته باشد، با یک پاسخ ادامه وضعیت پاسخ می‌دهد: در دست تکمیل: مستندسازی پاسخ غیربسته‌ای

C: تجزیه پاسخ upload-pack: در دست تکمیل: مستندسازی تجزیه پاسخ

انجام یک گام محاسبه دیگر.

این سرویس از مخزنی که توسط $GIT_URL اشاره شده است می‌خواند.

کلاینت‌ها ابتدا باید کشف ارجاع را با $GIT_URL/info/refs?service=git-receive-pack انجام دهند.

C: POST $GIT_URL/git-receive-pack HTTP/1.0
C: Content-Type: application/x-git-receive-pack-request
C:
C: ....0a53e9ddeaddad63ad106860237bbf53411d11a7 441b40d833fdfa93eb2908e52742248faf0ee993 refs/heads/maint\0 report-status
C: 0000
C: PACK....
S: 200 OK
S: Content-Type: application/x-git-receive-pack-result
S: Cache-Control: no-cache
S:
S: ....

کلاینت‌ها نباید یک پاسخ کش‌شده را مجدداً استفاده یا اعتبارسنجی کنند. سرورها باید هدرهای Cache-Control کافی برای جلوگیری از کش شدن پاسخ را درج کنند.

سرورها باید از تمام قابلیت‌های تعریف‌شده در اینجا پشتیبانی کنند.

کلاینت‌ها باید حداقل یک دستور در بدنه درخواست ارسال کنند. در بخش دستور از بدنه درخواست، کلاینت‌ها باید شناسه‌ای را که از طریق کشف ارجاع به دست آورده‌اند به عنوان old_id ارسال کنند.

update_request  =  command_list
                   "PACK" <binary-data>
command_list    =  PKT-LINE(command NUL cap_list LF)
                   *(command_pkt)
command_pkt     =  PKT-LINE(command LF)
cap_list        =  *(SP capability) SP
command         =  create / delete / update
create          =  zero-id SP new_id SP name
delete          =  old_id SP zero-id SP name
update          =  old_id SP new_id SP name

در دست تکمیل: این بخش در آینده کامل‌تر مستندسازی خواهد شد.

RFC 1738: Uniform Resource Locators (URL)[1] RFC 2616: Hypertext Transfer Protocol — HTTP/1.1[2]

gitprotocol-pack(5) gitprotocol-capabilities(5)

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

1.
RFC 1738: Uniform Resource Locators (URL)
2.
RFC 2616: Hypertext Transfer Protocol — HTTP/1.1
2026-06-29 Git 2.55.0