‫بررسی چند git server ویندوزی

git-dot-aspx

* مشکلی با فایل‌های حجیم ندارد. فقط کافی است http.postBuffer و maxRequestLength تنظیم شود.
* لازم نیست که حتماً repoها توسط خودش ایجاد شده باشد. اگر یک repo را در مسیر repoهایش قرار دهید می‌توانید از آن استفاده کنید.
* اینترفیس وبی آن فقط فهرست repoها و comment آخرین تغییر را نشان می‌دهد نه هیچ اطلاعات دیگری.
* همه repoهای آن باید پسوند ‎.git داشته باشند.
* به صورت پیش فرض anonymous است یعنی هر کسی می‌تواند clone بگیرد یا push کند.
* برای بالا بردن امنیت باید نوع Authentication را در IIS برابر Basic قرار دهید و با urlهایی شبیه به http://user:password@hostname با آن کار کنید. البته می‌توانید با هر با push/pull نام کاربری و password را هم ارسال کنید. امنیت در سطح کل repoها قابل تعریف است نه به ازای تک تک repoها. اگر در password از کاراکترهای ویژه استفاده کرده‌اید باید url را به صورت http://”user:password”@hostname استفاده کنید.

bonobo git server

* urlهای ارسالی به آن case sensitive است
* مشکل commitهای با حجم بالا دارد. با این که دستور git config http.postBuffer 524288000 یا git config –global http.postBuffer 524288000 را در client اجرا کرده و در web.config مقدار maxRequestLength را افزایش دادم باز هم نتوانستم فایل‌های بیش از مثلاً ۱۰۰ کیلوبایت را به سرور push کنم.
* به صورت پیش فرض از user/pass استفاده می‌کند. در نتیجه می‌توان از repoها حفاظت کرد.
* اینترفیس وب آن اطلاعات خیلی خوبی را ارائه می‌دهد، از جمله فهرست commitها.
* امکان تعریف کاربر و تعیین دسترسی به ازای تک تک repoها وجود دارد.

Git-Web-Access

* به هیچ وجه نتوانستم با آن کار کنم. یا من خیلی اشتباه عمل کردم یا این برنامه خیلی ناقص است.

‫git server با استفاده از ویندوز و دات‌نت

تا همین چند وقت پیش برای ایجاد یک git server در ویندوز مجبور بودید از راه حل‌های لینوکسی مثل OpenSSH و cygwin استفاده کنید. استفاده از این طور راه حل‌ها واقعاً سخت و عذاب آور بود و گاهی اوقات باعث می‌شد شخص قید git server ویندوزی را بزند و به سراغ گزینه‌های دیگری مثل مرکوری برود. خوشبختانه جامعه کاربری git در ویندوز بیکار ننشسته و طی این مدت روش‌ها و ابزارهای جدیدی ارائه شده است:

git-dot-aspx
تعداد دانلود خوبی داشته و با چهار رقمی شدن فاصله‌ای ندارد.

bonobo git server
با استفاده از ASP.NET MVC نوشته شده است. downloadهای زیادی ندارد و حتی نقد منفی هم دارد. آن را تست کردم و فعلاً در push کردن فایل‌های حجیم (بیش از یک مگابایت) مشکل دارد.

grack
یک راه حل مبتنی بر ruby

git_http_backend.py
یک راه حل مبتنی بر پایتون

استفاده از Apache و امکانات مخصوص msysgit
به جای IIS از Apache استفاده می‌کند ولی راه حل مطمئن و امتحان شده‌ای است.

Git-Web-Access
الهام گرفته از grak و git_http_backend.py ولی نوشته شده با ASP.NET و WCF

تسلیم می‌شویم

در یکی از مجموعه‌ها خیلی اصرار کردم که به جای TFS از SVN استفاده شود. اما نتوانستم حرفم را به کرسی بنشانم. الان در آن مجموعه تقریباً از همه امکانات سورس کنترلی TFS استفاده شده و به غیر از دو سه ماه اول که دوستان خطاهای Runtime برنامه‌شان را هم به گردن TFS می‌انداختند مشکل خاصی وجود ندارد.

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

۱- قبل از صدور دستور commit، فایل‌های تغییر یافته‌شان را save کنند،

۲- حذف و اضافه فایل به پروژه در ویژوال استودیو نیاز به Save all یا اقلاً یک Rebuild Solution دارد،

۳- اگر دو نفر یک جای یکسان از یک فایل واحد را تغییر دهند، merge conflictی به وجود می‌آید که خود git نمی‌تواند آن را به طور خودکار resolve (حل) کند. و این از منطق کار تیمی و منطق فکری نشات می‌گیرد و جز نقایص git یا هر سورس کنترل دیگری نیست،

۴- ساختار پروژه در ویژوال استودیو خودش در یک فایل خاص با پسوند csproj نگهداری می‌شود پس به وجود آمدن merge conflict در آنجا هم امکان‌پذیر است،

