مدیریت پروژه با مدلهای متمرکز و ائتلافی گیت

در مقالات گذشته با فرمانهای گیت در رابطه با مخازن آشنا شدیم. در این مقاله با برخی متدهای پیشنهادی در رابطه با مخازن خارجی آشنا خواهیم شد. دو متد رایج برای استفاده از مخازن خارجی جهت همکاری بین برنامه نویسان مختلف بر روی یک پروژه عبارتند از مدل متمرکز و مدل ائتلافی. اگر قبلا با سامانه های مدیریت ورژنی همچون SVN و CVS کار کرده باشید با مدل متمرکز آشنایی کامل دارید.

مقالات مرتبط

در مقالات گذشته با فرمانهای گیت در رابطه با مخازن آشنا شدیم. در این مقاله با برخی متدهای پیشنهادی در رابطه با مخازن خارجی آشنا خواهیم شد. دو متد رایج برای استفاده از مخازن خارجی جهت همکاری بین برنامه نویسان مختلف بر روی یک پروژه عبارتند از مدل متمرکز و مدل ائتلافی. اگر قبلا با سامانه های مدیریت ورژنی همچون SVN و CVS کار کرده باشید با مدل متمرکز آشنایی کامل دارید.

توجه داشته باشید که از نظر گیت تمامی مخازن یا repository ها یکسان هستند و به طور مثال مخزنی به نام مستر برای گیت معنای خاصی ندارد و تمام این نامگذاریها تنها جهت تشریح متدهای استفاده از مخازن خارجی میباشد.

مخازن عمومی یا public

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

git init --bare <path>

مخازن عمومی باید تنها جهت ذخیره سورس کد پروژه استفاده شوند نه به عنوان محیط طراحی و توسعه پروژه. لذا از پسوند git برای مشخص کردن مخزن عمومی استفاده میشود در نتیجه مثال کامل به صورت زیر خواهد بود:

git init --bare some-repo.git

به جز دارا نبودن پوشه پروژه، مخازن عمومی فرق دیگری با دیگر مخازن عادی ندارند و شما میتوانید مانند دیگر مخازن از push، pull و ... بر روی آنها استفاده کنید.

مدل متمرکز

مدل متمرکز مناسب تیمهای کوچک میباشد به طوری که هر یک از اعضاء تیم کد نویسی دارای سطح دسترسی ثبت تغییرات بر روی مخزن عمومی هستند. این مدل بسیار شبیه مدل رایج در سیستمهای SVN و CVS میباشد. در این مدل تمامی تغییرات باید بواسطه مخزن عمومی بین تمام اعضای تیم به اشتراک گذاشته شود. در این مدل مخزن عمومی معمولا بر روی سرور داخلی نصب هستند و یا آنلاین هستند مانند github و bitbucket.

مدل متمرکز در مخازن گیت

در این مدل کدنویسان مختلف پروژه روی مخازن شخصی خود کار میکنند که کاملاً از مخازن دیگر همکاران جدا میباشند. زمانی که کد نویسی یک بخش از پروژه توسط هر یک از اعضا تکمیل شد، کد در شاخه مستر مخازن شخصی کامیت میشوند و سپس به مخزن عمومی push میشوند.

به روز رسانی مخزن عمومی

پس از آپلود تغییرات جدید توسط یکی از اعضا تیم به مخزن عمومی دیگر اعضا تیم میتوانند این تغییرات را به مخازن شخصی خود با استفاده از merge و یا rebase اضافه کنند.

با فرآیند اصلی در مدل متمرکز آشنا شدیم. اما این مدل دارای محدودیتهایی نیز میباشد، به طور مثال زمانی که چند عضو تیم بخواهند همزمان به مخزن عمومی آپلود کنند این مدل دچار مشکل میشود. به همین دلیل هم در ابتدای معرفی این مدل اشاره شد که این مدل مناسب تیمهای کوچک برنامه نویسی میباشد.

