'\" t .\" Title: gitformat-commit-graph .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot .\" Date: 2026-06-29 .\" Manual: راهنمای Git .\" Source: Git 2.55.0 .\" Language: Persian .\" .TH "GITFORMAT\-COMMIT\-GRAPH" "5" "2026\-06\-29" "Git 2\&.55\&.0" "راهنمای Git" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "نام (NAME)" gitformat-commit-graph \- ساختار و قالب فایل گراف کامیت (commit\-graph) در گیت .SH "خلاصه دستور (SYNOPSIS)" .sp .nf $GIT_DIR/objects/info/commit\-graph $GIT_DIR/objects/info/commit\-graphs/* .fi .sp .SH "توضیحات (DESCRIPTION)" .sp فایل گراف کامیت گیت (commit\-graph) فهرستی از شناسه‌های اشیاء کامیت (OID) و برخی فراداده‌های مرتبط را ذخیره می‌کند، از جمله: .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} شماره نسل (generation number) کامیت\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} شناسه شیء درخت ریشه (root tree OID)\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} تاریخ ثبت کامیت\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} والدین کامیت، که با استفاده از ارجاع‌های موقعیتی در فایل گراف ذخیره می‌شوند\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} فیلتر بلوم (Bloom filter) کامیت حامل مسیرهایی که بین کامیت و والد اول آن تغییر یافته‌اند (در صورت درخواست)\&. .RE .sp این ارجاع‌های موقعیتی به صورت اعداد صحیح ۳۲ بیتی بدون علامت متناظر با موقعیت آرایه در فهرست OIDهای کامیت ذخیره می‌شوند\&. به دلیل استفاده از برخی ثابت‌های ویژه برای ردیابی والدین، ما می‌توانیم حداکثر (1 << 30) + (1 << 29) + (1 << 28) \- 1 (حدود ۱\&.۸ میلیارد) کامیت را ذخیره کنیم\&. .SH "فایل‌های گراف کامیت ساختار زیر را دارند (COMMIT\-GRAPH FILES HAVE THE FOLLOWING FORMAT)" .sp به منظور امکان افزودن افزونه‌هایی که داده‌های اضافی به گراف اضافه می‌کنند، ما بدنه را به «قطعات» (chunks) سازمان‌دهی می‌کنیم و یک جدول جستجوی دودویی در ابتدای بدنه ارائه می‌دهیم\&. سرایند شامل مقادیر خاصی مانند تعداد قطعات و نوع الگوریتم هش است\&. .sp تمام اعداد چندبایتی در ترتیب بایت شبکه (network byte order) هستند\&. .SS "سرایند (HEADER):" .sp .if n \{\ .RS 4 .\} .nf امضای ۴ بایتی: امضا عبارت است از: {\*(AqC\*(Aq, \*(AqG\*(Aq, \*(AqP\*(Aq, \*(AqH\*(Aq} .fi .if n \{\ .RE .\} .sp .if n \{\ .RS 4 .\} .nf شماره نسخه ۱ بایتی: در حال حاضر تنها نسخه معتبر، نسخه ۱ است\&. .fi .if n \{\ .RE .\} .sp .if n \{\ .RS 4 .\} .nf نسخه درهم‌سازی ۱ بایتی (Hash Version): طول هش (H) از روی این مقدار استنتاج می‌شود: 1 => SHA\-1 2 => SHA\-256 اگر نوع هش با الگوریتم هش مخزن مطابقت نداشته باشد، فایل commit\-graph باید نادیده گرفته شده و یک هشدار به کاربر نمایش داده شود\&. .fi .if n \{\ .RE .\} .sp .if n \{\ .RS 4 .\} .nf تعداد قطعات ۱ بایتی (C) .fi .if n \{\ .RE .\} .sp .if n \{\ .RS 4 .\} .nf تعداد گراف‌های پایه ۱ بایتی (B): طول قطعه گراف‌های پایه (H*B) از روی این مقدار استنتاج می‌شود\&. .fi .if n \{\ .RE .\} .SS "جستجوی قطعه (CHUNK LOOKUP):" .sp .if n \{\ .RS 4 .\} .nf (C + 1) * 12 بایت که فهرست مطالب قطعات را فهرست می‌کند: ۴ بایت نخست شناسه قطعه (chunk id) را توصیف می‌کند\&. مقدار 0 یک برچسب پایان‌دهنده است\&. ۸ بایت دیگر، آفست بایتی در فایل جاری را برای شروع قطعه ارائه می‌دهد\&. (قطعات به طور پیوسته در فایل مرتب شده‌اند، بنابراین در صورت نیاز می‌توانید طول را با استفاده از موقعیت قطعه بعدی استنتاج کنید\&.) هر شناسه قطعه حداکثر یک بار ظاهر می‌شود\&. .fi .if n \{\ .RE .\} .sp .if n \{\ .RS 4 .\} .nf بخش CHUNK LOOKUP با فهرست مطالب قالب فایل مبتنی بر قطعه مطابقت دارد؛ به linkgit:gitformat\-chunk[5] مراجعه کنید\&. .fi .if n \{\ .RE .\} .sp .if n \{\ .RS 4 .\} .nf داده‌های باقی‌مانده در بدنه به صورت یک قطعه در یک زمان توصیف می‌شوند و این قطعات ممکن است به هر ترتیبی ارائه شوند\&. قطعات الزامی هستند مگر آنکه خلاف آن مشخص شده باشد\&. .fi .if n \{\ .RE .\} .SS "داده‌های قطعه (CHUNK DATA):" .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBOID Fanout (ID: {O, I, D, F}) (256 * 4 bytes)\fR .RS 4 .sp .if n \{\ .RS 4 .\} .nf ورودی iام، یعنی F[i]، تعداد OIDهایی را که بایت اول آن‌ها حداکثر برابر با i است ذخیره می‌کند\&. بنابراین F[255] تعداد کل کامیت‌ها (N) را ذخیره می‌کند\&. .fi .if n \{\ .RE .\} .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBOID Lookup (ID: {O, I, D, L}) (N * H bytes)\fR .RS 4 .sp .if n \{\ .RS 4 .\} .nf شناسه‌های OID تمام کامیت‌های موجود در گراف، مرتب‌شده به صورت صعودی\&. .fi .if n \{\ .RE .\} .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBCommit Data (ID: {C, D, A, T }) (N * (H + 16) bytes)\fR .RS 4 .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} نخستین H بایت برای OID درخت ریشه است\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} ۸ بایت بعدی برای موقعیت‌های دو والد نخستِ کامیت iام است\&. اگر در آن موقعیت والدی وجود نداشته باشد، مقدار 0x70000000 را ذخیره می‌کند\&. اگر بیش از دو والد وجود داشته باشد، با ارزش‌ترین بیت مقدار دوم ۱ است و سایر بیت‌ها موقعیت آرایه‌ای را در قطعه Extra Edge List ذخیره می‌کنند\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} ۸ بایت بعدی سطح توپولوژیکی (شماره نسل نسخه ۱) کامیت و زمان ثبت کامیت به ثانیه از مبدا زمان (EPOCH) را ذخیره می‌کند\&. شماره نسل از ۳۰ بیت بالایی ۴ بایت اول استفاده می‌کند، در حالی که زمان ثبت کامیت از ۳۲ بیت ۴ بایت دوم همراه با ۲ بیت کم‌ارزش پایین‌ترین بایت استفاده می‌کند که بیت‌های ۳۳ و ۳۴ زمان ثبت کامیت را ذخیره می‌نمایند\&. .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBGeneration Data (ID: {G, D, A, 2 }) (N * 4 bytes) [Optional]\fR .RS 4 .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} این فهرست از مقادیر ۴ بایتی، آفست‌های اصلاح‌شده تاریخ کامیت را برای کامیت‌ها ذخیره می‌کند که با همان ترتیب قطعه داده‌های کامیت مرتب شده‌اند\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} اگر آفست اصلاح‌شده تاریخ کامیت نتواند در ۳۱ بیت ذخیره شود، پرارزش‌ترین بیت مقدار روشن (۱) خواهد بود و بیت‌های دیگر موقعیت تاریخ کامیت اصلاح‌شده را در قطعه سرریز داده‌های نسل (Generation Data Overflow) ذخیره می‌کنند\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} قطعه داده‌های نسل تنها زمانی وجود دارد که فایل commit\-graph توسط نسخه‌های سازگار گیت نوشته شده باشد و در صورت وجود زنجیره‌های گراف کامیت تفکیک‌شده (split commit\-graph chains)، بالاترین لایه نیز حاوی قطعه داده‌های نسل خواهد بود\&. .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBGeneration Data Overflow (ID: {G, D, O, 2 }) [Optional]\fR .RS 4 .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} این فهرست از مقادیر ۸ بایتی آفست‌های اصلاح‌شده تاریخ کامیت را برای کامیت‌هایی که آفست آن‌ها در ۳۱ بیت جا نمی‌شود ذخیره می‌کند\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} قطعه سرریز داده‌های نسل تنها زمانی وجود دارد که قطعه داده‌های نسل حضور داشته باشد و حداقل یک آفست اصلاح‌شده تاریخ کامیت وجود داشته باشد که در ۳۱ بیت نگنجد\&. .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBExtra Edge List (ID: {E, D, G, E}) [Optional]\fR .RS 4 .sp .if n \{\ .RS 4 .\} .nf این فهرست از مقادیر ۴ بایتی والدین دوم تا nام را برای تمام ادغام‌های اختاپوسی (octopus merges) ذخیره می‌کند\&. مقدار والد دوم در داده‌های کامیت، یک موقعیت آرایه‌ای درون این فهرست را به همراه فعال بودن پرارزش‌ترین بیت ذخیره می‌نماید\&. با شروع از آن موقعیت آرایه، این فهرست از موقعیت‌های کامیت برای والدین را پیمایش کنید تا زمانی که به مقداری برسید که پرارزش‌ترین بیت آن ۱ باشد\&. بیت‌های دیگر متناظر با موقعیت والد پایانی هستند\&. .fi .if n \{\ .RE .\} .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBBloom Filter Index (ID: {B, I, D, X}) (N * 4 bytes) [Optional]\fR .RS 4 .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} ورودی iام، یعنی BIDX[i]، تعداد بایت‌ها در تمام فیلترهای بلوم از کامیت ۰ تا کامیت i (شامل) را به ترتیب واژه‌نگاشتی (lexicographic) ذخیره می‌کند\&. فیلتر بلوم برای کامیت iام از BIDX[i\-1] تا BIDX[i] (به اضافه طول سرایند) امتداد دارد، که در آن BIDX[\-1] برابر با ۰ است\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} اگر قطعه BDAT وجود نداشته باشد، قطعه BIDX نادیده گرفته می‌شود\&. .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBBloom Filter Data (ID: {B, D, A, T}) [Optional]\fR .RS 4 .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} با یک سرایند متشکل از سه عدد صحیح ۳۲ بیتی بدون علامت شروع می‌شود: .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} نسخه الگوریتم هش مورد استفاده\&. در حال حاضر ما از مقدار ۲ پشتیبانی می‌کنیم که متناظر با نسخه ۳۲ بیتی هش murmur3 است که دقیقاً همان‌طور که در \m[blue]\fBhttps://en\&.wikipedia\&.org/wiki/MurmurHash#Algorithm\fR\m[] توصیف شده پیاده‌سازی گشته، و تکنیک درهم‌سازی دوگانه با استفاده از مقادیر seed برابر با 0x293ae76f و 0x7e646e2 که در \m[blue]\fBhttps://doi\&.org/10\&.1007/978\-3\-540\-30494\-4_26\fR\m[] تحت عنوان «Bloom Filters in Probabilistic Verification» شرح داده شده است\&. فیلترهای بلوم نسخه ۱ دارای باگی هستند که وقتی char علامت‌دار است و مخزن نام‌های مسیری دارد که کاراکترهای >= 0x80 دارند ظاهر می‌شود؛ گیت خواندن و نوشتن آن‌ها را پشتیبانی می‌کند، اما این قابلیت در نسخه‌های آینده گیت حذف خواهد شد\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} تعداد دفعاتی که یک مسیر هش می‌شود و در نتیجه تعداد موقعیت‌های بیتی که به صورت تجمعی تعیین می‌کنند آیا فایلی در کامیت وجود دارد یا خیر\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} حداقل تعداد بیت‌های \fIb\fR به ازای هر ورودی در فیلتر بلوم\&. اگر فیلتر شامل \fIn\fR ورودی باشد، اندازه فیلتر حداقل تعداد کلمات ۶۴ بیتی خواهد بود که شامل n*b بیت باشند\&. .RE .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} باقی‌مانده قطعه، الحاق تمام فیلترهای بلوم محاسبه‌شده برای کامیت‌ها به ترتیب واژه‌نگاشتی است\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} نکته: کامیت‌های بدون تغییر یا با بیش از ۵۱۲ تغییر دارای فیلترهای بلوم با طول یک هستند، که به ترتیب تمام بیت‌های آن‌ها روی صفر یا یک تنظیم شده‌اند\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} قطعه BDAT اگر و تنها اگر BIDX موجود باشد، وجود دارد\&. .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBBase Graphs List (ID: {B, A, S, E}) [Optional]\fR .RS 4 .sp .if n \{\ .RS 4 .\} .nf این فهرست از هش‌های H بایتی، مجموعه‌ای از B فایل commit\-graph را توصیف می‌کند که یک زنجیره گراف کامیت را تشکیل می‌دهند\&. موقعیت گراف برای کامیت iام در قطعه OID Lookup این فایل، برابر است با i به اضافه تعداد کامیت‌ها در تمام گراف‌های پایه\&. اگر B غیرصفر باشد، این قطعه الزامی است\&. .fi .if n \{\ .RE .\} .RE .SS "بخش انتهایی (TRAILER):" .sp .if n \{\ .RS 4 .\} .nf چکسام HASH با طول H بایت از تمام موارد فوق\&. .fi .if n \{\ .RE .\} .SH "نکات تاریخی (HISTORICAL NOTES)" .sp قطعات داده‌های نسل (GDA2) و سرریز داده‌های نسل (GDO2) عدد \fI2\fR را در شناسه قطعه خود دارند زیرا نسخه قبلی گیت داده‌های احتمالاً نادرستی را در این قطعات با شناسه‌های «GDAT» و «GDOV» می‌نوشت\&. با تغییر شناسه‌ها، نسخه‌های جدیدتر گیت این قطعات قدیمی‌تر را بی‌صدا نادیده می‌گیرند و اطلاعات جدید را بدون اعتماد به داده‌های نادرست می‌نویسند\&. .SH "گیت (GIT)" .sp بخشی از مجموعه \fBgit\fR(1)