مستندات

SVN چیست و چگونه با آن کار کنیم؟


مقدمه

این سند، یکی از سندهای داخلی تیم وردپرس فارسی بوده که قسمت های آموزش اش جدا شده. زبان غیر رسمی اون هم به خاطر داخلی بودن سند هست.

SVN چیست ؟

SVN سرنام Subversion Version Control به معنی مهار نگارش زیر نگارش است. این نرم افزار به عنوان قلب یک سیستم Repository قرار می گیرد. به بیان ساده‌تر ما یک مخزن (Repo) داریم که یه جوری می خوایم محتویاتش را با دیگران به اشتراک بگذاریم و به اونها این امکان رو بدیم که این محتویات رو به روز کنن، ولی تو این اشتراک دوست نداریم کار هیچ کس ، به اطلاعات مخزنمون آسیب برسونه. اینجاست که پای یک سیستم کنترل نسخه (Version Control) به میون می آد. این سیستم تمامی تغییرات مخزن رو حفظ می کنه و به کاربرای سیستم امکان می ده تا به خیال راحت به صورت گروهی اطلاعات مخزن رو دست کاری کنن، بدون اینکه خطر از دست رفتن و یا دوباره نویسی اطلاعات پیش بیاد.

نحوه کار به همراه چند مثال

  • SVN ما قبل از اعمال هر تغییر به کل مخزن یک شماره نسخه اختصاص می ده، که بهش می گه Revision. فرض کنید ما الان مخزنمون ساختارش اینجوریه : (Files یه فولدره و بقیه اسم فایلن، :۰ هم نشون دهنده Reviesion فعلی مون هست.
Files/functions.inc.php:0
Files/wrapper.class.php:0
  • هر کاربر قبل از هر کاری اول باید یه نسخه محلی از Repo داشته باشه. فرض کنید سرور SVN امون تو آدرس [[۱]] مخزن رو مدیریت می کنه. کاربر به اصطلاح SVN رو Check Out می کنه و یک نسخه محلی از کل مخزن روی کامپیوتر شخصیش می سازه. (بعدا این کار رو یاد می گیریم).
  • فرض کنید ۲ تا کاربر داریم، محسن و امیر. در مرحله اول فقط محسن داره رو سیستم کار می کنه.
  • حالا محسن ، Check Out می کنه و بعدش شروع می کنه به کار کردن روی فایل های محلیش، مثلا فایل functions.inc.php رو تغییر می ده. بعد این کار باید فایل هاش رو دوباره بفرسته به سرور. به این کار می گن Check In یا Commit. سرورمون هم Revision رو یه دونه می ببره بالا، یعنی ساختار سرورمون می شه:
Files/functions.inc.php:1
Files/wrapper.class.php:1 

همون طور که می بینید، Revision کل سیستم به روز شده. توجه کنید که سرور هم فایل های قدیمی رو داره و هم تغییرات رو لاگ کرده، به این ترتیب می شه به راحتی به هر کدوم از Revision ها با کل جزییات تغییرات دسترسی داشت.

  • چون تو این سیستم هر کسی روی نسخه محلی خودش کار می کنه، امکان کار موازی هست. ولی کار موازی مشکلات خاص خودش رو داره. چند تا حالت برای دو کاربر به طور همزمان ممکنه پیش بیاد که SVN همشون رو مدیریت می کنه:
Files/functions.inc.php:2
Files/wrapper.class.php:2 

(دقت کنید که با این که فایل wrapper.class.php تغییری نکرده ولی دیگه به Revision 2 تعلق داره.امیر تصمیم می گیره که Check In کنه، SVN بهش اطلاع می ده که آقای امیر، نسخه محلی شما به روز نیست! ولی خودش متوجه می شه که فایل wrapper.class.php دست نخورده و بهش اجازه میده که اون فایل رو دست بزنه تو مخزن، حالا ساختار مخزن اینجوریه:

Files/functions.inc.php:3
Files/wrapper.class.php:3 

ولی جالبه بدونید که رو کامپیوتر خودش، اون چنین چیزی رو خواهد داشت:

Files/functions.inc.php:1
Files/wrapper.class.php:3 

امیر، طبق عادت همیشگی کار های مشترک ،سریع کل سیستم رو Check Out می کنه تا آخرین نسخه همه چیز رو داشته باشه. این اون چیزیه که خیلی مهمه ، یه چیزایی تو مایه های CTRL+S  !

Files/functions.inc.php:3
Files/wrapper.class.php:3 

فرض کنید هر دو دارن رو functions.inc.php کار می کنن. باز هم محسن زودتر Check In می کنه و ساختار رو به این صورت در میاره:

Files/functions.inc.php:4
Files/wrapper.class.php:4 

حالا وقتی امیر هم می خواد تغییراتش رو روی همون فایل ثبت کنه، چون در واقع دیگه آخرین نسخه رو به صورت محلی نداشته، مشکلی پیش می آد که بهش می گن : Conflict

در این حالت، نرم افزار SVN به امیر می گه : اقا این فایلی که شما می خواید تغییر بدی، قبلا یکی دیگه تغییرش داده و شما الان ممکنه همه چیز رو خراب کنی و تغییرات اون رو از بین ببری…

خود نرم افزار توانایی مقایسه تغییرات و به اصطلاح merge کردن رو داره، ولی این کار تنها در صورتی امکان پذیره که دو کاربر دو جای مختلف فایل رو تغییر داده باشند… در غیر اینصورت این نوع تغییرات باید به وسیله یک عامل انسانی انجام بشه… یعنی امیر باید تغییرات محسن رو ببینه و سعی کنه خودش اونها رو در تغییرات خودش merge کنه.

چند تا نکته بالا اساس کار یک سیستم مخزن + SVN هست.

نرم‌افزار TortoiseSVN

این نرم‌افزار کمک می‌کند که در سیستم‌عامل ویندوز دستورات به آسانی انجام شود با این نرم‌افزار کار با SVN بسیار اسان‌تر خواهد بود