gitignore را قبل از add بنویسید

در ریشهٔ مخزن یک فایل به نام .gitignore بسازید. هر خط یک الگو است. خط خالی فقط فاصله می‌گذارد. خطی که با # شروع شود توضیح است، نه الگو.

سند رسمی می‌گوید الگوهایی که همهٔ هم‌تیمی باید نادیده بگیرند در همین فایل می‌روند، چون با clone به مخزن بقیه هم می‌رسد. الگوی فقط مال خودتان را اینجا نگذارید.

چند الگوی پرکاربرد با همان قواعد سند:

  • .env نام همان فایل است؛ رمز و تنظیم محلی اینجاست.
  • node_modules/ اسلش آخر یعنی فقط پوشه، نه فایل همنام.
  • *.log ستاره هر چیزی جز اسلش را می‌گیرد. چون خود الگو اسلش ندارد، در هر سطح پایین‌تر هم ممکن است بخورد.
  • __pycache__/ پوشهٔ بایت‌کد پایتون.

عادت بد رایج این است که git add . را بزنید و بعد ببینید چه رفته. اول git status را بخوانید. اگر فایلی در Untracked است که نباید برود، اول الگو را بنویسید، بعد add کنید.

بعد از ذخیره، دوباره status را بزنید. اگر آن مسیرها هنوز در Untracked هستند، الگو نخورد. سند می‌گوید اگر اسلش اول یا وسط الگو باشد، نسبت به همان پوشهٔ فایل است. اگر اسلش نباشد، در هر سطح پایین‌تر هم ممکن است بخورد.

مثال خود سند: hello.* هر فایل یا پوشه‌ای که نامش با hello. شروع شود. اگر فقط همان پوشه را می‌خواهید، /hello.* بنویسید تا a/hello.java نخورد. الگوی foo/ پوشهٔ foo را می‌گیرد، نه فایل معمولی به نام foo.

شما معمولاً کدام فایل را بعد از commit اول می‌فهمید که نباید داخل مخزن می‌بود؟ همان یک نام نشان می‌دهد الگو را اول نوشته‌اید یا بعد از add.

سه جای الگو یکی نیست

سند سه منبع را جدا می‌کند و اولویت را از بالا به پایین می‌نویسد.

  1. فایل داخل درخت کار. الگوی مشترک پروژه. با clone می‌رود.
  2. فایل $GIT_COMMON_DIR/info/exclude که معمولاً .git/info/exclude است. مخصوص همین مخزن است و به بقیه نمی‌رسد.
  3. فایل کاربر که core.excludesFile نشان می‌دهد. اگر XDG خالی باشد پیش‌فرض $HOME/.config/git/ignore است. الگوی همهٔ مخزن‌های شما اینجاست؛ مثلاً فایل موقت ویرایشگر.

پس فایل موقت سیستم‌عامل را اگر فقط مال شماست در فایل کاربر بگذارید. رمز پروژه را در فایل مشترک مخزن.

علامت ! الگو را برمی‌گرداند: فایلی که الگوی قبلی رد کرده دوباره دیده می‌شود. سند هشدار می‌دهد اگر خود پوشهٔ والد رد شده باشد، برگرداندن فایل داخلش کار نمی‌کند؛ گیت پوشهٔ ردشده را برای سرعت فهرست نمی‌کند.

فایل ردیابی‌شده را از ایندکس بردارید

اگر .env را قبلاً add کرده‌اید، نوشتن الگو کافی نیست. یادداشت همان صفحه می‌گوید اول فایل را از ایندکس بردارید:

git rm --cached -- .env

صفحهٔ git-rm می‌گوید --cached مسیر را فقط از ایندکس برمی‌دارد و فایل روی دیسک را دست نمی‌زند. بعد الگو را در فایل بگذارید تا در commit بعدی دوباره برنگردد. برای پوشه git rm -r --cached -- node_modules؛ سند می‌گوید -r وقتی نام پوشه می‌دهید برای حذف بازگشتی لازم است.

بعد status را ببینید. فایل باید از tracked برود و دیگر در Untracked هم نیاید. این کار فایل را از commitهای قبلی پاک نمی‌کند. اگر رمز را قبلاً فرستاده‌اید، الگو فقط از این به بعد جلو می‌گیرد. کلید را عوض کنید.

منبع گام‌ها: صفحهٔ gitignore در git-scm (نسخهٔ ۲٫۵۵٫۰، ۲۹ ژوئن ۲۰۲۶) و git-rm.

آخرین باری که .env یا کلید را با add فرستادید، همان لحظه gitignore داشتید یا بعدش ساختید؟