۵- برای پیشگیری از merge conflict اول هر روز کاری یا حتی دو سه بار در روز، قبل از شروع کار باید اول تغییرات دیگران را دریافت کرد،

۶- نگهداری فایل یک کلاس یا winform با بیش از ۱۵۰۰ خط کار درستی در یک محیط تیمی و تحت سورس کنترل نیست،

۷- …

تنها فرق حالت اول و دوم این است در که در حالت اول خود ویژوال استودیو همه کارها را انجام می‌دهد. مثلاً قبلاً از check-in شما را مجبور می‌کند که همه فایل‌ها را save کنید. بنابراین کسی مجبور نیست از معدن گچش استفاده کرده و حواسش به save فایل‌ها قبل از ارسال به سرور باشد.

این است که دست‌هایمان را به نشانه تسلیم بالا برده و اجازه می‌دهیم دوستان به جای استفاده از git، سورس مشترکشان را روزی ده بار از طریق usb flash با هم به اشتراک بگذارند و خودشان نقش سورس کنترل را بازی کنند.

البته این بازی یک درس هم برای من داشت. آن هم این که اگر افراد به طور داوطلبانه از سورس کنترل git یا حتی svn استفاده کردند معنی‌اش آن است که آنها افراد دقیق و قابل اعتمادی هستند.

.
.
.
.

باشد که روزی به راه راست هدایت شویم.

‫سرویس اشتراک کد gist

آیا شما هم مشکل نمایش سورس کد در وبلاگ دارید؟ آیا شما هم مجبورید به خاطر یک تیکه کد ساده آن را جایی آپلود کنید تا بقیه بتوانند آن را دریافت کنند؟ آیا دوست دارید با همین تیکه کدهای کوچک هم امکان history و fork داشته باشید؟ آیا کامنت دیگران برایتان مهم است؟ آیا…؟

در کنار همه سرویس‌های موجود برای اشتراک کد، سرویسی به نام gist از زیر مجموعه‌های سایت github.com وجود دارد که همه امکانات بالا را برایتان به ارمغان می‌آورد. به عنوان نمونه به تکه کدی که خودم برای تست گذاشته‌ام نگاه کنید:

پ. ن.:این روش یک بدی کوچک دارد آن هم این که با backup گیری از نوشته‌های وبلاگ، سورس کدتان هم backup گرفته نمی‌شود.

‫معرفی Git Extensions

در طول مدتی که با git کار کرده‌ام فقط از command line استفاده کردم چون فکر می‌کنم command line به قلب git نزدیک‌تر است. اما هر چقدر هم به command line عادت داشته باشیم باز هم بعضی وقت‌ها نیاز به یک ابزار visual هست. یکی از قشنگ‌ترین ابزارهای گرافیکی تحت ویندوزی که به نظر من وجود دارد، Git Extensions است.

عکس ۱ – صفحه اول Git Extension

عکس ۲ – history کل مخزن

عکس ۳ – مشاهده فایل‌های تغییر کرده و تغییرات هر کدام از آنها در  هر کدام از commitها.

عکس ۴- مشاهده درخت پروژه

عکس ۵ – مشاهده history یک تک فایل

عکس ۶ – مشاهده تغییرات انجام شده در یک commit دلخواه

‫امکانات انقلابی git

انقلابی‌ترین امکان git خاصیت distributed آن است. بعد از این قضیه دو دستور زیر به نظر من خیلی انقلابی می‌آیند:

۱- دستور git stash
فرض کنید در حال اعمال یک سری تغییرات دامنه دار در سورس برنامه هستید. فرض کنید تعداد زیادی فایل را modify کرده و تعدادی را هم اضافه یا حذف کرده‌اید. حالا وسط کار متوجه باگ یا ایرادی در سورس می‌شوید که ارتباطی با تغییرات اخیرتان ندارد ولی به هر صورت می‌خواهید هم این اشکال را حل کنید و هم این که commit این رفع باگ با commit تغییرات مورد ذکر یکی نباشد. حالا باید چه کار کرد؟ راه معمول این است که باگ مشاهده شده را در جایی یادداشت کرد و بعداً آن را اصلاح کرد، البته اگر تغییرات اخیرتان به آن وابسته نباشد. راه دیگر آن است که تغییرات اخیر را un-do کرده، باگ مورد نظر را رفع کرده و تغییرات اصلی را مجددا از نو شروع کنید.

به جای همه این کارها می‌توان از یکی از امکانات جالب git به نام stash استفاده کنید. stash تغییرات فعلی شما را به یک جای موقتی که خودش می‌داند منتقل کرده و INDEX را برای شما پاک می‌کند. حالا می‌توانید با خیال راحت باگ مورد نظر را رفع و commit نمایید. سپس با استفاده از stash تغییرات قبلی را به INDEX برگردانده و کار را از همانجا که قطع شده بود، شروع کنید بدون آن که چیزی را از دست داده باشید.

