از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
برنامه نویسی برای مبتدیان – کنترل نسخه
Version Control چیست و چه کاربردی دارد ؟
سرفصلهای مطلب
کنترل نسخه
کنترل نسخه چیست و چه اهمیتی دارد؟ کنترل نسخه سیستمی است که تغییرات مربوط به یک یا چندین فایل را در طول زمان ذخیره میکند، تا کاربر بتواند به نسخههای قبلی مراجعت داشته باشد. در مثالهای استفاده شده در این مطلب از فایل های سورس نرم افزار جهت نمایش کنترل نسخه استفاده میشود، ولی با این وجود میتوان هر نوع فایلی را تحت کنترل نسخه قرار داد.
اگر شما یک گرافیست یا طراح وب باشید و تصمیم به نگهداری تمامی نسخههای یک عکس یا ساختار را داشته باشید (که قطعًا به همین منوال است)، استفاده از یک سیستم کنترل نسخه (VCS) راهبردی عاقلانه است. یک VCS این امکان را به شما میدهد تا: فایلها یا پروژهای را به یک وضعیت قبل برگردانید، تغییرات انجام گرفته در مرور زمان را مشاهده کنید، باعث و بانی تغییری را که منجر به ایجاد خطا یا مشکلی در سیستم شده است بیابید، چه کسی و چه زمانی موردی خاص را مطرح کرده است و بسیاری موارد دیگر. استفاده از یک VCS حتی این امکان را به شما میدهد که اگر احیاناً خطایی مرتکب شدید یا فایلی را اشتباهاً حذف یا از دست دادید، به راحتی آن را اصلاح و بازیابی کنید.
سیستمهای کنترل نسخه لوکال
روشی که اکثر کاربران جهت کنترل نسخه انتخاب میکنند شامل کپی کردن فایلها در پوشههای دیگر است (البته اگر هوشمندی نشان دهند، پوشه موردنظر را با تاریخ و زمان مشخصی نامگذاری میکنند). چنین روشی به جهت سادگی بین کاربران بسیار رایج است، ولی خطاپذیری بالایی نیز دارد. در این روش امکان دارد فرد به آسانی پوشهای که در آن قرار دارد را فراموش کرده و به اشتباه دست به تغییر فایلهایی بزند که مدنظر او نیست.
برای مقابله با این مشکل ، برنامه نویسان از زمانهای بسیار قبل اقدام به توسعه VCSها زدهاند که در بردارنده پایگاه داده سادهای هستند به گونه ای که تمامی تغییرات انجام شده برروی فایلهای هدف را در قالب کنترل نسخه نگهداری میکنند (تصویر 1-1)
یکی از رایجترین ابزارهای VCS سیستمی با نام rcs بوده است، که هم اکنون نیز به همراه تعداد زیادی از کامپیوترهای امروزی نیز توزیع میشود. حتی سیستم عامل رایج Mac OS X نیز با نصب ابزارهای توسعه توسط کاربر برروی آن، دستور خط فرمان rcs را در اختیار فرد قرار میدهد. این ابزار به زبانی ساده با حفظ مجموعهای از وصلهها (که تغییرات بین فایلها میباشند) از یک نسخه به نسخهای دیگر در قالب فرمتی خاص برروی دیسک عمل میکند؛ این ابزار با اجرای چنین سیستمی قادر است با متصل کردن وصلهها به یکدیگر توانایی بازسازی هر فایلی را در هر لحظهای از زمان داشته باشد.
سیستمهای کنترل نسخه مرکزی
مسئله مهم دیگری که کاربران با آن مواجه میشوند، نیاز آنها به همکاری با دیگر توسعهدهندگان برروی سیستمهای دیگر است. برای حل این مسئله، سیستمهای کنترل نسخه مرکزی (CVCSs) توسعه یافتند. چنین سیستمهایی مانند CVS، Subversion و Perforce در بردارنده سروری مرکزی هستند که تمامی نسخههای فایلها و حتی کاربرانی که این فایلها را از این مکان مرکزی checkout کردهاند در خود نگهداری میکند. برای سالهای زیادی، چنین روشی، روشی استاندارد برای کنترل نسخه بوده است (تصویر 1-2).
این ساختار مزایای بسیاری مخصوصاً نسبت به سیستمهای کنترل نسخه محلی دارد. به عنوان مثال، هر فرد در حد و اندازه مشخصی خواهد توانست بداند که دیگر افراد تا چه اندازه در پروژه شریک هستند. مدیران از این نظر که هرکس از نظر سطح دسترسی قادر به انجام چه کاری است، کنترل مناسبی دارند؛ همچنین مدیریت یک CVCS به مراتب آسانتر از تعامل با پایگاههای داده محلی موجود برروی سیستمهای کاربران است.
با این وجود، چنین ساختاری معایبی نیز دارد. واضحترین موضوع بروز کوچکترین ایراد در سرورهای مرکزی است. اگر برای مدت یک ساعت این سرور متوقف و از کار بیفتد، در طی این بازه یک ساعته هیچکس نخواهد توانست تعاملی با سرور داشته باشد یا حتی تغییرات نسخه را برروی چیزی که در حال کارکردن با آن است ذخیره کند. اگر هارد دیسکی که پایگاه داده مرکزی برروی آن قرار دارد خراب شود، و پشتیبان مناسبی از آن گرفته نشده باشد، کاربر به طور کامل تاریخچه پروژه را از دست خواهد داد به جز تصاویر لحظهای که هر کاربر احتمالاً برروی ماشین محلی خود خواهد داشت. سیستمهای VCS محلی نیز این عیب را به ارث میبرند-اگر کاربر تمامی تاریخچه پروژه را در یک مکان ذخیره کند، ریسک از دادن همه چیز به قوت خود باقی خواهد ماند.
سیستمهای کنترل نسخه توزیع شده
اینجا است که سیستمهای کنترل نسخه توزیع شده (DVCSs) نمود پیدا میکنند. در یک DVCS (مانند Git، Mercurial، Bazaar یا Darcs) کابران به checkout کردن آخرین تصویر لحظهای فایلها اکتفا نمیکنند: آنها مخزن را نیز بهصورت کامل کپی میکنند. بنابراین اگر هر سروری که سیستمها به واسطه آن در حال تعامل با یکدیگر هستند متوقف و از کار بیافتد، با کپی مخرن هر کدام از کاربران برروی سرور، عمل بازیابی انجام میگیرد. در واقع هر checkoutای، پشتیبان کاملی از تمامی دادهها است.
علاوه بر آن اکثر این سیستمها تعامل خوبی با داشتن مخازن خارجی متعدد جهت کار کردن با آنها دارند، در نتیجه شخص خواهد توانست با گروههای مختلفی در قالب پروژهای یکسان بهصورت همزمان تعامل داشته باشد. این قابلیت این امکان را به کاربر خواهد داد که جریانهای کاری متنوعی همانند مدلهای سلسه مراتبی را پیاده سازی کند که انجام آن در سیستمهای متمرکز امکان پذیر نیست.