-
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.4 ابزارهای گیت (Git Tools) - Signing Your Work (امضای کارهای شما)
Signing Your Work (امضای کارهای شما)
گیت از نظر رمزنگاری امن است، اما کامل و بینقص نیست. اگر کار دیگران را از اینترنت دریافت میکنید و میخواهید مطمئن شوید که کامیتها واقعاً از منبعی معتبر هستند، گیت چند روش برای امضا و تأیید کارها با استفاده از GPG دارد.
معرفی GPG (GPG Introduction)
اول از همه، اگر میخواهید چیزی را امضا کنید، باید GPG را پیکربندی کرده و کلید شخصی خود را نصب کنید.
$ gpg --list-keys
/Users/schacon/.gnupg/pubring.gpg
---------------------------------
pub 2048R/0A46826A 2014-06-04
uid Scott Chacon (Git signing key) <schacon@gmail.com>
sub 2048R/874529A9 2014-06-04
اگر کلیدی ندارید، میتوانید با دستور gpg --gen-key
یک کلید جدید بسازید.
$ gpg --gen-key
وقتی کلید خصوصی برای امضا دارید، میتوانید گیت را تنظیم کنید تا از آن برای امضا استفاده کند؛ اینکار با تنظیم گزینه user.signingkey
در پیکربندی گیت انجام میشود.
$ git config --global user.signingkey 0A46826A!
حالا گیت به طور پیشفرض از کلید شما برای امضای تگها و کامیتها استفاده خواهد کرد، در صورت تمایل شما.
امضای تگها (Signing Tags)
اگر کلید خصوصی GPG خود را راهاندازی کردهاید، حالا میتوانید از آن برای امضای تگهای جدید استفاده کنید.
کافی است به جای -a
از گزینه -s
استفاده کنید:
$ git tag -s v1.5 -m 'my signed 1.5 tag'
You need a passphrase to unlock the secret key for
user: "Ben Straub <ben@straub.cc>"
2048-bit RSA key, ID 800430EB, created 2014-05-04
اگر دستور git show
را روی آن تگ اجرا کنید، امضای GPG شما به آن متصل شده را مشاهده خواهید کرد:
$ git show v1.5
tag v1.5
Tagger: Ben Straub <ben@straub.cc>
Date: Sat May 3 20:29:41 2014 -0700
my signed 1.5 tag
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1
iQEcBAABAgAGBQJTZbQlAAoJEF0+sviABDDrZbQH/09PfE51KPVPlanr6q1v4/Ut
LQxfojUWiLQdg2ESJItkcuweYg+kc3HCyFejeDIBw9dpXt00rY26p05qrpnG+85b
hM1/PswpPLuBSr+oCIDj5GMC2r2iEKsfv2fJbNW8iWAXVLoWZRF8B0MfqX/YTMbm
ecorc4iXzQu7tupRihslbNkfvfciMnSDeSvzCpWAHl7h8Wj6hhqePmLm9lAYqnKp
8S5B/1SSQuEAjRZgI4IexpZoeKGVDptPHxLLS38fozsyi0QyDyzEgJxcJQVMXxVi
RUysgqjcpT8+iQM1PblGfHR4XAhuOqN5Fx06PSaFZhqvWFezJ28/CLyX5q+oIVk=
=EFTF
-----END PGP SIGNATURE-----
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
Change version number
تأیید تگها (Verifying Tags)
برای تأیید یک تگ امضا شده، از دستور git tag -v <tag-name>
استفاده کنید.
این دستور از GPG برای تأیید امضا بهره میبرد.
برای اینکه این به درستی کار کند، باید کلید عمومی امضا کننده در کیرینگ شما موجود باشد:
$ git tag -v v1.4.2.1
object 883653babd8ee7ea23e6a5c392bb739348b1eb61
type commit
tag v1.4.2.1
tagger Junio C Hamano <junkio@cox.net> 1158138501 -0700
GIT 1.4.2.1
Minor fixes since 1.4.2, including git-mv and git-http with alternates.
gpg: Signature made Wed Sep 13 02:08:25 2006 PDT using DSA key ID F3119B9A
gpg: Good signature from "Junio C Hamano <junkio@cox.net>"
gpg: aka "[jpeg image of size 1513]"
Primary key fingerprint: 3565 2A26 2040 E066 C9A7 4A7D C0C6 D9A4 F311 9B9A
اگر کلید عمومی امضا کننده را نداشته باشید، با پیامی شبیه به این مواجه میشوید:
gpg: Signature made Wed Sep 13 02:08:25 2006 PDT using DSA key ID F3119B9A
gpg: Can't check signature: public key not found
error: could not verify the tag 'v1.4.2.1'
امضای کامیتها (Signing Commits)
در نسخههای جدیدتر گیت (نسخه ۱.۷.۹ به بالا)، شما میتوانید کامیتهای تکتک را هم امضا کنید.
اگر میخواهید به جای فقط امضای تگها، کامیتها را مستقیماً امضا کنید، کافی است گزینه -S
را به دستور git commit
اضافه کنید.
$ git commit -a -S -m 'Signed commit'
You need a passphrase to unlock the secret key for
user: "Scott Chacon (Git signing key) <schacon@gmail.com>"
2048-bit RSA key, ID 0A46826A, created 2014-06-04
[master 5c3386c] Signed commit
4 files changed, 4 insertions(+), 24 deletions(-)
rewrite Rakefile (100%)
create mode 100644 lib/git.rb
برای دیدن و تأیید این امضاها، گزینه --show-signature
نیز برای دستور git log
وجود دارد.
$ git log --show-signature -1
commit 5c3386cf54bba0a33a32da706aa52bc0155503c2
gpg: Signature made Wed Jun 4 19:49:17 2014 PDT using RSA key ID 0A46826A
gpg: Good signature from "Scott Chacon (Git signing key) <schacon@gmail.com>"
Author: Scott Chacon <schacon@gmail.com>
Date: Wed Jun 4 19:49:17 2014 -0700
Signed commit
علاوه بر این، میتوانید git log
را طوری تنظیم کنید که هر امضایی را که پیدا میکند بررسی کند و با فرمت %G?
آنها را در خروجی نمایش دهد.
$ git log --pretty="format:%h %G? %aN %s"
5c3386c G Scott Chacon Signed commit
ca82a6d N Scott Chacon Change the version number
085bb3b N Scott Chacon Remove unnecessary test code
a11bef0 N Scott Chacon Initial commit
در اینجا میبینیم که فقط آخرین کامیت امضا و معتبر است و کامیتهای قبلی امضا نشدهاند.
در گیت نسخه ۱.۸.۳ به بعد، دستورات git merge
و git pull
میتوانند با استفاده از گزینه --verify-signatures
هنگام ادغام، امضاهای معتبر GPG را بررسی کرده و اگر کامیتی امضای معتبر نداشت، ادغام را رد کنند.
اگر هنگام ادغام یک شاخه این گزینه را فعال کنید و کامیتهای فاقد امضای صحیح وجود داشته باشند، عملیات ادغام انجام نخواهد شد.
$ git merge --verify-signatures non-verify
fatal: Commit ab06180 does not have a GPG signature.
اگر ادغام فقط شامل کامیتهای امضاشده و معتبر باشد، دستور ادغام همه امضاهای بررسی شده را نمایش داده و سپس ادامه میدهد.
$ git merge --verify-signatures signed-branch
Commit 13ad65e has a good GPG signature by Scott Chacon (Git signing key) <schacon@gmail.com>
Updating 5c3386c..13ad65e
Fast-forward
README | 2 ++
1 file changed, 2 insertions(+)
همچنین میتوانید از گزینه -S
در دستور git merge
برای امضای خود کامیت ادغام استفاده کنید.
مثال زیر هم تأیید میکند که همه کامیتهای شاخه مورد ادغام امضا شدهاند و هم خود کامیت ادغام را امضا میکند.
$ git merge --verify-signatures -S signed-branch
Commit 13ad65e has a good GPG signature by Scott Chacon (Git signing key) <schacon@gmail.com>
You need a passphrase to unlock the secret key for
user: "Scott Chacon (Git signing key) <schacon@gmail.com>"
2048-bit RSA key, ID 0A46826A, created 2014-06-04
Merge made by the 'recursive' strategy.
README | 2 ++
1 file changed, 2 insertions(+)
همه باید امضا کنند (Everyone Must Sign)
امضای تگها و کامیتها بسیار خوب است، اما اگر تصمیم بگیرید این روش را در جریان کاری معمول خود بهکار ببرید، باید مطمئن شوید که همه اعضای تیم شما نحوه انجام این کار را بلد باشند.
برای این کار میتوانید از همه افراد بخواهید دستور git config --local commit.gpgsign true
را اجرا کنند تا همه کامیتهایشان در مخزن به طور خودکار امضا شود.
اگر این کار را نکنید، وقت زیادی را صرف کمک به افراد برای بازنویسی کامیتها با نسخههای امضا شده خواهید کرد.
قبل از اینکه این روش را به بخشی از روند کاری استاندارد خود تبدیل کنید، مطمئن شوید GPG و مزایای امضا کردن را به خوبی میشناسید.