Chapters ▾ 2nd Edition

10.1 (Git Internals) - ابزارها و دستورات سطح پایین (Plumbing and Porcelain)

ممکن است این فصل را مستقیماً از فصلی بسیار قبلی باز کرده باشید، یا اینکه پس از خواندن ترتیبی کل کتاب تا اینجا به آن رسیده‌اید — در هر صورت، اینجا قرار است به سازوکارهای درونی و پیاده‌سازی گیت بپردازیم. ما دیدیم که فهم این اطلاعات برای درک اهمیت و توانمندی گیت بنیادی است، اما برخی دیگر به ما گفته‌اند که برای مبتدیان می‌تواند گیج‌کننده و بی‌جهت پیچیده باشد. بنابراین، این بحث را به عنوان آخرین فصل کتاب قرار داده‌ایم تا بتوانید آن را زود یا دیر در روند یادگیری‌تان بخوانید. تصمیم با شماست.

حالا که اینجا هستید، بیایید شروع کنیم. ابتدا، اگر هنوز برایتان روشن نیست، گیت بنیاداً یک سیستم فایل آدرس‌دهی بر اساس محتوا است که یک رابط کاربری کنترل نسخه (VCS) روی آن قرار گرفته است. کمی بعد بیشتر در مورد معنای این جمله خواهید آموخت.

در روزهای نخستین گیت (عمدتاً پیش از نسخهٔ 1.5)، رابط کاربری بسیار پیچیده‌تر بود چون بیشتر آن سیستم فایل را برجسته می‌ساخت تا یک VCS پالایش‌شده. در چند سال اخیر، رابط کاربری تا حدی تصحیح شده که اکنون به اندازهٔ هر سیستم دیگری تمیز و آسان برای استفاده است؛ با این حال، کلیشهٔ رابط کاربری اولیهٔ گیت که پیچیده و دشوار برای یادگیری بود، همچنان پابرجاست.

لایهٔ سیستم فایل آدرس‌دهی‌شده بر اساس محتوا فوق‌العاده جالب است، بنابراین ابتدا آن را در این فصل پوشش می‌دهیم؛ سپس دربارهٔ سازوکارهای انتقال و کارهای نگهداری مخزن که ممکن است نهایتاً با آن‌ها سروکار داشته باشید، خواهید آموخت.

ابزارها و دستورات سطح پایین (Plumbing and Porcelain)

این کتاب عمدتاً به این موضوع می‌پردازد که چگونه می‌توان با حدود ۳۰ زیرفرمان اصلی گیت مانند checkout، branch، remote و … کار کرد. اما باید توجه داشت که گیت در ابتدا به‌عنوان یک جعبه‌ابزار (toolkit) برای مدیریت نسخه طراحی شد، نه یک سیستم کنترل نسخه (VCS) کامل و کاربرپسند. به همین دلیل، بخشی از زیرفرمان‌های آن عملیات سطح‌پایین انجام می‌دهند و برای استفاده در زنجیره‌های یونیکسی (Unix pipelines) یا فراخوانی از اسکریپت‌ها ساخته شده‌اند.

همانطور که احتمالاً تا حالا متوجه شده‌اید، نه فصل اول این کتاب تقریباً منحصراً با فرمان‌های لعاب سروکار دارند. اما در این فصل بیشتر با فرمان‌های سطح‌پایینِ لوله‌کشی سروکار خواهید داشت، زیرا آن‌ها دسترسی به سازوکار درونی گیت را فراهم می‌کنند و به نشان دادن این که گیت چگونه و چرا کارهایش را انجام می‌دهد کمک می‌کنند. بسیاری از این فرمان‌ها قرار نیست به‌صورت دستی در خط فرمان استفاده شوند، بلکه به عنوان بلوک‌های سازنده برای ابزارهای جدید و اسکریپت‌های سفارشی به کار می‌روند.

وقتی در یک دایرکتوری جدید یا موجود git init اجرا می‌کنید، گیت دایرکتوری .git را ایجاد می‌کند که تقریباً همه چیزهایی را که گیت ذخیره و دست‌کاری می‌کند در آن قرار دارد. اگر بخواهید مخزن خود را پشتیبان‌گیری یا کلون کنید، کپی کردن این تک دایرکتوری به مکان دیگری تقریباً همه چیز مورد نیازتان را در اختیارتان می‌گذارد. کل این فصل اساساً به آنچه در این دایرکتوری می‌توانید ببینید می‌پردازد. در اینجا نمایی از آنچه معمولاً یک دایرکتوری تازه‌سازی‌شده .git به نظر می‌رسد آمده است:

$ ls -F1
config
description
HEAD
hooks/
info/
objects/
refs/

بسته به نسخه‌ی گیت شما، ممکن است محتوای اضافی دیگری در آنجا ببینید، اما این یک مخزن تازه‌ساخته‌شده با دستور git init است — همان چیزی که به‌طور پیش‌فرض می‌بینید. فایل description تنها توسط برنامه‌ی GitWeb استفاده می‌شود، پس نگران آن نباشید. فایل config شامل گزینه‌های پیکربندی مخصوص پروژه‌ی شماست و دایرکتوری info یک فایل استثنا (global exclude) نگه می‌دارد برای الگوهای نادیده‌گرفتن که نمی‌خواهید در فایل .gitignore پی‌گیری شوند. دایرکتوری hooks اسکریپت‌های هوک سمت کلاینت یا سرور شما را در خود دارد که به‌صورت مفصل در هوک‌های Git (Git Hooks) توضیح داده شده‌اند.

این‌جا چهار ورودی مهم باقی می‌ماند: فایل‌های HEAD و (هنوز ساخته‌نشده) index، و دایرکتوری‌های objects و refs. این‌ها اجزای اصلی گیت هستند. دایرکتوری objects تمام محتوای پایگاه داده‌ی شما را ذخیره می‌کند، دایرکتوری refs اشاره‌گرهایی به آبجکت‌های commit در آن داده‌ها را نگه می‌دارد (شاخه‌ها، تگ‌ها، ریموت‌ها و غیره)، فایل HEAD به شاخه‌ای که در حال حاضر چک‌اوت شده اشاره می‌کند، و فایل index جایی است که گیت اطلاعات ناحیه‌ی آماده‌سازی (staging area) را در آن ذخیره می‌کند. اکنون هر یک از این بخش‌ها را با جزئیات بیشتری بررسی خواهید کرد تا ببینید گیت چگونه کار می‌کند.

scroll-to-top