-
1. شروع به کار (getting started)
-
2. مقدمات گیت (git basics chapter)
- 2.1 گرفتن یک مخزن گیت (Getting a Git Repository)
- 2.2 ثبت تغییرات در مخزن (Recording Changes to the Repository)
- 2.3 مشاهده تاریخچه کامیتها (Viewing the Commit History)
- 2.4 بازگرداندن تغییرات (Undoing Things)
- 2.5 کار کردن با ریموت ها (Working with Remotes)
- 2.6 تگ کردن (Tagging)
- 2.7 نام مستعار گیت (Git Aliases)
- 2.8 خلاصه (summary)
-
3. انشعابگیری در گیت (Git Branching)
-
4. گیت روی سرور (Git on the server)
- 4.1 پروتکلها (The Protocols)
- 4.2 راهاندازی گیت روی یک سرور (Getting Git on a Server)
- 4.3 ایجاد کلید عمومی SSH شما (Generating Your SSH Public Key)
- 4.4 نصب و راهاندازی سرور (Setting up server)
- 4.5 سرویسدهنده گیت (Git Daemon)
- 4.6 HTTP هوشمند (Smart HTTP)
- 4.7 گیتوب (GitWeb)
- 4.8 گیتلب (GitLab)
- 4.9 گزینههای میزبانی شخص ثالث (Third Party Hosted Options)
- 4.10 خلاصه (Summary)
-
5. گیت توزیعشده (Distributed git)
-
6. GitHub (گیت هاب)
-
7. ابزارهای گیت (Git Tools)
- 7.1 انتخاب بازبینی (Revision Selection)
- 7.2 مرحلهبندی تعاملی (Interactive Staging)
- 7.3 ذخیره موقت و پاکسازی (Stashing and Cleaning)
- 7.4 Signing Your Work (امضای کارهای شما)
- 7.5 جستجو (Searching)
- 7.6 بازنویسی تاریخچه (Rewriting History)
- 7.7 بازنشانی به زبان ساده (Reset Demystified)
- 7.8 ادغام پیشرفته (Advanced Merging)
- 7.9 بازاستفاده خودکار از حل تضادها (Rerere)
- 7.10 اشکالزدایی با گیت (Debugging with Git)
- 7.11 سابماژول ها (Submodules)
- 7.12 بستهبندی (Bundling)
- 7.13 جایگزینی (Replace)
- 7.14 ذخیرهسازی اطلاعات ورود (Credential Storage)
- 7.15 خلاصه (Summary)
-
8. سفارشیسازی Git (Customizing Git)
-
9. گیت و سیستمهای دیگر (Git and Other Systems)
-
10. (Git Internals)
- 10.1 ابزارها و دستورات سطح پایین (Plumbing and Porcelain)
- 10.2 اشیا گیت (Git Objects)
- 10.3 مراجع گیت (Git References)
- 10.4 فایلهای بسته (Packfiles)
- 10.5 نگاشت (The Refspec)
- 10.6 پروتکلهای انتقال (Transfer Protocols)
- 10.7 نگهداری و بازیابی دادهها (Maintenance and Data Recovery)
- 10.8 متغیرهای محیطی (Environment Variables)
- 10.9 (Summary)
-
A1. پیوست A: گیت در محیطهای دیگر (Git in Other Environments)
- A1.1 رابط های گرافیکی (Graphical Interfaces)
- A1.2 Git در ویژوال استودیو (Git in Visual Studio)
- A1.3 Git در Visual Studio Code (Git in Visual Studio Code)
- A1.4 Git در IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine (Git in IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine)
- A1.5 Git در Sublime Text (Git in Sublime Text)
- A1.6 گیت در بش (Git in Bash)
- A1.7 Git در Zsh (Git in Zsh)
- A1.8 Git در PowerShell (Git in PowerShell)
- A1.9 خلاصه (Summary)
-
A2. پیوست B: گنجاندن گیت در برنامههای شما (Embedding Git in your Applications)
-
A3. پیوست C: دستورات گیت (Git Commands)
- A3.1 تنظیم و پیکربندی (Setup and Config)
- A3.2 گرفتن و ایجاد پروژهها (Getting and Creating Projects)
- A3.3 نمونهبرداری پایهای (Basic Snapshotting)
- A3.4 انشعابگیری و ادغام (Branching and Merging)
- A3.5 بهاشتراکگذاری و بهروزرسانی پروژهها (Sharing and Updating Projects)
- A3.6 بازرسی و مقایسه (Inspection and Comparison)
- A3.7 عیبیابی (Debugging)
- A3.8 اعمال تغییرات به صورت پچ (Patching)
- A3.9 ایمیل (Email)
- A3.10 سیستمهای خارجی (External Systems)
- A3.11 مدیریت (Administration)
- A3.12 دستورات سطح پایین گیت (Plumbing Commands)
7.14 ابزارهای گیت (Git Tools) - ذخیرهسازی اطلاعات ورود (Credential Storage)
ذخیرهسازی اطلاعات ورود (Credential Storage)
اگر از پروتکل SSH برای اتصال به مخازن راه دور استفاده میکنید، ممکن است کلیدی بدون عبارت رمز داشته باشید که به شما اجازه میدهد بدون وارد کردن نام کاربری و رمز عبور، بهصورت امن دادهها را منتقل کنید. با این حال، این امکان در پروتکلهای HTTP وجود ندارد — هر اتصال نیازمند نام کاربری و رمز عبور است. این موضوع برای سیستمهایی که از احراز هویت دو مرحلهای استفاده میکنند، دشوارتر میشود؛ جایی که توکنی که بهعنوان رمز عبور استفاده میکنید بهصورت تصادفی تولید شده و غیرقابل تلفظ است.
خوشبختانه، گیت یک سیستم مدیریت اطلاعات ورود دارد که میتواند در این زمینه کمک کند. گیت چند گزینه پیشفرض ارائه میدهد:
-
حالت پیشفرض، عدم کش کردن است. در این حالت هر بار اتصال، از شما نام کاربری و رمز عبور درخواست میشود.
-
حالت “cache” اطلاعات ورود را بهصورت موقت در حافظه نگه میدارد. هیچ رمز عبوری روی دیسک ذخیره نمیشود و پس از ۱۵ دقیقه از حافظه پاک میشوند.
-
حالت “store” اطلاعات ورود را در فایلی بهصورت متن ساده روی دیسک ذخیره میکند و هیچگاه منقضی نمیشوند. این بدان معناست که تا زمانی که رمز عبور خود را در میزبان گیت تغییر ندهید، دیگر نیازی به وارد کردن دوباره اطلاعات ورود نخواهید داشت. نقطه ضعف این روش این است که رمزهای عبور بهصورت متن ساده در فایلی در پوشه خانگی شما ذخیره میشوند.
-
اگر از macOS استفاده میکنید، گیت دارای حالت “osxkeychain” است که اطلاعات ورود را در زنجیره کلید ایمن سیستم شما ذخیره میکند. این روش اطلاعات را روی دیسک ذخیره میکند و هیچگاه منقضی نمیشوند، اما با همان سیستمی رمزگذاری میشوند که گواهیهای HTTPS و پرکردن خودکار سافاری را نگه میدارد.
-
اگر از ویندوز استفاده میکنید، میتوانید هنگام نصب https://gitforwindows.org/ [گیت برای ویندوز] قابلیت Git Credential Manager را فعال کنید یا بهصورت جداگانه جدیدترین نسخه https://github.com/git-ecosystem/git-credential-manager/releases/latest [GCM] را بهعنوان سرویس مستقل نصب نمایید. این سیستم مشابه کمکیار “osxkeychain” است ولی از فروشگاه اعتبار ویندوز برای مدیریت اطلاعات حساس استفاده میکند. همچنین میتواند اطلاعات ورود را به WSL1 یا WSL2 ارائه دهد. برای اطلاعات بیشتر به https://github.com/git-ecosystem/git-credential-manager#readme [دستورالعمل نصب GCM] مراجعه کنید.
شما میتوانید یکی از این روشها را با تنظیم مقدار پیکربندی گیت انتخاب کنید:
$ git config --global credential.helper cache
برخی از این کمکیارها گزینههایی دارند.
کمکیار “store” میتواند آرگومان --file <مسیر>
را دریافت کند که محل ذخیرهسازی فایل متن ساده را تعیین میکند (بهصورت پیشفرض ~/.git-credentials
است).
کمکیار “cache” گزینه --timeout <ثانیه>
را میپذیرد که مدت زمان فعال بودن سرویس را تغییر میدهد (پیشفرض “900” ثانیه یا ۱۵ دقیقه است).
در اینجا نمونهای از چگونگی پیکربندی کمکیار “store” با نام فایل سفارشی آمده است:
$ git config --global credential.helper 'store --file ~/.my-credentials'
گیت حتی اجازه میدهد چندین کمکیار را پیکربندی کنید.
هنگام جستجوی اطلاعات ورود برای یک میزبان خاص، گیت به ترتیب از آنها میپرسد و بعد از دریافت اولین پاسخ متوقف میشود.
هنگام ذخیرهسازی اطلاعات، گیت نام کاربری و رمز عبور را به تمام کمکیارهای فهرست ارسال میکند و هر کدام میتوانند تصمیم بگیرند چه کاری انجام دهند.
در اینجا نمونهای از فایل .gitconfig
است که فایل اطلاعات ورود روی یک درایو فلش ذخیره شده اما میخواهید از کش حافظه برای کاهش تایپ در صورت عدم اتصال درایو استفاده کنید:
[credential]
helper = store --file /mnt/thumbdrive/.git-credentials
helper = cache --timeout 30000
پشت صحنه (Under the Hood)
این سیستم چگونه کار میکند؟
فرمان اصلی گیت برای سیستم کمکیار اطلاعات ورود، git credential
است که یک فرمان را بهعنوان آرگومان میگیرد و سپس ورودی بیشتری از طریق stdin دریافت میکند.
این موضوع با یک مثال آسانتر درک میشود.
فرض کنید کمکیار اطلاعات ورود پیکربندی شده و اطلاعات ورود برای mygithost
ذخیره شده است.
در اینجا جلسهای است که از فرمان “fill” استفاده میکند، فرمانی که هنگام تلاش گیت برای یافتن اطلاعات ورود برای یک میزبان فراخوانی میشود:
$ git credential fill (1)
protocol=https (2)
host=mygithost
(3)
protocol=https (4)
host=mygithost
username=bob
password=s3cre7
$ git credential fill (5)
protocol=https
host=unknownhost
Username for 'https://unknownhost': bob
Password for 'https://bob@unknownhost':
protocol=https
host=unknownhost
username=bob
password=s3cre7
-
این خط فرمان است که تعامل را آغاز میکند.
-
سپس git-credential منتظر ورودی روی stdin میماند. اطلاعاتی که میدانیم را میدهیم: پروتکل و نام میزبان.
-
یک خط خالی نشان میدهد که ورودی کامل است و سیستم اطلاعات ورود باید پاسخ دهد.
-
سپس git-credential کنترل را به دست میگیرد و اطلاعاتی که یافته را روی stdout مینویسد.
-
اگر اطلاعات ورود یافت نشود، گیت از کاربر نام کاربری و رمز عبور را میپرسد و آنها را به خروجی میفرستد (که در اینجا به همان کنسول متصل است).
سیستم اطلاعات ورود در واقع برنامهای جدا از خود گیت را اجرا میکند؛ اینکه کدام برنامه و چگونه بستگی به مقدار پیکربندی credential.helper
دارد.
این برنامهها اشکال مختلفی دارند:
Configuration Value | Behavior |
---|---|
|
Runs |
|
Runs |
|
Runs |
|
Code after |
پس کمکیارهای بالا در واقع برنامههای git-credential-cache
، git-credential-store
و غیره هستند و میتوانیم آنها را با آرگومانهای خط فرمان پیکربندی کنیم.
شکل کلی این است: “git-credential-foo [آرگومانها] <عمل>.”
پروتکل stdin/stdout همان git-credential
است اما مجموعهای کمی متفاوت از اعمال را به کار میبرند:
-
get
درخواست جفت نام کاربری/رمز عبور است. -
store
درخواست ذخیره یک مجموعه اطلاعات ورود در حافظه این کمکیار است. -
erase
پاک کردن اطلاعات ورود مربوط به مشخصات داده شده از حافظه این کمکیار است.
برای اعمال store
و erase
پاسخی لازم نیست (گیت آن را نادیده میگیرد).
اما برای get
گیت بسیار علاقهمند است به آنچه کمکیار میگوید.
اگر کمکیار اطلاعات مفیدی نداشته باشد، میتواند بدون خروجی خارج شود، اما اگر داشته باشد، باید اطلاعات ارائه شده را با دادههای ذخیره شده خودش تکمیل کند.
خروجی مانند یک سری دستورات انتساب تلقی میشود؛ هر چیزی که ارائه شود جایگزین آنچه گیت قبلاً میدانسته میشود.
در اینجا همان مثال بالا آمده است، اما به جای git-credential
مستقیم به git-credential-store
میرویم:
$ git credential-store --file ~/git.store store (1)
protocol=https
host=mygithost
username=bob
password=s3cre7
$ git credential-store --file ~/git.store get (2)
protocol=https
host=mygithost
username=bob (3)
password=s3cre7
-
اینجا به
git-credential-store
میگوییم که اطلاعات ورود را ذخیره کند: نام کاربری “bob” و رمز عبور “s3cre7” برای دسترسی بهhttps://mygithost
. -
حالا میخواهیم این اطلاعات را بازیابی کنیم. اجزای ارتباطی که میدانیم (
https://mygithost
) را میدهیم و سپس یک خط خالی. -
git-credential-store
با نام کاربری و رمز عبوری که ذخیره کرده بودیم پاسخ میدهد.
فایل ~/git.store
به این شکل است:
https://bob:s3cre7@mygithost
فقط یک سری خطوط است که هر کدام شامل یک آدرس URL همراه با اطلاعات ورود است.
کمکیارهای osxkeychain
و wincred
از فرمت بومی فروشگاههای پشتیبان خود استفاده میکنند، در حالی که cache
از فرمت حافظه داخلی خود استفاده میکند (که هیچ فرآیند دیگری نمیتواند بخواند).
کش اعتبارنامهٔ سفارشی (A Custom Credential Cache)
با توجه به اینکه git-credential-store
و دوستان برنامههایی جدا از گیت هستند، بهراحتی میتوان فهمید که هر برنامهای میتواند کمکیار اطلاعات ورود گیت باشد.
کمکیارهای ارائه شده توسط گیت بسیاری از موارد رایج را پوشش میدهند، اما همه را نه.
مثلاً فرض کنید تیم شما اطلاعات ورود مشترکی دارد که بین همه اعضا به اشتراک گذاشته شده، مثلاً برای استقرار.
این اطلاعات در پوشه مشترکی ذخیره شده اما نمیخواهید آنها را در فروشگاه اطلاعات ورود خود کپی کنید چون مرتباً تغییر میکنند.
هیچکدام از کمکیارهای موجود این حالت را پوشش نمیدهند؛ بیایید ببینیم برای نوشتن یکی از آنها چه باید کرد.
ویژگیهای کلیدی که این برنامه باید داشته باشد:
-
تنها عملی که باید به آن توجه کنیم
get
است؛store
وerase
عملیات نوشتن هستند، پس هنگام دریافت آنها بهسادگی بهخوبی خارج میشویم. -
فرمت فایل اطلاعات ورود مشترک همان فرمت استفاده شده توسط
git-credential-store
است. -
محل آن فایل نسبتاً استاندارد است، اما باید اجازه داد کاربر مسیر دلخواهش را نیز وارد کند.
دوباره این افزونه را با زبان روبی مینویسیم، اما هر زبان دیگری هم مناسب است مادامی که گیت بتواند آن را اجرا کند. در اینجا کد کامل منبع کمکیار جدید ما آمده است:
#!/usr/bin/env ruby
require 'optparse'
path = File.expand_path '~/.git-credentials' # (1)
OptionParser.new do |opts|
opts.banner = 'USAGE: git-credential-read-only [options] <action>'
opts.on('-f', '--file PATH', 'Specify path for backing store') do |argpath|
path = File.expand_path argpath
end
end.parse!
exit(0) unless ARGV[0].downcase == 'get' # (2)
exit(0) unless File.exist? path
known = {} # (3)
while line = STDIN.gets
break if line.strip == ''
k,v = line.strip.split '=', 2
known[k] = v
end
File.readlines(path).each do |fileline| # (4)
prot,user,pass,host = fileline.scan(/^(.*?):\/\/(.*?):(.*?)@(.*)$/).first
if prot == known['protocol'] and host == known['host'] and user == known['username'] then
puts "protocol=#{prot}"
puts "host=#{host}"
puts "username=#{user}"
puts "password=#{pass}"
exit(0)
end
end
-
اینجا گزینههای خط فرمان را تجزیه میکنیم و اجازه میدهیم کاربر مسیر فایل ورودی را مشخص کند. پیشفرض
~/.git-credentials
است. -
این برنامه تنها وقتی پاسخ میدهد که عمل
get
باشد و فایل ذخیرهسازی موجود باشد. -
این حلقه از stdin میخواند تا خط خالی اول برسد. ورودیها در هش
known
برای مراجعه بعدی ذخیره میشوند. -
این حلقه محتوای فایل ذخیرهسازی را میخواند و به دنبال تطابق میگردد. اگر پروتکل، میزبان و نام کاربری در
known
با این خط تطابق داشت، برنامه نتایج را به stdout چاپ میکند و خارج میشود.
کمکیار خود را به نام git-credential-read-only
ذخیره کنید، آن را در جایی از مسیر سیستم قرار دهید و اجرایی کنید.
در اینجا نمونه جلسه تعاملی آمده است:
$ git credential-read-only --file=/mnt/shared/creds get
protocol=https
host=mygithost
username=bob
protocol=https
host=mygithost
username=bob
password=s3cre7
از آنجا که نام آن با «git-» شروع میشود، میتوانیم از دستور ساده برای مقدار پیکربندی استفاده کنیم:
$ git config --global credential.helper 'read-only --file /mnt/shared/creds'
همانطور که میبینید، گسترش این سیستم بسیار ساده است و میتواند برخی مشکلات رایج شما و تیمتان را حل کند.