۲- دستور git grep
دستور grep دستور ساده‌ای است که می‌تواند عبارت خاصی را در فایل‌های موجود در source control گیت مورد جستجو قرار دهد. آنها که به search سورس در Visual Studio عادت دارند مطمئناً از git grep خیلی خوششان خواهد آمد.

‫بعضی از دستورات ضروری git

مشاهده تغییرات قبل از commit
git diff –cached

ایجاد یک branch به اسم mybranch
git branch mybranch

سویچ کردن بین branchهای مختلف
git checkout mybrabch

نمایش branchهای موجود و branch جاری
git branch

merge برنچ mybranch با branch جاری
git merge

حذف یک branch
git branch -d mybranch

تهیه branch از یک remote branch
git branch –track experimental origin/experimental

خالی کردن موقتی working diretory
git stash

جستجو در فایل‌ها
git grep search_phrase

undo کردن تغییرات سورسی که هنوز commit نشده است
git reset –hard HEAD

Undo کردن تغییرات یک تک فایل
git checkout HEAD hello.rb

بررسی سالم بودن فایل‌های git
git fsck

بررسی این که چه کسی چه قسمتی از یک فایل را تغییر داده است
git blame sha1_file.c

درست کردن shortcut و خلاصه برای دستورات طولانی git
git config –global alias.last ‘cat-file commit HEAD’‎

منبع:
کتاب git community

‫بعضی اصطلاحات مهم git

git directory
همان فولدر ‎.git است که خود سورس کنترل هم محسوب می‌شود.

working directory
فضای معمولی انجام کار با سورس برنامه است.

INDEX
فضای موقتی که نشانگر فایل‌های تغییر یافته یا جدیدی هستند که قرار است با commit بعدی به مخزن بروند. INDEX نقش واسطه بین working directory و git directory را بازی می‌کند. دستور git status برای نمایش اطلاعاتش از INDEX استفاده می‌کند.

HEAD
اشاره می‌کند به آخرین commit برنچ جاری.   

origin
آدرس URLی است که clone از آنجا انجام شده.

‫clientها و ابزارهای کار با git در ویندوز

mysysgit
خود git است که به صورت command line کار می‌کند.

Cygwin
اجرای git از طریق Cygwin که یک شبیه ساز برنامه‌های لینوکس در ویندوز است.

gitk و git-gui دو ابزار گرافیکی که همراه با خود git نصب می‌شوند.

TortoiseGit
با ویندوز یکی می‌شود. مشابه TortoiseSVN. ظاهراً امکانات خوبی دارد و برای کسانی که به TortoiseSVN عادت دارند خیلی مناسب است.

Git-Cheetah
با ویندوز یکی می‌شود. البته نسبت ویندوزی بودن آن اصلاً مطمئن نیستم.

Git Extensions
با ویندوز یکی می‌شود. به صورت Add-on به ویژوال استودیو هم اضافه می‌شود. ولی Add-on ویژوال استودیو آن اصلاً جالب نیست. تنها کلاینتی است (به جز command line) که تا کنون با آن کار کرده‌ام.

Git Source Control Provider
این برنامه صرفاً یک Visual Studio plugin است. به نظر می‌رسد امکانات خوبی داشته و جای خالی AnkhSVN را بتواند پر کند.

SmartGit
صرفاً یک برنامه ویندوزی کار با git بدون integration با ویندوز یا Visual Studio بوده و ضمناً غیر رایگان است.

GitForce
مشابه SmartGit صرفاً یک برنامه ویندوزی کار با git بدون integration با ویندوز یا ویژوال استودیو بوده ولی رایگان می‌باشد.

Git#‎
API کار با git در C#‎.

اطلاعات بیشتر:

‫لذت Low Level

یک زمانی عاشق برنامه‌نویسی به زبان Assembly بودم. هر چند که هیچ وقت به طور جدی به اسمبلی نپرداختم، اما همیشه ور رفتن با دستورات JMP و SUM و کار کردن با رجیسترها را دوست داشتم. داس را هم خیلی دوست داشتم چون حس می‌کردم با داس به خود اصل کامپیوتر دسترسی مستقیم دارم. با آمدن ویندوز مدت‌ّها depress بودم چون حس می‌کردم ویندوز مثل یک لایه ضخیم عمل می‌کند و نمی‌گذارد من به اصل ماشین دسترسی پیدا کنم.

اما این روزها حس Low Level دوستی‌ام با دو چیز به خوبی ارضا می‌شود. یکی ریزه‌کاری‌های NHibernate مثل Fetch Mode، First/Level Cache و Mappingها و دیگری ور رفتن با git به عنوان یک ابزار سورس کنترل غیر متمرکز. git و ساختار و نحوه استفاده آن آنقدر جذابیت دارد که می‌توان ساعت‌ها بدون بلند شدن از جلوی کامپیوتر با آن کار کرد.