گیت (نرمافزار)
برای تأییدپذیری کامل این مقاله به منابع بیشتری نیاز است. (اکتبر ۲۰۱۹) |
نویسنده(های) اصلی | لینوس تروالدز، جونیو همنو |
---|---|
مخزن | |
سیستمعامل | پوزیکس |
مجوز | جیپیال نسخهٔ ۲ |
وبگاه |
گیت (به انگلیسی: Git) یک نرمافزار کنترل نسخه میباشد.
گیت ابتدا برای توسعهٔ لینوکس به وجود آمد و اکنون پروژههای فراوانی از آن الهام گرفتهاند. هر دایرکتوری کاری در گیت یک مخزن کامل با تاریخچهٔ کامل تغییرها و قابلیت بازنگری آنها است و برای کار با آن نیازی به دسترسی به شبکه یا سرور مرکزی وجود ندارد.
تعریف مسئله
[ویرایش]فرض کنید قرار است یک گزارش بنویسید. پس از تایپ، میفهمید که بهتر است تغییراتی در نوشتار بدهید، اما چه نامی برای فایل جدید باید بگذارید و در کجا بگذارید تا هم فایل قبلی در دسترس باشد و هم فایل جدید به عنوان فایل اصلی نمایان شود؟ حال همکار شما نیز میخواهد تغییراتی اعمال کند، اما اساساً برنامه واژه پرداز او با شما فرق دارد. گیت علاج کار است؛ یعنی نسخههای متفاوت گزارشها را بایگانی میکند. هر بار که گزارشی سپارش (commit) میشود، مخزن به هنگام میشود.
خصوصیات
[ویرایش]گیت از مدل نرمافزارهای آزاد و متنباز برای بازنگری کد منبع توزیع شده و مدیریت منبع کد استفاده میکند که برای دنبال کردن تغییر فایلها و دنبال کردن کارهای انجام شده روی آنها توسط افراد مختلف است. هدف اولیه این نرمافزار برای استفاده در پروژههای نرمافزاری بوده است ولی میتوان از آن تنها برای دنبال کردن تغییر فایلها هم استفاده کرد. از ۲۶ ژوئیه ۲۰۱۵ جونیو همنو مسئول نگهداری از پروژهٔ گیت است.
نام
[ویرایش]لینوس تروالدز در مورد نام گیت بیان نمود که، در زبان انگلیسی اصطلاحی است برای انسانی احمق و ناخوشایند. توروالدز گفت: من فردی از خود راضی هستم، و تمام پروژههایم را به افتخار خودم نامگذاری نمودهام. اول لینوکس و الان هم گیت. در صفحه راهنمای گیت در شل لینوکس، گیت به عنوان یک ردیاب محتوای احمق توصیف شده است.[۱][۲]
تاریخچهٔ Git
[ویرایش]توسعهٔ گیت زمانی آغاز شد که بسیاری از توسعهدهندگان لینوکس، در استفاده از بیت کیپر، که یک سیستم مدیریت کد میباشد که قبلاً برای توسعه هستهٔ لینوکس استفاده میشد، امتناع ورزیدند. نگهدارندهٔ کپی رایت، لری مک وی، حق استفادهٔ رایگان از این نرمافزار را پس از آن که اندرو تریدگل به روش مهندسی معکوس میخواست که پروتکلهای بیت کیپر را پیاده کند، برداشت. توروالدز نیاز به سیستم توزیع شدهای داشت که بتواند از آن همانند بیت کیپر استفاده کند، ولی هیچکدام از نرمافزارهای آزاد را مبتنی بر نیازهای خود ندید، به خصوص نیاز او به کارایی بالا.
تا قبل از ۲۰۰۲ برای گسترش کرنل از هیچ نرمافزار کنترل نسخه استفاده نمیشد و هر فردی که در گسترش کرنل نقش داشت به شکل خصوصی از نرمافزارهایی مانند SVN/CVS استفاده میکرد و دلیلش آن بود که هیچکدام از نرمافزارهای کنترل نسخه این توانایی را نداشتند که حجم تغییرهایی که در لینوکس اتفاق میافتاد را پشتیبانی کنند. در این سال لینوس از BitKeeper به عنوان نرمافزار کنترل نسخه رسمی لینوکس استفاده کرد که به گسترش دهندههای کرنل (هر پروژهٔ متن باز) اجازه میداد به صورت رایگان از BitKeeper استفاده کنند.
در سال ۲۰۰۵ اجازهٔ استفاده رایگان از Bitkeeper برای گسترش دهندگان لینوکس محدود شد (به دلیل انجام مهندسی معکوس روی Bitkeeper) و لینوس شروع به جستجو برای یافتن جایگزینی مناسب کرد. اما نرمافزار مناسبی پیدا نکرد که بتواند حجم تغییر لینوکس را مدیریت کنند و این کمبود سبب شد تا توروالدز به فکر نوشتن یک نرمافزار کنترل نسخه بیفتد. توسعه گیت در ماه آوریل سال ۲۰۰۵ آغاز شد و تنها ۲ هفته بعد از شروع توسعه، گیت قادر بود شاخهها (branch) را ادغام (merge) کند. ۲ ماه بعد گیت به عنوان نرمافزار کنترل نسخه رسمی برای گسترش لینوکس مورد استفاده قرار گرفت.
ساختار گیت
[ویرایش]در طراحی گیت از نرمافزارهای Bitkeeper و Monotone الهام گرفته شده است. گیت در ابتدا به صورت یک نرم نرمافزار کنترل نسخه سطح پایین نوشته شد به این صورت که دیگران بتوانند برای آن نرمافزار لایه رویی بنویسند. با این که گیت از bitkeeper تأثیرها و الهام زیادی داشته است در آن تلاش شده است که روشهای استفاده شده منحصر به فرد باشند.
اطلاعات کلی
[ویرایش]تجربه سازنده گیت در لینوکس با توجه به بزرگی و توزیع شده بودن آن و همچنین آشنایی با فرمت فایلها و نحوه ذخیره شدن و ساختار آنها در ساخت گیت مؤثر بوده است. این تأثیر باعث به وجود آمدن این موارد در پیادهسازی آن شده است.
حمایت قوی از برنامهنویسی غیر خطی
[ویرایش]گیت از ادغامسازی و شاخهسازی متوالی پشتیبانی میکند؛ و در آن ابزارهای ویژه تصویرسازی و جستجو در تاریخچه کد تعبیه شده است. در گیت فرض بر این بوده است که معمولاً ادغامسازی تغییرهای بیشتر از ایجاد و نوشتن تغییرهای جدید انجام میشود. همچنین در گیت شاخهسازی کم هزینه است و هر شاخهسازی تنها لینکی به یک تغییر دارد؛ و با استفاده از روابط وراثتی در شاخهسازیها شکل کلی بعد از هر شاخهسازی بهدست میآید.
برنامهنویسی توزیع شده
[ویرایش]مانند بسیاری از نرمافزارهای کنترل نسخه دیگر گیت به هر کاربر یک تاریخچه از تمامی تغییرها میدهد. این تغییرها در شاخههای مختلفی اعمال میشوند و میتوانند با نسخههای دیگر ادغام شوند.
تطبیقپذیری با سیستمهای خارجی و پروتکلها
[ویرایش]تاریخچه میتواند در فرمتهای مختلفی از جمله پروتکل انتقال ابرمتن (HTTP) و پروتکل انتقال فایل (FTP) و آرسینک یا یک پروتوکل گیت تحت سوکت یا پوسته ایمن (SSH) منتشر شود. همچنین یک سازنده سرور سیستم نسخههای همروند دارد که توسط آن سیستم نسخههای همروند کاربر و محیط یکپارچه توسعه نرمافزار (IDE) میتوانند به تاریخچه گیت دسترسی پیدا کنند.
پردازش بهینه برای پروژههای بزرگ
[ویرایش]سازنده آن، آن را بسیار سریع و توسعه پذیر توصیف کرده است. تستهای انجام شده بر روی آن توسط موزیلا نشان داده است که حدود ۱۰ برابر سریعتر از برخی دیگر از نرمافزارهای کنترل نسخه است و همچنین ذخیره تاریخچه تغییرها به صورت محلی باعث شده است که سر هم کردن آنها حدود ۱۰۰ بار سریعتر انجام شود.
امنیت دسترسیپذیری به تاریخچه
[ویرایش]گیت به صورتی پیادهسازی میشود که شماره هر نسخه به شماره تمامی نسخههایی که باعث به وجود آمدن آن نسخه شدهاند وابسته است. بعد از منتشر شدن هر نسخه نمیتوان در آن تغییری انجام داد که قابل مشاهده نباشد.
طراحی وابسته به ابزار
[ویرایش]گیت در اصل به زبان C و همچنین تعدادی واسطهمیان قسمتهای آن به زبان shell script نوشته شده است. اکثر قسمتهای آن برای افزایش بهینگی پردازش و افزایش امکان قابل حمل بودن تغییر یافتهاند ولی ساختار طراحی آن به همان صورت اولیه باقی مانده است و هنوز اتصال مؤلفههای آن به راحتی قابل انجام است.
استراتژیهای ادغامسازی قابل اتصال
[ویرایش]الگوریتم ادغامسازی گیت یک ادغامسازی کامل نیست؛ و در مواردی که نتواند ادغامسازی را انجام دهد به کاربر اطلاع داده و از اون میخواهد تا استراتژی مورد نظر خود برای ادغامسازی را انتخاب کند.
آشغالها باقی میمانند تا وقتی جمعآوری شوند
[ویرایش]بعضی از قابلیتها و بعضی از پردازههای استفاده نشده در پروژه برای پروژه بدون استفاده خواهند بود ولی در گیت باقی میمانند و به آنها اصطلاحاً آشغال گفته میشود. وقتی حافظه مربوط به آشغالها پر شود گیت به صورت خودکار جمعآوری آشغال را انجام میدهد. همچنین میتوان با این دستور آن را انجام داد.
git gc --prune
جمعآوری دورهای دادههای مجزا
[ویرایش]با گسترش پروژه حجم دادهها در فایلهای مختلف بیشتر و بیشتر میشود و هرچند که هر فایل به صورت مجزا فشردهسازی میشود ولی در مجموع فایلها حجم بالایی را اشغال خواهند و پردازش زیادی برای جستجو در میان آنها و پردازش آنها صرف میشود که این موضوع اصلاً بهینه نیست. برای حل این مشکل گیت مجموعه تعدادی از فایلها را در یک بسته نگهداری میکند. روش آن بدین صورت است که احتمال میدهد فایلهای با نام متشابه، محتوای متشابهی نیز داشته باشند و آنها را در یک بسته ذخیره میکند. هرچند که این روش لزوماً درست نیست. عملیات جمعآوری به صورت دورهای و در زمانهایی که فشار کمتری روی سرور باشد انجام میشود، مثل زمانهای خارج از وقت اداری.
داده ساختار
[ویرایش]گیت دو نوع ساختار دارد: نوع اول، یک ساختار تغییرپذیر که در آن اطلاعات پوشهای که در حال تغییر است و همچنین اطلاعات ساخت ورژن بعدی ذخیره میشود؛ و دیگری داده ساختاری غیرقابل تغییر و تنها قابل اضافه کردن از یک پایگاه داده است.
این پایگاه داده چهار نوع داده را ذخیره میکند.
- حباب (blob) شامل اطلاعات یک فایل است. blob دارای نام یا تاریخ نیست و نام آن از اطلاعات داخل آن نشئت میگیرد.
- درخت (tree) نشئت گرفته از یک پوشه است و لیستی از مجموعه فایلها را ذخیره میکند. در این لیست لینکهای مربوط به حبابها ذخیره میشود.
- اعمال (commit) مجموعهای از درختها را در خود ذخیره میکند. شامل اسم درختها، تاریخ اعمال، توضیحات (log message) و نامها مربوط به اعمالهای والدین خود است.
- برچسب (tag) شامل یک اشاره به دادهٔ دیگر است که در آن فراداده مورد نظر ذخیره میشود. اخیراً از آن برای نگهداری امضای مربوطه نیز استفاده میشود.
سرورهای گیت عموماً از پورت (TCP port 9418) استفاده میکنند.
رابطهها
[ویرایش]هر دادهای داخل گیت که به آن رابطهای شناسانده نشده باشد میتواند با اجرای دستور جمعآوری زباله یا به صورت خودکار حذف شود. رابطهها ممکن است از یک داده به دادهای دیگر یا به صورت مجزا باشند. گیت مدلهای مختلفی از رابطه دارد؛ و دستورها مختلفی برای دسترسی به آنها وجود دارد. چند نمونه از انواع رابطه:
- سر (head): به صورت محلی به یک داده اشاره دارد.
- کنترل از دور (remote): به یک داده خارجی اشاره دارد.
- ذخیرهای (stash): به یک داده که هنوز اعمال نشده اشاره دارد.
- برچسب (tag): در بالاتر توضیح داده شد.
در پوشهٔ پایهٔ هر پروژه که با استفاده از گیت مدیریت میشود پوشهای با نام git. (نقطه git) وجود دارد که تمامی اطلاعات مربوط به پروژه (تاریخچه، برچسبها، ...) را در خود نگه میدارد. این ساختار برخلاف ساختار سابورژن است که در هر زیرشاخه یک پوشهٔ svn. (نقطه svn) دارد. از جمله پروندههایی که در پوشهٔ git. وجود دارند، config است که تنظیمات مخزن را در خود نگه میدارد.
پیادهسازی
[ویرایش]گیت در ابتدا برای لینوکس نوشته شده است ولی علاوه بر آن سیستمهای عامل دیگری از جمله ویندوز و مک و Solaris و BSD را نیز پشتیبانی میکند.
اولین نسخهای از گیت که در ویندوز اجرا شد بر روی یک مجازیساز لینوکس در ویندوز بود. گیت در ویندوز تعدادی ابزار برای اجرای فایلبندیهای مربوط به لینوکس و تعدادی دیگر از امکانات لینوکس از جمله perl 5 و mysis 2.0 و یک نسخه از Cigwin و کامپایلر MinGW است. امروزه نسخه نصب گیت برای ویندوزهای ورژن ۳۲ بیتی و ۶۴ بیتی وجود دارد.
همچنین برای استفاده در جاوا JGit نوشته شده است و مثلاً ابزار Eclipse از یک نسخه کاربر از این ابزار استفاده میکند.
ابزار Dulwitch برای استفاده از گیت در python نوشته شده است.
همچنین libgit2 یک کتابخانه تحت ANSI C نوشته شده است که به هیچ زبان دیگری نیاز ندارد. این ابزار در محیطهای مختلفی از جمله ویندوز ویندوز و لینوکس و مک قابل استفاده است و از زبانهای برنامهنویسی مختلفی از جمله Rubby و Python و Haskell پشتیبانی میکند.
برای زبان java script نیز کتابخانه JS-Git نوشته شده است.
سرور گیت
[ویرایش]از گیت میتوان به صورت یک سرور استفاده کرد. از جمله قابلیتهای سرور گیت میتوان به نمایش تاریخچه گیت در بستر وب و مدیریت تاریخچههای مختلف اشاره کرد.
میتوان از روی تاریخچه نسخهای از یک فایل به اشتراک گذاشته شده ساخت و افراد مختلف به آن دسترسی پیدا کنند. همچنین با نصب نرمافزار Git میتوان از راه دور به سرور دسترسی پیدا کرد.
توسعه
[ویرایش]Eclipse Foundation در گزارشی در ماه مه سال ۲۰۱۴ گزارش کرد که امروزه گیت پراستفادهترین ابزار مدیریت متن برنامه میباشد. در سال ۲۰۱۴، از بین متخصصان برنامهنویسی ۴۲٫۹٪ از گیت به عنوان ابزار اصلی مدیریت متن برنامه خود استفاده میکنند. این عدد برای سال ۲۰۱۳ به میزان ۳۶٫۳٪ و در سال ۲۰۱۲، ۳۲٪ بوده است.
هم چنین طبق گزارشی از Stack Overflow در سال ۲۰۱۵، ۶۹٫۳٪ از برنامه نویسان از گیت و ۳۶٫۹٪ از ورژنهای جانبی آن و ۱۲٫۲٪ از TFS و ۷٫۹٪ از Mercurial استفاده میکنند.
سایت کارهای فناوری اطلاعات کانادا گزارش کرده است که از اواخر سپتامبر ۲۰۱۶، در ۲۹٫۲۷٪ از پیشنهادهای شغلی توسعه نرمافزار به گیت اشاره شده است. در کنار ۱۲٫۱۷٪ برای ماکروسافت و ۱۰٫۶۰٪ برای Subversion و ۱٫۳۰٪ برای Mercurial و ۰٫۴۸٪ برای Visual SourceSafe.
امنیت
[ویرایش]گیت ابزارهای امنیت کنترل دسترسی ارائه نمیدهد؛ ولی بستر لازم برای استفاده از آنها را تعبیه کرده است.
در ۱۷ دسامبر ۲۰۱۴ یک راه نفوذ به نسخهها کاربر تحت ویندوز و مک پیدا شد. حملهکننده قادر بود تا یک کد مخرب را با استفاده از یک درخت دستکاری شده در کامپیوتر مقصد اجرا کند. برای این کار یک کد مخرب در پوشهای قرار داده میشد و توسط درخت درستکاری شده، وقتی کاربر برای دریافت تغییرها پروژه درخواست میداد، در دستگاه کاربر ذخیره میشد. در همان روز گیت در نسخه ۲٫۲٫۱ خود این مشکل را حل کرده و آن را عرضه کرد و فردای آن روز این مشکل را گزارش کرد.
در نسخه ۲٫۶٫۱ عرضه شده در ۲۹ سپتامبر ۲۰۱۵ گیت یک افزونه برای یک آسیبپذیری امنیتی ارائه داد؛ که در آن مهاجم با متقاعد کردن کاربر به استفاده از یک لینک، که در آن دستوری برای انتقال به آدرسی دیگر وجود داشت میتوانست حتی با وجود رمزنگاری شده بودن ارتباط، حمله مرد میانی را انجام دهد.
دستورها
[ویرایش]برای استفاده از گیت ابتدا باید آن را نصب کرد که طریقه نصب برای سیستمهای مختلف متفاوت است.
در ادامه تعدادی از دستورها پرکاربرد گیت آمده است.
برای راهنمایی گرفتن دربارهٔ یک دستور:
git help دستور
برای اجرای تنظیمها از config استفاده میشود. جزئیات استفاده از این دستور را میتوان با دستور زیر بهدست آورد.
git help config
دستور ایجاد پوشه اصلی:
git init <آدرس پوشه اصلی>
دستور استفاده از یک گیت از قبل ساخته شده:
git clone ssh://<user> @ <host> /path/to/repo.git
استفاده میشود. دستور اضافه کردن فایل جدید:
git add <نام فایل>
دستور حذف فایل
git rm --cached <نام فایل>
دستور مشاهده وضعیت:
git status
بررسی تفاوتها در کد نوشته شده و اعمال نشده:
git diff
این دستور تغییرهای اعمال شده و ثبت نشده را نشان میدهد. دستور اطلاع از تاریخچه
git log
دستور قراردادن تغییرها:
git push
دستور اعمال تغییرها:
git commit
دستور دریافت تغییرها از روی تاریخچه:
git pull
دستور الحاق برچسب:
git tag
دستور بازگرداندن یک فایل به آخرین وضعیت ذخیره شده:
git checkout HEAD <نام فایل>
برای برگرداندن تغییرهای یک اِعمال خاص:
git revert <commit-id>
اصلاح یک اِعمال:
git commit -amend
جستارهای وابسته
[ویرایش]منابع
[ویرایش]- ↑ «?"GitFaq: Why the 'git' name"».
- ↑ «"After controversy, Torvalds begins work on 'git'"». بایگانیشده از اصلی در ۱ فوریه ۲۰۱۱.
- مشارکتکنندگان ویکیپدیا. «Git (software)». در دانشنامهٔ ویکیپدیای انگلیسی، بازبینیشده در ۲۱ آوریل ۲۰۱۰.