در چنین شرایطی اولین عضوی که به مخزن عمومی دسترسی پیدا کند میتواند تغییرات خود را آپلود کند اما عضو دیگر با شاخه شدن تاریخچه مواجه میشود و نمیتواند از fast forward برای merge استفاده کند. به طور مثال در تصویر زیر اگر برنامه نویسی با نام john قبل از اینکه Mary تغییرات خود را آپلود کند اقدام به آپلود به مخزن عمومی کند در مخزن Mary تضاد داده بوجود می آید.

آپلود همزمان تغییرات به مخزن عمومی در مدل متمرکز

همانطور که ملاحظه میکنید تنها راه برای حل این مشکل overwrite کردن کامیت john میباشد که گیت هرگز اجازه چنین عملی را نمیدهد و بجای آن یک پیغام خطا مشابه زیر نمایش میدهد:

        ! [rejected] master -> master (non-fast-forward)
        error: failed to push some refs to 'some-repo.git'
    

لذا راه باقی مانده برای Mary همفاز سازی مجدد مخزن شخصی خود با مخزن عمومی و آپلود تغییرات پس از همفاز سازی میباشد:

git fetch origin master
git rebase origin/master
git push origin master

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

مدل ائتلافی

در این مدل تک تک اعضا علاوه بر مخزن شخصی یک کپی از مخزن عمومی را نیز در سیستم شخصی خود دارند. علت نگهداری کپی از مخزن عمومی در سیستم هر یک اعضا، امنیت و حل مشکلات رایج در مدل متمرکز میباشد.

مشکل اصلی مدل متمرکز این هست که تمامی اعضا باید دارای سطح دسترسی ثبت در مخزن عمومی باشند. این مشکل برای تیمهای کوچک و با اطمینان محسوس نمیباشد اما برای پروژه های opensource که هر برنامه نویسی در آنها همکاری کند سطح دسترسی push برای همه میتواند منجر به از دست رفتن کنترل بر روی پروژه شود.

در نتیجه برای حل این مشکل شما به عنوان مدیر پروژه میتوانید از اعضاء درخواست کنید که تغییرات خود را به مخزن عمومی واقع در سیستم خودشان push کنند. سپس شما تغییرات آنها را از روی مخزن عمومی آنها به مخزن شخصی خود دانلود و بررسی میکنید و در صورتی که تغییرات مورد تایید شما باشند شما این تغییرات را به مخزن عمومی آپلود میکنید.

مدل ائتلافی در مخازن عمومی گیت

در نتیجه در این مدل برنامه نویسان بر روی مخازن شخصی خود کار میکنند و تغییرات نهایی را در کپی مخازن عمومی واقع در سیستم خودشان push میکنند و مدیر پروژه را در جریان تغییرات میگذارند و در صورتی که تغییرات مورد تایید مدیر پروژه باشد، خود مدیر پروژه تغییرات را بر روی مخزن عمومی واقع در سرور و یا اینترنت آپلود میکند.

تعامل برنامه نویسان در مدل ائتلافی گیت

توجه داشته باشید که در مدل ائتلافی نیز یک مخزن عمومی رسمی به عنوان مخزن اصلی برای نگهداری سورس پروژه وجود دارد که معمولا این مخزن در bitbucket یا github و یا دیگر سرویسهای مبتنی بر اینترنت گیت قرار دارند. در تصویر بالا your public repo همان مخزن عمومی رسمی میباشد.

امیدوارم این سری مقالات شما را با گیت آشنا کرده باشند البته هدف از این مقالات صرفاً آشنا نمودن شما دوستان گرامی با گیت بود و در صورتی که بیشتر مایلید در رابطه با گیت مطالعه داشته باشید سایت git-scm.com را پیشنهاد میکنم که در آن نسخه آنلاین کتاب Pro Git نیز به صورت مجانی برای مطالعه در اختیار بازدید کنندگان قرار داده شده است.