-
1. شروع به کار
- 1.1 دربارهٔ کنترل نسخه
- 1.2 تاریخچهٔ کوتاهی از گیت
- 1.3 گیت چیست؟
- 1.4 خط فرمان
- 1.5 نصب گیت
- 1.6 اولین راهاندازی گیت
- 1.7 کمک گرفتن
- 1.8 خلاصه
-
2. مقدمات گیت
- 2.1 دستیابی به یک مخزن گیت
- 2.2 ثبت تغییرات در مخزن
- 2.3 دیدن تاریخچهٔ کامیتها
- 2.4 بازگردانی کارها
- 2.5 کار با ریموتها
- 2.6 برچسبگذاری
- 2.7 نامهای مستعار در گیت
- 2.8 خلاصه
-
3. شاخهسازی در گیت
- 3.1 شاخهها در یک کلمه
- 3.2 شاخهسازی و ادغام مقدماتی
- 3.3 مدیریت شاخه
- 3.4 روند کاری شاخهسازی
- 3.5 شاخههای ریموت
- 3.6 ریبیسکردن
- 3.7 خلاصه
-
4. گیت روی سرور
- 4.1 پروتکلها
- 4.2 راهاندازی گیت در سرور
- 4.3 ساختن کلید عمومی SSH
- 4.4 نصب و راهاندازی سرور
- 4.5 دیمن گیت
- 4.6 HTTP هوشمند
- 4.7 گیتوب
- 4.8 گیتلب
- 4.9 گزینههای شخصی ثالث میزبانی شده
- 4.10 خلاصه
-
5. گیت توزیعشده
- 5.1 روندهای کاری توزیعشده
- 5.2 مشارکت در یک پروژه
- 5.3 نگهداری یک پروژه
- 5.4 خلاصه
-
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.1 Customizing Git (سفارشیسازی Git) - Git Configuration (پیکربندی گیت)
تا اینجا، اصول اولیه نحوه کار Git و نحوه استفاده از آن را پوشش دادهایم و تعدادی ابزار که Git برای استفاده آسان و کارآمد ارائه میدهد را معرفی کردهایم. در این فصل، خواهیم دید که چگونه میتوانید Git را به صورت سفارشیتر تنظیم کنید، با معرفی چند تنظیمات پیکربندی مهم و سیستم hookها. با این ابزارها، آسان است که Git را طوری تنظیم کنید که دقیقاً مطابق با نیاز شما، شرکت یا گروه شما عمل کند.
Git Configuration (پیکربندی گیت)
همانطور که به طور مختصر در شروع به کار
خواندید، میتوانید تنظیمات پیکربندی گیت را با دستور git config
مشخص کنیدپیدا کنید.
یکی از اولین کارهایی که انجام دادید، تنظیم نام و آدرس ایمیل شما بود:
$ git config --global user.name "Your Username"
$ git config --global user.email email@example.com
اکنون چند گزینه جالبتر را یاد خواهید گرفت که میتوانید به این روش برای سفارشیسازی استفاده از گیت تنظیم کنید.
اول، یک مرور سریع: گیت از مجموعهای از فایلهای پیکربندی برای تعیین رفتار غیر پیشفرضی که ممکن است بخواهید
استفاده میکند.
اولین جایی که گیت به دنبال این مقادیر میگردد، فایل پیکربندی سیستمگسترده /etc/gitconfig
است که شامل
تنظیماتی است که به هر کاربر در سیستم و تمام مخازن آنها اعمال میشود.
اگر گزینه --system
را به git config
بدهید، به طور خاص از این فایل خوانده و نوشته میشود.
جای بعدی که گیت به دنبال آن میگردد، فایل ~/.gitconfig
(یا ~/.config/git/config
) است که
مختص هر کاربر است.
میتوانید با دادن گزینه --global
به گیت بگویید که از این فایل بخواند و بنویسد.
در نهایت، گیت به دنبال مقادیر پیکربندی در فایل پیکربندی در دایرکتوری گیت (.git/config
) از هر مخزنی
که در حال حاضر استفاده میکنید، میگردد.
این مقادیر مختص آن مخزن خاص هستند و نمایانگر دادن گزینه --local
به git config
هستند.
(اگر مشخص نکنید که میخواهید با کدام سطح کار کنید، این پیشفرض است.)
هر یک از این "سطوح" (سیستم، جهانی، محلی) مقادیر سطح قبلی را بازنویسی میکند، بنابراین مقادیر در
.git/config
بر مقادیر در /etc/gitconfig
ارجحیت دارند، به عنوان مثال.
یادداشت
|
فایلهای پیکربندی گیت متنساده هستند، بنابراین میتوانید این مقادیر را با ویرایش دستی فایل و وارد کردن
نحو صحیح نیز تنظیم کنید.
با این حال، معمولاً راحتتر است که دستور |
Basic Client Configuration (پیکربندی پایه کلاینت)
گزینههای پیکربندی که توسط Git شناسایی میشوند، به دو دسته تقسیم میشوند: سمت کلاینت و سمت سرور. اکثر گزینهها سمت کلاینت هستند — یعنی پیکربندی ترجیحات کاری شخصی شما. بسیاری، بسیاری از گزینههای پیکربندی پشتیبانی میشوند، اما بخش زیادی از آنها تنها در برخی موارد خاص مفید هستند؛ در اینجا فقط به متداولترین و مفیدترین گزینهها خواهیم پرداخت. اگر میخواهید فهرستی از تمام گزینههایی که نسخه Git شما شناسایی میکند ببینید، میتوانید دستور زیر را اجرا کنید:
$ man git-config
این دستور تمام گزینههای موجود را با جزئیات کافی لیست میکند. شما همچنین میتوانید این مواد مرجعی را در آدرس https://git-scm.com/docs/git-config پیدا کنید.
core.editor
به طور پیشفرض، گیت از هر چیزی که به عنوان ویرایشگر متن پیشفرض خود از طریق یکی از متغیرهای محیطی شل VISUAL
یا EDITOR
تنظیم کردهاید، استفاده میکند، و در غیر این صورت به ویرایشگر vi
برای
ایجاد و ویرایش پیامهای کامیت و برچسبها بازمیگردد.
برای تغییر این پیشفرض به چیز دیگری، میتوانید از تنظیم core.editor
استفاده کنید:
$ git config --global core.editor emacs
اکنون، مهم نیست که چه چیزی به عنوان ویرایشگر شل پیشفرض شما تنظیم شده باشد، گیت برای ویرایش پیامها، Emacs را باز میکند.
commit.template
اگر این را به مسیر یک فایل در سیستم خود تنظیم کنید، گیت از آن فایل به عنوان پیام اولیه پیشفرض هنگام کامیت استفاده خواهد کرد. ارزش ایجاد یک الگوی کامیت سفارشی این است که میتوانید از آن برای یادآوری خود (یا دیگران) در مورد فرمت و سبک مناسب هنگام ایجاد یک پیام کامیت استفاده کنید.
به عنوان مثال، یک فایل الگو در ~/.gitmessage.txt
که به این شکل باشد:
خط توضیحات (سعی کنید زیر 50 کاراکتر نگه دارید)
توضیحات چند خطی از کامیت،
احساس راحتی کنید که جزئیات بیشتری اضافه کنید.
[Ticket: X]
به یاد داشته باشید که این الگوی کامیت به کامیتکننده یادآوری میکند که خط موضوع را کوتاه نگه دارد (برای خروجی
git log --oneline
)، جزئیات بیشتری زیر آن اضافه کند و اگر تیکتی وجود دارد، به شماره تیکت یا ردیاب
اشکال اشاره کند.
برای اینکه به گیت بگویید از آن به عنوان پیام پیشفرضی که هنگام اجرای git commit
در ویرایشگر شما
ظاهر میشود استفاده کند، مقدار پیکربندی commit.template
را تنظیم کنید:
$ git config --global commit.template ~/.gitmessage.txt
$ git commit
سپس، ویرایشگر شما برای پیام کامیت جایگزین شما به چیزی شبیه به این باز خواهد شد:
خط موضوع (سعی کنید زیر 50 کاراکتر نگه دارید)
توضیح چندخطی دربارهی commit،
برای توضیح جزئیات بیشتر آزاد هستید.
[Ticket: X]
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: lib/test.rb
#
~
~
".git/COMMIT_EDITMSG" 14L, 297C
اگر تیم شما یک سیاست خاص برای پیامهای commit دارد، قرار دادن یک الگو برای آن سیاست در سیستم شما و پیکربندی Git برای استفاده از آن بهطور پیشفرض میتواند شانس پیروی منظم از آن سیاست را افزایش دهد.
===== core.pager
این تنظیم تعیین میکند که کدام پیجر (pager) زمانی که Git خروجیهایی مانند log و diff را صفحهبندی میکند، استفاده شود. شما میتوانید آن را به more یا پیجر مورد علاقهتان تنظیم کنید (بهطور پیشفرض، less است)، یا میتوانید آن را با تنظیم کردن به یک رشته خالی غیرفعال کنید:
$ git config --global core.pager ''
اگر این کار را انجام دهید، گیت تمام خروجی تمام دستورات را صفحهبندی میکند، مهم نیست که چقدر طولانی هستند.
user.signingkey
اگر شما در حال ایجاد تگهای verified و حاشیهنویسی شده (طبق توضیحات در Signing Your Work)، تنظیم کردن کلید امضای GPG بهعنوان یک تنظیم پیکربندی کارها را آسانتر میکند. شما میتوانید شناسه کلید خود را به این صورت تنظیم کنید:
$ git config --global user.signingkey <gpg-key-id>
حالا میتوانید تگها را بدون نیاز به مشخص کردن کلید خود هر بار با دستور git tag
امضا کنید:
$ git tag -s <tag-name>
core.excludesfile
شما میتوانید الگوهایی را در فایل .gitignore
پروژهتان قرار دهید تا Git
آنها را بهعنوان فایلهای غیرپیگیریشده نبیند یا هنگام اجرای دستور git add
سعی نکند آنها را stage کند، همانطور که در نادیده گرفتن فایلها توضیح داده شده است.
اما گاهی اوقات ممکن است بخواهید فایلهای خاصی را برای تمام ریپازیتوریهایی که با آنها کار میکنید نادیده بگیرید. اگر سیستمعامل شما macOS است، احتمالاً با فایلهای .DS_Store آشنا هستید. اگر ویرایشگر مورد علاقه شما Emacs یا Vim باشد، از فایلهایی که با ~ یا .swp تمام میشوند، خبر دارید.
این تنظیم به شما این امکان را میدهد که یک فایل .gitignore سراسری بنویسید.
اگر یک فایل ~/.gitignore_global
با این محتوا ایجاد کنید:
*~
.*.swp
.DS_Store
-
و اگر دستور git config --global core.excludesfile ~/.gitignore_global را اجرا کنید، Git دیگر هیچگاه شما را بابت آن فایلها اذیت نخواهد کرد.
help.autocorrect
اگر یک دستور را اشتباه تایپ کنید، چیزی شبیه به این به شما نشان میدهد:
$ git chekcout master
git: 'chekcout' is not a git command. See 'git --help'.
آیا منظور شما این بود؟
checkout
Git با کمال میل سعی میکند بفهمد که شما چه میخواستید بگویید، اما هنوز این کار را انجام نمیدهد.
اگر گزینه help.autocorrect
را به 1 تنظیم کنید، Git در واقع این دستور را بهطور خودکار برای شما اجرا خواهد کرد:
$ git chekcout master
WARNING: You called a Git command named 'chekcout', which does not exist.
Continuing under the assumption that you meant 'checkout'
in 0.1 seconds automatically...
به یاد داشته باشید که این "0.1 ثانیه" است.
help.autocorrect
در واقع یک عدد صحیح است که نمایانگر دهمهای ثانیه است.
بنابراین اگر آن را به 50 تنظیم کنید، گیت به شما 5 ثانیه زمان میدهد تا قبل از اجرای دستور اصلاح شده، نظر خود
را تغییر دهید.
Colors in Git (رنگها در گیت)
Git بهطور کامل از خروجی رنگی در ترمینال پشتیبانی میکند، که بهطور قابل توجهی در تجزیه و تحلیل سریع و آسان خروجی دستورات کمک میکند. چندین گزینه وجود دارد که میتوانند به شما کمک کنند رنگبندی را طبق سلیقهتان تنظیم کنید
color.ui
گیت به طور خودکار بیشتر خروجیهای خود را رنگآمیزی میکند، اما یک سوئیچ اصلی وجود دارد اگر این رفتار را نپسندید. برای خاموش کردن تمام خروجی رنگی ترمینال گیت، این کار را انجام دهید:
$ git config --global color.ui false
تنظیم پیشفرض auto
است، که خروجی را زمانی که مستقیماً به ترمینال میرود رنگی میکند، اما کدهای کنترل رنگ را زمانی که خروجی به یک پایپ یا فایل هدایت میشود حذف میکند.
شما همچنین میتوانید آن را به always
تنظیم کنید تا تفاوت بین ترمینالها و پایپها نادیده گرفته شود.
این گزینه به ندرت مورد نیاز است؛ در بیشتر سناریوها، اگر بخواهید کدهای رنگی را در خروجی هدایتشدهتان داشته باشید، میتوانید بهجای آن یک پرچم --color
به دستور Git اضافه کنید تا مجبور شود از کدهای رنگی استفاده کند.
تنظیم پیشفرض تقریباً همیشه همان چیزی است که شما نیاز دارید.
color.*
اگر میخواهید دقیقتر مشخص کنید که کدام دستورات رنگی شوند و چگونه، Git تنظیمات رنگبندی خاص برای هر دستور فراهم کرده است.
هر یک از اینها میتواند به یکی از مقادیر true،
false
یا always
تنظیم شود:
color.branch color.diff color.interactive color.status
علاوه بر این، هر یک از این تنظیمات دارای زیرتنظیماتی هستند که میتوانید از آنها برای تنظیم رنگهای خاص برای بخشهای مختلف خروجی استفاده کنید، اگر بخواهید هر رنگ را بهطور جداگانه تنظیم کنید.
برای مثال، برای تنظیم اطلاعات متا در خروجی diff
به رنگ پیشزمینه آبی، پسزمینه سیاه و متن برجسته، میتوانید دستور زیر را اجرا کنید:
$ git config --global color.diff.meta "blue black bold"
شما میتوانید رنگ را به هر یک از مقادیر زیر تنظیم کنید: normal
، black
،
red
، green
، yellow
، blue
، magenta
،
cyan
، یا white
.
اگر میخواهید ویژگیای مانند بولد در مثال قبلی داشته باشید، میتوانید از bold
، dim
،
ul
(زیرخط)، blink
و reverse
(معکوس کردن پیشزمینه و پسزمینه) انتخاب
کنید.
External Merge and Diff Tools (ابزارهای خارجی برای ادغام و مقایسه)
اگرچه Git یک پیادهسازی داخلی از diff دارد، که همان چیزی است که در این کتاب نشان دادهایم، شما میتوانید به جای آن از یک ابزار خارجی استفاده کنید. همچنین میتوانید یک ابزار گرافیکی برای حل تضادهای ادغام (merge conflicts) تنظیم کنید، به جای اینکه مجبور باشید تضادها را بهصورت دستی حل کنید. در اینجا، نحوه تنظیم ابزار Perforce Visual Merge Tool (P4Merge) برای انجام diffها و حل تضادهای ادغام را نشان خواهیم داد، زیرا این یک ابزار گرافیکی خوب و رایگان است.
اگر میخواهید این را امتحان کنید، P4Merge بر روی تمامی پلتفرمهای اصلی کار میکند، بنابراین باید قادر به استفاده از آن باشید.
ما از مسیرهای فایل در مثالها استفاده خواهیم کرد که بر روی سیستمهای macOS و Linux کار میکنند؛ برای ویندوز، شما باید /usr/local/bin
را به مسیری اجرایی در محیط خود تغییر دهید.
برای شروع، P4Merge
را از Perforce دانلود کنید.
سپس، شما اسکریپتهای wrapper خارجی را برای اجرای دستورات خود تنظیم خواهید کرد.
ما از مسیر macOS برای اجرایی استفاده خواهیم کرد؛ در سیستمهای دیگر، این جایی خواهد بود که باینری
p4merge
شما نصب شده است.
یک اسکریپت wrapper ادغام به نام extMerge
تنظیم کنید که باینری شما را با تمام آرگومانهای ارائه شده
فراخوانی کند:
$ cat /usr/local/bin/extMerge
#!/bin/sh
/Applications/p4merge.app/Contents/MacOS/p4merge $*
wrapper diff بررسی میکند که آیا هفت آرگومان ارائه شده است و دو تا از آنها را به اسکریپت ادغام شما منتقل میکند. به طور پیشفرض، گیت آرگومانهای زیر را به برنامه diff منتقل میکند:
path old-file old-hex old-mode new-file new-hex new-mode
زیرا شما فقط میخواهید آرگومانهای old-file
و new-file
را داشته باشید، از اسکریپت
wrapper برای انتقال آنهایی که نیاز دارید استفاده میکنید.
$ cat /usr/local/bin/extDiff
#!/bin/sh
[ $# -eq 7 ] && /usr/local/bin/extMerge "$2" "$5"
شما همچنین باید مطمئن شوید که این ابزارها قابل اجرا هستند:
$ sudo chmod +x /usr/local/bin/extMerge
$ sudo chmod +x /usr/local/bin/extDiff
اکنون میتوانید فایل پیکربندی خود را برای استفاده از ابزارهای سفارشی ادغام و تفاوت خود تنظیم کنید.
این نیاز به تعدادی تنظیمات سفارشی دارد: merge.tool
برای گفتن به گیت که از چه استراتژی استفاده کند،
mergetool.<tool>.cmd
برای مشخص کردن نحوه اجرای دستور، mergetool.<tool>.trustExitCode
برای گفتن به گیت که آیا کد خروج آن برنامه نشاندهنده یک ادغام موفق است یا خیر، و diff.external
برای
گفتن به گیت که چه دستوری را برای تفاوتها اجرا کند.
بنابراین، میتوانید چهار دستور پیکربندی را اجرا کنید
$ git config --global merge.tool extMerge
$ git config --global mergetool.extMerge.cmd \
'extMerge "$BASE" "$LOCAL" "$REMOTE" "$MERGED"'
$ git config --global mergetool.extMerge.trustExitCode false
$ git config --global diff.external extDiff
یا میتوانید فایل ~/.gitconfig
خود را ویرایش کنید تا این خطوط را اضافه کنید:
[merge]
tool = extMerge
[mergetool "extMerge"]
cmd = extMerge "$BASE" "$LOCAL" "$REMOTE" "$MERGED"
trustExitCode = false
[diff]
external = extDiff
پس از تنظیم همه اینها، اگر دستورات diff مانند این را اجرا کنید:
$ git diff 32d1776b1^ 32d1776b1
به جای دریافت خروجی diff در خط فرمان، گیت P4Merge را راهاندازی میکند که چیزی شبیه به این خواهد بود:

اگر سعی کنید دو شاخه را ادغام کنید و سپس تعارضات ادغام داشته باشید، میتوانید دستور git mergetool
را اجرا کنید؛ این ابزار P4Merge را برای حل تعارضات از طریق آن ابزار GUI راهاندازی میکند.
نکته خوب در مورد این تنظیمات wrapper این است که میتوانید ابزارهای تفاوت و ادغام خود را به راحتی تغییر دهید.
به عنوان مثال، برای تغییر ابزارهای extDiff
و extMerge
به KDiff3، تنها کاری که باید
انجام دهید ویرایش فایل extMerge
است:
$ cat /usr/local/bin/extMerge
#!/bin/sh
/Applications/kdiff3.app/Contents/MacOS/kdiff3 $*
اکنون، گیت از ابزار KDiff3 برای مشاهده تفاوتها و حل تعارضات ادغام استفاده خواهد کرد.
گیت به طور پیشفرض برای استفاده از تعدادی از ابزارهای دیگر حل تعارضات ادغام بدون نیاز به تنظیم پیکربندی cmd آماده است. برای دیدن فهرستی از ابزارهایی که پشتیبانی میکند، این کار را امتحان کنید:
$ git mergetool --tool-help
'git mergetool --tool=<tool>' ممکن است به یکی از موارد زیر تنظیم شود:
emerge
gvimdiff
gvimdiff2
opendiff
p4merge
vimdiff
vimdiff2
ابزارهای زیر معتبر هستند، اما در حال حاضر در دسترس نیستند:
araxis
bc3
codecompare
deltawalker
diffmerge
diffuse
ecmerge
kdiff3
meld
tkdiff
tortoisemerge
xxdiff
برخی از ابزارهای ذکر شده در بالا فقط در یک محیط دارای پنجره کار میکنند. اگر در یک جلسه فقط ترمینال اجرا شوند، شکست خواهند خورد.
اگر به استفاده از KDiff3 برای تفاوتها علاقهمند نیستید، بلکه فقط میخواهید از آن برای حل ادغام استفاده کنید و دستور kdiff3 در مسیر شما قرار دارد، میتوانید این دستور را اجرا کنید:
$ git config --global merge.tool kdiff3
اگر این کار را به جای تنظیم فایلهای extMerge
و extDiff
انجام دهید، گیت از KDiff3
برای حل ادغام و از ابزار diff عادی گیت برای تفاوتها استفاده خواهد کرد.
فرمتبندی و فاصلهگذاری
مسائل فرمتبندی و فاصلهگذاری برخی از مشکلات آزاردهنده و ظریف هستند که بسیاری از توسعهدهندگان هنگام همکاری با آنها مواجه میشوند، به ویژه در کارهای چندپلتفرمی. بسیار آسان است که وصلهها یا سایر کارهای مشترک تغییرات ظریف فاصلهگذاری را معرفی کنند زیرا ویرایشگرها به طور خاموش آنها را وارد میکنند، و اگر فایلهای شما هرگز با یک سیستم ویندوزی تماس پیدا کنند، ممکن است انتهای خط آنها جایگزین شود. گیت چند گزینه پیکربندی برای کمک به این مسائل دارد.
core.autocrlf
اگر شما بر روی ویندوز برنامهنویسی میکنید و با افرادی کار میکنید که از سیستمعاملهای دیگری استفاده میکنند (یا برعکس)، احتمالاً در یک نقطه با مسائل مربوط به انتهای خط (line-ending) مواجه خواهید شد. این به این دلیل است که ویندوز هم از کاراکتر بازگشتبهکار (carriage-return) و هم از کاراکتر خطخوان (linefeed) برای انتهای خط در فایلهای خود استفاده میکند، در حالی که سیستمهای macOS و Linux تنها از کاراکتر خطخوان استفاده میکنند. این یک واقعیت ظریف ولی بسیار آزاردهنده در کارهای چندپلتفرمی است؛ بسیاری از ویرایشگرهای ویندوز بهطور بیصدا انتهای خطهای LF موجود را با CRLF جایگزین میکنند، یا هنگام فشار دادن کلید Enter هر دو کاراکتر انتهای خط را وارد میکنند.
Git میتواند این مشکل را با تبدیل خودکار انتهای خطهای CRLF به LF هنگام افزودن یک فایل به ایندکس و بالعکس هنگام چکاوت کد به سیستمفایل شما حل کند. شما میتوانید این قابلیت را با تنظیم core.autocrlf فعال کنید. اگر روی یک ماشین ویندوزی کار میکنید، آن را به true تنظیم کنید — این تنظیم انتهای خطهای LF را به CRLF تبدیل میکند زمانی که کد را چکاوت میکنید:
$ git config --global core.autocrlf true
اگر شما بر روی یک سیستم Linux یا macOS کار میکنید که از انتهای خط LF استفاده میکند، پس نمیخواهید Git بهطور خودکار آنها را هنگام چکاوت فایلها تبدیل کند؛ اما اگر یک فایل با انتهای خط CRLF بهطور تصادفی وارد پروژه شود، ممکن است بخواهید Git آن را اصلاح کند.
شما میتوانید به Git بگویید که هنگام commit، CRLF را به LF تبدیل کند ولی برعکس آن را انجام ندهد، با تنظیم core.autocrlf
به input:
$ git config --global core.autocrlf input
این تنظیم باید به شما اجازه دهد که انتهای CRLF را در چکاوتهای ویندوز داشته باشید، اما انتهای LF را در سیستمهای macOS و Linux و در مخزن داشته باشید.
اگر شما یک برنامهنویس ویندوز هستید که پروژهای فقط برای ویندوز انجام میدهید، میتوانید این قابلیت را خاموش
کنید و بازگشتهای کاراکتر را در مخزن با تنظیم مقدار پیکربندی به false
ثبت کنید:
$ git config --global core.autocrlf false
core.whitespace
گیت به طور پیشفرض برای شناسایی و اصلاح برخی از مسائل فاصلهگذاری تنظیم شده است. میتواند به دنبال شش مشکل اصلی فاصلهگذاری باشد — سه مورد به طور پیشفرض فعال هستند و میتوانند خاموش شوند، و سه مورد به طور پیشفرض غیرفعال هستند اما میتوانند فعال شوند.
سه موردی که به طور پیشفرض فعال هستند blank-at-eol
است، که به دنبال فضاها در انتهای یک خط
میگردد؛ blank-at-eof
، که خطوط خالی در انتهای یک فایل را شناسایی میکند؛ و
space-before-tab
، که به دنبال فضاها قبل از تبها در ابتدای یک خط میگردد.
سه موردی که به طور پیشفرض غیرفعال هستند اما میتوانند فعال شوند indent-with-non-tab
است، که به
دنبال خطوطی میگردد که با فضاها به جای تبها شروع میشوند (و توسط گزینه tabwidth
کنترل میشود)؛
tab-in-indent
، که به دنبال تبها در بخش فاصلهگذاری یک خط میگردد؛ و cr-at-eol
، که
به گیت میگوید که بازگشتهای کاراکتر در انتهای خطوط اشکالی ندارد.
میتوانید به گیت بگویید که کدام یک از اینها را میخواهید با تنظیم core.whitespace
به مقادیر
مورد نظر خود روشن یا خاموش کنید، که با کاما جدا شدهاند.
میتوانید یک گزینه را با پیشوند -
در جلوی نام آن غیرفعال کنید، یا با حذف آن از رشته تنظیم به ارزش
پیشفرض برگردید.
به عنوان مثال، اگر میخواهید همه به جز space-before-tab
تنظیم شوند، میتوانید این کار را انجام
دهید (با trailing-space
که به عنوان یک کوتاهنویس برای پوشش هر دو blank-at-eol
و
blank-at-eof
است):
$ git config --global core.whitespace \
trailing-space,-space-before-tab,indent-with-non-tab,tab-in-indent,cr-at-eol
یا میتوانید فقط قسمت سفارشیسازی را مشخص کنید:
$ git config --global core.whitespace \
-space-before-tab,indent-with-non-tab,tab-in-indent,cr-at-eol
گیت این مسائل را زمانی که دستور git diff
را اجرا میکنید شناسایی میکند و سعی میکند آنها را
رنگآمیزی کند تا بتوانید قبل از کامیت آنها را اصلاح کنید.
همچنین از این مقادیر برای کمک به شما هنگام اعمال وصلهها با git apply
استفاده خواهد کرد.
هنگامی که وصلهها را اعمال میکنید، میتوانید از گیت بخواهید که اگر وصلههایی با مسائل فاصلهگذاری مشخص شده را
اعمال میکند، به شما هشدار دهد:
$ git apply --whitespace=warn <patch>
یا میتوانید از گیت بخواهید که قبل از اعمال وصله، سعی کند مشکل را به طور خودکار اصلاح کند:
$ git apply --whitespace=fix <patch>
این گزینهها همچنین به دستور git rebase
اعمال میشوند.
اگر شما مسائل فاصلهگذاری را کامیت کردهاید اما هنوز به بالا فشار ندادهاید، میتوانید دستور git rebase
--whitespace=fix
را اجرا کنید تا گیت به طور خودکار مسائل فاصلهگذاری را در حین بازنویسی وصلهها اصلاح
کند.
Server Configuration (پیکربندی سرور)
تنظیمات پیکربندی کمتری برای سمت سرور Git موجود است، اما چند گزینه جالب وجود دارد که ممکن است بخواهید به آنها توجه کنید.
receive.fsckObjects
Git قادر است اطمینان حاصل کند که هر شیء دریافتی در طول یک push همچنان با چکسام SHA-1 خود مطابقت دارد و به اشیاء معتبر اشاره میکند.
با این حال، این کار بهطور پیشفرض انجام نمیشود؛ زیرا یک عملیات نسبتاً پرهزینه است و ممکن است باعث کند شدن عملکرد، بهویژه در ریپازیتوریهای بزرگ یا pushهای حجیم شود.
اگر میخواهید Git هر بار که push انجام میدهید، سازگاری اشیاء را بررسی کند، میتوانید با تنظیم receive.fsckObjects
به true آن را مجبور به انجام این کار کنید:
$ git config --system receive.fsckObjects true
اکنون، گیت قبل از پذیرش هر فشار، یکپارچگی مخزن شما را بررسی میکند تا مطمئن شود که مشتریان معیوب (یا مخرب) دادههای خراب را معرفی نمیکنند.
receive.denyNonFastForwards
اگر شما کامیتهایی را که قبلاً push کردهاید rebase کنید و سپس دوباره تلاش کنید تا آنها را push کنید، یا بهطور کلی تلاش کنید تا یک کامیت را به یک شاخهی ریموتی که شامل کامیتی نیست که شاخهی ریموتی به آن اشاره میکند، ارسال کنید، درخواست شما رد خواهد شد. این معمولاً سیاست خوبی است؛ اما در مورد rebase، ممکن است تشخیص دهید که میدانید چه کاری انجام میدهید و میتوانید با استفاده از پرچم -f در دستور push خود، شاخهی ریموتی را مجبور به بهروزرسانی کنید.
برای اینکه به Git بگویید که force-pushها را رد کند، میتوانید receive.denyNonFastForwards
را تنظیم کنید:
$ git config --system receive.denyNonFastForwards true
راه دیگری که میتوانید این کار را انجام دهید، استفاده از hookهای دریافت (receive hooks) سمت سرور است، که در ادامه به آنها خواهیم پرداخت. این روش به شما امکان انجام کارهای پیچیدهتری را میدهد، مانند رد کردن non-fast-forward ها برای یک زیرمجموعه خاص از کاربران.
receive.denyDeletes
یکی از راهحلها برای دور زدن سیاست denyNonFastForwards
این است که کاربر شاخه را حذف کرده و سپس آن را با مرجع جدید دوباره push کند.
برای جلوگیری از این کار، میتوانید receive.denyDeletes
را به true تنظیم کنید:
$ git config --system receive.denyDeletes true
این تنظیم هرگونه حذف شاخهها یا تگها را رد میکند — هیچ کاربری قادر به انجام این کار نخواهد بود. برای حذف شاخههای ریموت، باید فایلهای ref را از سرور بهطور دستی حذف کنید. همچنین روشهای جالبتری برای انجام این کار بهصورت اختصاصی برای هر کاربر از طریق ACLها وجود دارد، همانطور که در An Example Git-Enforced Policy (یک مثال از سیاستهای تحمیلی گیت) خواهید آموخت.