گیت (Git) و گیت هاب (Github) جزو ابزارهای قدرتمند در دنیای برنامهنویسی هستند و انجام بسیاری از کارها را ساده میکنند. با کمک این دو ابزار میتوانید نسخههای مختلف برنامه را کنترل کرده و تغییرات ایجاد شده در آنها را ردیابی کنید. همچنین این امکان را میدهد تا به صورت گروهی بر روی پروژهها فعالیت داشته باشید. امروزه اکثر زبانهای برنامهنویسی بهخصوص سی شارپ از گیت و گیت هاب پشتیبانی میکنند و با کمک آنها میتوانید کارها را سریعتر انجام دهید. در این نوشته قصد داریم به آموزش Git و Github با سی شارپ بپردازیم تا اطلاعات بیشتری در این خصوص داشته باشید.
برای ادغام دستورات گیت در C# از LibGit2Sharp Nuget استفاده خواهیم کرد. در صورتی که با مفاهیم اولیه Git و Github آشنا نیستید، توصیه میکنیم قبل از شروع این محتوا کمی در مورد این دو مفهوم تحقیق کنید؛ البته در ادامه به صورت خلاصه به بررسی آنها خواهیم پرداخت.
چرا استفاده از گیت و گیت هاب در سی شارپ مهم است؟
Git یک سیستم کنترل نسخه (Version Control System) پیشرفته و قدرتمند است که به برنامهنویسان سی شارپ کمک میکند تا تغییرات ایجاد شده در کدها را ردیابی و نسخههای مختلفی از برنامه را ایجاد کنند. گیت هاب (Github) نیز یک سرویس میزبانی است و به توسعهدهندگان اجازه میدهد تا مخزن Git را با سایر برنامهنویسان به اشتراک گذاشته و پروژهها را به صورت تیمی پیش ببرند و کارهایی از قبیل مستندسازی یا گزارشات را انجام دهند.
آموزش git و github با سی شارپ ضروری است؛ چرا که:
- لازم نیست برای بهروزرسانی اپلیکیشنها، کدهای خود را کپی کنید؛ زمانی که باگهای پروژه را اصلاح کردید با یک دستور ساده میتوانید کدهای خود را بهروزرسانی نمایید.
- این دو ابزار به شما کمک میکنند تا به مراحل قبلی کدنویسی برگشته و دستورات اشتباه را حذف کنید.
- میتوانید با دوستانتان بر روی بخشهای مختلف اپلیکیشن کار کنید؛ بدون اینکه خللی در انجام کارها به وجود بیاید.
- کارهایی که انجام دادهاید را به راحتی مشاهده خواهید کرد.
آموزش نصب Git و Github در سی شارپ
اولین قدم در آموزش گیت و آموزش گیت هاب در سی شارپ، نصب بسته LibGit2Sharp از طریق Nuget است. با استفاده از این بسته میتوانید دستورات Git را اجرا کرده و نسخههای مختلف برنامه خود را کنترل کنید. بهتر است بدانید Nuget یک مدیریت بسته یا package manager برای پروژههای سی شارپ است. برنامه نویسان با کمک این سیستم میتوانند کتابخانهها و افزونههای موجود در برنامه را نصب و بروز کنند.
در آموزش سریع گیت هاب برای نصب LibGit2Sharp دو را پیش روی خود دارید که عبارتند از:
- استفاده از NuGet Package Manager در ویژوال استودیو
- استفاده از از دستور dotnet add package LibGit2Sharp در NET CLI
با انجام یکی از کارهای بالا، پکیج LibGit2Sharp نصب میشود. بعد از آن میتوانید دستورات مورد نیاز را وارد کرده و برنامه خود را مدیریت کنید.
نکته مهم: برای کار کردن با گیت هاب اولین کاری که باید انجام دهید عضویت در این ابزار است. برای اینکار کافی است به این آدرس مراجعه کرده و مراحل ثبت نام را انجام دهید.
دستورات مورد نیاز در آموزش git و github با سی شارپ
کار بعدی که در آموزش نصب گیت هاب در C# انجام خواهیم داد، ساخت مخزن گیت و clone یا کپی کردن پروژهها است.
مخزن یا Repository در گیت هاب یک پوشه است که برای ساماندهی یک پروژه مورد استفاده قرار میگیرد. در این مخزن میتوانید تصاویر، ویدیوها، فایلهای پروژه و دیتابیسها را قرار دهید. یک فایل به نام Readme نیز در مخزن گیت ایجاد میشود و اطلاعات پروژه را در خود نگهداری میکند.
پکیج LitGit2Sharp به شما این امکان را میدهد تا برای نرم افزارهای C# مخزن جدید در گیت ایجاد کرده و آن را مقداردهی اولیه کنید. این کار در سی شارپ با دستور Repository.init انجام میگیرد. همچنین اگر یک مخزن در گیت داشته باشید با استفاده از دستور Repository.Clone میتوانید آن مخزن را فراخوانی کنید.
اگر آشنایی با github داشته باشید باید بدانید که این سیستم دو مخزن در اختیار برنامهنویسان قرار میدهد؛ یک مخزن به صورت ریموت و کنترل از راه دور و یک مخزن محلی. در صورتی که از مخزن آنلاین در برنامههای خود استفاده کنید، با هر بار تغییر در کدها و پوش کردن، تغییرات اعمال شده برای همه اعضای تیم در دسترس خواهد بود؛ اما شما میتوانید کدهای موجود در مخزن را کپی کرده و در سیستم خود ذخیره کنید و سپس تغییرات مورد نیاز را اعمال نمایید. در این حالت تنها زمانی که پروژه را به پایان رساندید و آن را در گیت هاب آپلود کردید برای سایر اعضای تیم قابل مشاهده خواهد بود.
برای کپی کردن مخزن در پکیج LibGit2Sharp میتوانید از دستور Repository.clone استفاده نمایید؛ درست مانند کد زیر:
public void CloneRepo(string repositoryUrl, string localRepoPath, string userName, string password) { try { var options = new CloneOptions { FetchOptions = { CredentialsProvider = (_url, _user, _cred) => new UsernamePasswordCredentials { Username = userName, Password = password } } }; Repository.Clone(repositoryUrl, localRepoPath, options); } catch (LibGit2SharpException) { throw; } }
پیشنهاد مطالعه: آموزش توابع API در سی شارپ به زبان ساده
توضیحات موارد مورد نیاز در کد
در این بخش از آموزش git و github با سی شارپ قصد داریم نکتههایی را راجع به کد بالا ارائه دهیم تا بهتر متوجه شوید.
1. برای به دست آوردن repositoryUrl در کد بالا باید وارد مخزن ایجاد شده در گیت هاب شوید. سپس با انتخاب دکمه Code میتوانید آدرس پروژه را به دست آورید. این دارای پسوند .git است.
2. localRepoPath به آدرسی اشاره دارد که قصد دارید پروژه را در آن کپی یا clone کنید.
3. در متغیر username نیز باید نام کاربری حساب github را قرار دهید.
4. در متغیر password لازم است رمز عبور خود در گیت هاب را وارد نمایید. برای ایجاد پسورد در این سیستم باید مراحل زیر را دنبال کنید.
- در گیت هاب وارد بخش تنظیمات یا Settings شده و سپس بر روی developer settings کلیک کنید.
- سپس از بخش personal access tokens گزینه Fine-grained tokens را انتخاب نمایید.
- اطلاعات درخواستی در فرم از جمله نام توکن و تاریخ انقضا را وارد کرده و در نهایت بر روی Generate Token کلیک کنید.
بعد از انجام مراحل بالا، یک توکن مخصوص مانند عکس زیر در اختیارتان قرار خواهد گرفت.
5. این توکن را کپی کرده و به جای متغیر password در کد قرار دهید.
آشنایی با دستورات گیت در C#
در ادامه آموزش git و github با سی شارپ قصد داریم برخی از دستورهای مهم و پایهای را با شما عزیزان به اشتراک بگذاریم.
۱. بررسی وضعیت فایلها
برای بررسی وضعیت فایلها و کدهای موجود در گیت هاب میتوانید از کد زیر استفاده کنید. این دستور در هر زمانی قابل استفاده است. دقت داشته باشید اگر هیچ تغییری در مخزن محلی به وجود نیامده باشد، وضعیت به صورت خالی برگشت داده میشود.
public string GetStatus(string localRepoPath) { string status = string.Empty; try { using (var repository = new Repository(localRepoPath)) { status = string.Join(Environment.NewLine, repository.RetrieveStatus(new StatusOptions()) .Select(item => $"{item.State}:{item.FilePath}")); } } catch (LibGit2SharpException) { throw; } return status; }
۲. ثبت تغییرات در گیت
کار بعدی که در آموزش git و github با سی شارپ انجام خواهیم داد، ثبت تغییرات ایجاد شده در گیت است. در واقع زمانی که تغییری را در کد ایجاد میکنید، ابتدا با استفاده از دستور git status میتوانید تغییرات را مشاهده کنید. در قدم بعدی اگر از تغییرات ایجاد شده رضایت داشتید باید آنها را به مرحله دوم یعنی Staged ارسال نمایید. برای ارسال کد به این مرحله در سی شارپ، کد زیر را به کار ببرید.
public void StageFiles(string localRepoPath) { try { var files = from file in Directory.EnumerateFiles(localRepoPath) select file; using (var repository = new Repository(localRepoPath)) { foreach (var file in files) { var fileName = Path.GetFileName(file); // Stage the file repository.Index.Add(fileName); repository.Index.Write(); } } } catch (LibGit2SharpException) { throw; } }
در آخر نیز برای ثبت نهایی تغییرات در مخزن محلی باید از دستور git commit استفاده کنید. این کار در C# به شکل زیر انجام میگیرد.
public void CommitFiles(string localRepoPath, string userName, string userEmail, string userComments) { try { using (var repository = new Repository(localRepoPath)) { Signature author = new Signature(userName, userEmail, DateTime.Now); Signature committer = author; // Commit to the repository Commit commit = repository.Commit(userComments, author, committer); } } catch (LibGit2SharpException) { throw; } }
۳. ارسال کدها و تغییرات به مخزن آنلاین
بعد از اینکه تغییرات مورد نیاز را بر روی کدها در مخزن محلی اعمال کردید، نوبت به ارسال آنها به مخزن آنلاین و اشتراکگذاری با سایر افراد میرسد. به این عمل در اصطلاح push گفته میشود و روش انجام آن در سی شارپ به شکل زیر است.
public void CommitFiles(string localRepoPath, string repoUrl, string branchName, string userName, string password) { try { using (var repo = new Repository(localRepoPath)) { var remote = repo.Network.Remotes["origin"]; if (remote != null) { repo.Network.Remotes.Remove("origin"); } repo.Network.Remotes.Add("origin", repoUrl); remote = repo.Network.Remotes["origin"]; if (remote == null) { return; } FetchOptions fetop = new FetchOptions { CredentialsProvider = (url, usernameFromUrl, types) => new UsernamePasswordCredentials { Username = userName, Password = password } }; var refSpecs = remote.FetchRefSpecs.Select(x => x.Specification); Commands.Fetch(repo, remote.Name, refSpecs, fetop, string.Empty); var localBranchName = string.IsNullOrEmpty(branchName) ? "master" : branchName; // Get the branch you want to push var localBranch = repo.Branches[localBranchName]; if (localBranch == null) { return; } repo.Branches.Update(localBranch, b => b.Remote = remote.Name, b => b.UpstreamBranch = localBranch.CanonicalName); // Create a new push options object var pushOptions = new PushOptions { CredentialsProvider = (url, usernameFromUrl, types) => new UsernamePasswordCredentials { Username = userName, Password = password } }; // Push the branch to the remote repository repo.Network.Push(localBranch, pushOptions); } } catch (LibGit2SharpException) { throw; } }
در صورتی هم که قصد دارید دادههایی را از مخزن آنلاین به مخزن محلی بیاورید (به اصطلاح pull کنید) باید به سراغ کدهای زیر بروید.
private void Pull(string localRepoPath, string userName, string password) { try { var options = new PullOptions(); options.FetchOptions = new FetchOptions(); options.FetchOptions.CredentialsProvider = new CredentialsHandler( (url, usernameFromUrl, types) => new UsernamePasswordCredentials() { Username = userName, Password = password }); options.MergeOptions = new MergeOptions(); options.MergeOptions.FastForwardStrategy = FastForwardStrategy.Default; options.MergeOptions.OnCheckoutNotify = new CheckoutNotifyHandler(showconflict); options.MergeOptions.CheckoutNotifyFlags = CheckoutNotifyFlags.Conflict; using (var repo = new Repository(localRepoPath)) { Signature signature = repo.Config.BuildSignature(DateTimeOffset.Now); var result = Commands.Pull(repo, signature, options); if (result.Status == MergeStatus.Conflicts) { Console.WriteLine("Conflict detected"); return; } if (result.Status == MergeStatus.UpToDate) { Console.WriteLine("upto date"); return; } } Console.WriteLine("Pull successful"); } catch (LibGit2SharpException) { throw; } } private bool showconflict(string path, CheckoutNotifyFlags notifyFlags) { if (notifyFlags is CheckoutNotifyFlags.Conflict) { Console.WriteLine("Conflict found in file :" + path); } return true; }
مدیریت خطاها و استثناها
هنگام کدنویسی و کار کردن با گیت و گیت هاب امکان دارد با یک سری خطاها مواجه شوید. برای اینکه این خطاها روند اجرای برنامه را با مشکل مواجه نکند و بدانید کدام خط ایراد دارد، بهتر است است از کلاسهای مدیریت خطا استفاده کنید. LibGit2Sharp برای مدیریت این خطاها، کلاس LibGit2SharpException را در اختیار برنامه نویسان قرار داده تا خطاها را به طور کامل مدیریت کنند. (در کدهای بالا از این کلاس استفاده شده است.)
دقت داشته باشید علاوه بر گیت هاب پلتفرمهای دیگری هم برای مدیریت نسخه با گیت وجود دارد که یکی از آنها گیت لب است. در صورتی که به دنبال ویژگیها و ابزارهای پیشرفته هستید، توصیه میکنیم آموزش کار با گیت لب را در اولویت قرار دهید.
همچنین گیت هاب علاوه بر نسخه آنلاین، دارای نسخه دسکتاپ نیز هست. با آموزش Github desktop و نصب آن میتوانید کارها را با سرعت بیشتری انجام دهید.
پیشنهاد مطالعه: راهنمای جامع آموزش خطاگیری در سی شارپ
آموزش جامع سی شارپ با مکتب خونه
سی شارپ یکی از زبانهای برنامه نویسی قدرتمند در جهان است که قابلیتها و ویژگیهای زیادی دارد. اگر به دنبال یادگیری اصولی این زبان هستید حتما در دورههای آموزش سی شارپ مکتب خونه شرکت کنید. در این دورهها به صورت اصولی و قدم به قدم کدنویسی و قوانین آن را یاد میگیرید. دوره سی شارپ توسط اساتید حرفهای و باتجربه ضبط شده و همه مباحث را پوشش را میدهد. آموزش git و github با سی شارپ نیز در این دورهها وجود دارد و به صورت عملی آنها را یاد میگیرید.
منبع