গাইড

Файл .gitignore: Git-এর বাইরে ফাইল রাখা এবং আগে যোগ হওয়া ফাইল সরানো

হালনাগাদ: · Skillaria.Top

.gitignore ফাইল রিপোজিটরির মূল ফোল্ডারে থেকে সেইসব ফাইল ও ফোল্ডারের প্যাটার্ন দেয়, যেগুলো Git ট্র্যাক করবে না: নির্ভরতা, বিল্ড, লগ ও গোপন তথ্য। এটি শুধু আগে থেকে ট্র্যাক না হওয়া ফাইলে কাজ করে, তাই আগে কমিট হওয়া ফাইল সরাতে git rm --cached ব্যবহার করুন।

git ignore মানে Git-কে জানানো: "এই ফাইলগুলো ছুঁয়ো না, git status-এ দেখিও না এবং git add . দিয়ে যোগ করো না।" নিয়মগুলো লেখা থাকে .gitignore নামের একটি টেক্সট ফাইলে, যা প্রকল্পের সঙ্গে কমিট হয় এবং পুরো দলের জন্য কাজ করে। মূল সূক্ষ্মতা: ignore শুধু সেইসব ফাইলে প্রযোজ্য, যেগুলো Git এখনো ট্র্যাক করছে না।

.gitignore-এ সাধারণত কী যোগ করা হয়

  • নির্ভরতা: node_modules/, vendor/, .venv/ — প্যাকেজ ম্যানেজার এগুলো আবার বানায়।
  • বিল্ডের ফলাফল: dist/, build/, *.class, __pycache__/।
  • লগ ও অস্থায়ী ফাইল: *.log, tmp/, *.swp।
  • গোপন তথ্য ও লোকাল সেটিংস: .env, কী-ফাইল, লোকাল কনফিগ।
  • OS ও এডিটরের আবর্জনা: .DS_Store, Thumbs.db, .idea/ — তবে এগুলো গ্লোবাল ignore-এ রাখাই ভালো, নিচে দেখুন।

সহজ নিয়ম: রিপোজিটরিতে থাকবে যা মানুষ লেখে, যা প্রোগ্রাম বানায় বা কোনো নির্দিষ্ট মেশিনের ওপর নির্ভর করে তা নয়।

.gitignore কীভাবে বানাবেন

এটি রিপোজিটরির মূলে একটি সাধারণ টেক্সট ফাইল। প্রতি লাইনে একটি প্যাটার্ন লিখুন এবং কমিট করুন:

cat > .gitignore <<'EOF'
# নির্ভরতা
node_modules/
# বিল্ড
dist/
# লগ
*.log
# গোপন তথ্য
.env
EOF

git add .gitignore
git commit -m "chore: .gitignore যোগ করা হলো"

জনপ্রিয় ভাষা ও ফ্রেমওয়ার্কের জন্য তৈরি টেমপ্লেট github/gitignore রিপোজিটরিতে আছে; GitHub ও GitLab প্রকল্প বানানোর সময় টেমপ্লেট বাছতে দেয়। এগুলোকে ভিত্তি ধরে অপ্রয়োজনীয় অংশ বাদ দিন।

.gitignore-এর প্যাটার্ন সিনট্যাক্স

প্যাটার্নকী বাদ দেয়
*.logযেকোনো ফোল্ডারের সব .log ফাইল
build/যেকোনো স্তরের build ফোল্ডার (শেষে স্ল্যাশ = শুধু ফোল্ডার)
/buildশুধু মূলের build (শুরুর স্ল্যাশ = .gitignore-এর ফোল্ডারে সীমাবদ্ধ)
docs/*.pdfdocs-এর সরাসরি pdf, কিন্তু docs/old/-এর নয়
docs/**/*.pdfdocs ও তার ভেতরের সব ফোল্ডারের pdf
**/tempযেকোনো ফোল্ডারের temp
!keep.logব্যতিক্রম: keep.log বাদ না দেওয়া
file?.txt? মানে একটি যেকোনো অক্ষর
[ab].txta.txt বা b.txt
# মন্তব্যমন্তব্যের লাইন

একটি সূক্ষ্ম বিষয়: ভেতরে স্ল্যাশ ছাড়া প্যাটার্ন (config.json) যেকোনো স্তরে কাজ করে, আর শুরুতে বা মাঝখানে স্ল্যাশ থাকলে (/config.json, src/config.json) প্যাটার্ন ওই .gitignore-এর ফোল্ডারের সাপেক্ষে।

ব্যতিক্রম করতে বিস্ময়চিহ্ন

*.log
!important.log

ফাঁদ: কোনো ফাইলের মূল ফোল্ডার যদি ignore করা থাকে, তবে ফাইলটিকে "ফেরানো" যায় না। Git ignore করা ফোল্ডারের ভেতরে ঢোকে না, তাই এটি কাজ করবে না:

logs/
!logs/keep.txt     # কাজ করবে না

সঠিক উপায় হলো ফোল্ডারের বদলে তার বিষয়বস্তু ignore করা:

logs/*
!logs/keep.txt

একই কৌশলে খালি ফোল্ডার রিপোজিটরিতে রাখা হয়: Git খালি ডিরেক্টরি রাখে না, তাই ভেতরে .gitkeep ফাইল রাখা হয় এবং শুধু সেটিকে অনুমতি দেওয়া হয়।

আর কোথায় ignore সেট করা যায়

জায়গাকাকে প্রভাবিত করেরিপোজিটরিতে যায় কি
.gitignore মূলে ও সাবফোল্ডারেপুরো দলহ্যাঁ
.git/info/excludeশুধু এই ক্লোননা
গ্লোবাল ফাইল core.excludesFileআপনার সব রিপোজিটরিনা

OS ও IDE-র আবর্জনা গ্লোবাল ignore-এ সরানো বুদ্ধিমানের কাজ, যাতে সাধারণ .gitignore অগোছালো না হয়:

git config --global core.excludesFile ~/.gitignore_global
echo ".DS_Store" >> ~/.gitignore_global
echo ".idea/" >> ~/.gitignore_global

core.excludesFile সেট না থাকলে Git ~/.config/git/ignore ফাইল পড়ে, যদি তা থাকে।

.gitignore কেন কাজ করছে না

সবচেয়ে সাধারণ অভিযোগ: "ফাইলটি .gitignore-এ যোগ করেছি, তবু Git পরিবর্তন দেখাচ্ছে।" কারণ প্রায় সবসময় একটাই: ফাইলটি আগে থেকেই ট্র্যাক হচ্ছে। যে ফাইল একবার কমিটে ঢুকেছে, ignore তাকে প্রভাবিত করে না।

কোন নিয়ম কাজ করছে (বা কেন করছে না), তা দেখায় git check-ignore:

git check-ignore -v logs/app.log
# .gitignore:3:*.log	logs/app.log

আউটপুটে ফাইল ও নিয়মের লাইন দেখা যায়। খালি আউটপুট মানে ফাইলটি ignore হচ্ছে না। আরেকটি কারণ: প্যাটার্নের শেষে অতিরিক্ত স্পেস, বা ফাইলের ভুল এনকোডিং (যেমন PowerShell-এ বানালে UTF-16)।

কমিট হওয়া ফাইল সরাবেন কীভাবে: git rm --cached

git rm ফাইলটিকে ইনডেক্স ও ডিস্ক দুটো থেকেই মোছে। --cached ফ্ল্যাগ দিলে শুধু ইনডেক্স থেকে মোছে: ফাইল আপনার কাছে থাকে, কিন্তু আর ট্র্যাক হয় না।

echo ".env" >> .gitignore
git rm --cached .env
git commit -m "chore: .env আর ট্র্যাক হচ্ছে না"
git push

ফোল্ডারের জন্য -r লাগে:

git rm -r --cached node_modules/

কী কী আগে কমিট হয়েছে স্পষ্ট না হলে পুরো ইনডেক্স নতুন করে বানানো যায়: git rm -r --cached ., তারপর git add . এবং কমিট। কমিটের আগে git status দেখুন: ইনডেক্স থেকে সরানো ফাইলগুলো সেখানে দেখা যাবে।

সতর্কতা: গোপন তথ্য ইতিহাসে থেকে যায়

git rm --cached ফাইলটিকে পরের কমিট থেকে সরায়, কিন্তু আগের কমিট থেকে নয়। রিপোজিটরিতে পাসওয়ার্ড বা টোকেন ঢুকে থাকলে তা ক্লোনধারী যে কেউ ইতিহাসে দেখতে পায়। এই গোপন তথ্যকে আপোসকৃত ধরে নিয়ে নতুন করে ইস্যু করতে হবে। ইতিহাস লেখার সরঞ্জাম আছে, যেমন git filter-repo, তবে এতে সব পরবর্তী কমিটের হ্যাশ বদলায় এবং দলের সঙ্গে সমন্বয় লাগে।

আরেকটি ফল: সহকর্মীর git pull-এর পর --cached দিয়ে ইনডেক্স থেকে সরানো ফাইল তার ডিস্ক থেকেও মুছে যাবে। .env-এর ক্ষেত্রে আগে থেকে জানিয়ে দিন, অথবা রিপোজিটরিতে .env.example নামে নমুনা ফাইল রাখুন।

git rm: ফাইল মোছা

git rm old.py              # ডিস্ক ও ইনডেক্স থেকে মোছা
git rm -r legacy/          # ফোল্ডার মোছা
git rm -n '*.tmp'          # ড্রাই রান: কী মুছবে দেখা
git rm -f changed.py       # অকমিট পরিবর্তনসহ ফাইল মোছা

সাধারণ rm দিয়ে ফাইল মুছলে Git সেটিকে "deleted" হিসেবে দেখে, এবং মোছা git add বা git rm দিয়ে যোগ করতে হয়। git rm দুটি ধাপ একসঙ্গে করে। -f ছাড়া অকমিট পরিবর্তনসহ ফাইল মুছতে সে আপত্তি জানায়, এটি কাজ হারানো থেকে রক্ষা করে।

git mv: নাম বদলানো ও স্থান বদলানো

git mv utils.py helpers.py
git mv helpers.py src/helpers.py

git mv হলো mv + পুরো পথের git rm + নতুন পথের git add-এর সংক্ষিপ্ত রূপ। Git নাম বদলানোর তথ্য আলাদাভাবে সংরক্ষণ করে না: এটি বিষয়বস্তুর মিল দেখে git status, git log --follow ও git diff-এর সময় তা বের করে। তাই git mv আর সাধারণ mv এবং পরে git add -A একই ফল দেয়।

বাস্তব পরামর্শ: নাম বদলানো ও বিষয়বস্তু বদলানো আলাদা কমিটে করুন। ফাইল নামবদলের সঙ্গে বেশি বদলালে Git একে একই ফাইল হিসেবে না-ও চিনতে পারে, এবং --follow-এর ইতিহাস মাঝপথে থেমে যায়।

উইন্ডোজ ও macOS-এ শুধু অক্ষরের কেস বদলাতে (যেমন readme.md থেকে README.md), যেখানে ফাইল সিস্টেম বড়-ছোট হাতের অক্ষরে সংবেদনশীল নয়, git mv readme.md README.md ব্যবহার করুন: সাধারণ নাম বদল Git ধরতে নাও পারে।

নিয়মের ক্রম ও অগ্রাধিকার

একটি ফাইলের ভেতরে নিয়মগুলো ওপর থেকে নিচে পড়া হয়, এবং যে শেষে মেলে সেটিই জয়ী হয়। তাই ব্যতিক্রম !keep.log অবশ্যই *.log-এর নিচে থাকবে, নইলে সেটি ঢাকা পড়ে যাবে। ফাইলগুলোর মধ্যে অগ্রাধিকার এমন: সাবফোল্ডারের .gitignore মূলেরটির চেয়ে গুরুত্বপূর্ণ, আর গ্লোবাল ignore ও .git/info/exclude-এর অগ্রাধিকার সবচেয়ে কম।

একটি ওয়েব প্রকল্পের .gitignore উদাহরণ

নিচে Node.js ফ্রন্টএন্ড ও Python ব্যাকএন্ডসহ একটি কার্যকর নমুনা। মন্তব্যগুলো লক্ষ্য করুন: ছয় মাস পরে কেউ মনে রাখবে না কোন নিয়ম কেন যোগ হয়েছিল।

# --- নির্ভরতা ---
node_modules/
.venv/

# --- বিল্ড ও ক্যাশ ---
/dist
/build
__pycache__/
*.pyc
.pytest_cache/
coverage/

# --- লগ ---
*.log
npm-debug.log*

# --- পরিবেশ ও গোপন তথ্য ---
.env
.env.*
!.env.example

# --- ব্যবহারকারীর আপলোড, তবে ফোল্ডার রাখা হবে ---
uploads/*
!uploads/.gitkeep

এখানে দুটি ব্যতিক্রম কৌশল আছে: .env.* সব স্থানীয় পরিবেশ ঢাকে, কিন্তু .env.example রিপোজিটরিতে থাকে; আর uploads ফোল্ডারটি .gitkeep-এর কারণে ক্লোনে থাকে।

কী ignore করা উচিত নয়

ignore-এ বাড়াবাড়িও ক্ষতিকর। নির্ভরতার লক-ফাইল — package-lock.json, poetry.lock, composer.lock — অ্যাপ্লিকেশনে সাধারণত কমিট হয়: এগুলো নিশ্চিত করে সব ডেভেলপার ও CI-তে একই প্যাকেজ সংস্করণ বসে। দলের ফরম্যাটিং ও লিন্টারের কনফিগ (.editorconfig) রিপোজিটরিতেই থাকা উচিত।

IDE-র সেটিংস নিয়ে বিতর্ক আছে। .vscode/ ফোল্ডার প্রায়ই পুরোপুরি ignore করা হয়, কিন্তু কখনো সুপারিশকৃত এক্সটেনশন ও বিল্ড টাস্ক কমিট করা হয়: .vscode/*, তারপর !.vscode/extensions.json। সিদ্ধান্ত দল নেয়; মূল কথা — ব্যক্তিগত পথ ও কী-গুলো যেন শেয়ার্ড রিপোজিটরিতে না ওঠে।

ঘটনা: ভুলবশত node_modules কমিট হয়ে গেছে

নতুনদের ক্লাসিক ভুল: .gitignore বানানোর আগে git add ., আর কমিটে উড়ে যায় হাজার হাজার ফাইল। ঠিক করতে তিন ধাপ:

echo "node_modules/" >> .gitignore
git rm -r --cached node_modules
git commit -m "chore: node_modules রিপোজিটরি থেকে সরানো হলো"

কমিট যদি এখনো সার্ভারে না গিয়ে থাকে, ভারী ফাইল ইতিহাসে না রাখতে কমিটটি আবার লিখে নিতে পারেন: git reset --soft HEAD~1, তারপর একই কমান্ড এবং নতুন কমিট। Push হয়ে গেলে ফাইলগুলো ইতিহাসে ঢুকে গেছে, এবং ইতিহাস না লিখলে ক্লোনের আকার কমবে না।

এমন যেন না ঘটে, তাই .gitignore বানান প্রথম git add-এর আগে, এবং কমিটের আগে git status দেখার অভ্যাস করুন: নতুন ফাইলের তালিকা অস্বাভাবিক লম্বা হলে থামুন।

সারসংক্ষেপ

.gitignore নতুন প্রকল্পে প্রথম কমিট করার মতো ফাইল: নির্ভরতা, বিল্ড, লগ ও গোপন তথ্য রিপোজিটরিতে দরকার নেই। ignore শুধু অ-ট্র্যাক করা ফাইলে কাজ করে, তাই আগে যোগ হওয়া ফাইল সরাতে git rm --cached লাগে, আর নিয়ম যাচাই করতে git check-ignore -v। নাম ও স্থান বদলাতে git mv, মুছতে git rm ব্যবহার করুন, যাতে বদল সরাসরি ইনডেক্সে যায়। প্রথম রিপোজিটরি ও ইনডেক্সের সঙ্গে কাজ Git কোর্সে বাস্তব অনুশীলনে শেখানো হয়।

সাধারণ প্রশ্ন

.gitignore কি কমিট করা দরকার?

হ্যাঁ, যাতে নিয়মগুলো পুরো দলের কাছে পৌঁছায়। ব্যক্তিগত ব্যতিক্রম রাখুন .git/info/exclude বা গ্লোবাল ignore-এ।

একটি প্রকল্পে কয়টি .gitignore থাকতে পারে?

যতগুলো চান। প্রতিটি সাবফোল্ডারে আলাদা .gitignore রাখা যায়, এবং তার নিয়ম সেই ফোল্ডারের সাপেক্ষে মূলের নিয়মের সঙ্গে যোগ হয়।

ignore করা ফাইল কীভাবে কমিটে যোগ করব?

git add -f পথ/ফাইল ব্যবহার করুন; এরপর ফাইলটি ট্র্যাক হয়, এবং .gitignore তার ওপর আর প্রভাব ফেলে না।

প্রকল্পের সব ignore করা ফাইল কীভাবে দেখব?

git status --ignored বা git ls-files --others --ignored --exclude-standard চালান।

কমিট করা ফাইলের পরিবর্তন সাময়িকভাবে ট্র্যাক না করতে চাইলে?

git update-index --skip-worktree ফাইল আছে, তবে এটি লোকাল সেটিং, .gitignore-এর বিকল্প নয়।

ভিডিওতে বিষয়টি শিখুন

“শূন্য থেকে আত্মবিশ্বাসী ডেভেলপার পর্যন্ত গিট” কোর্সে বিষয়টি অনুশীলনসহ বিস্তারিত শেখানো হয়েছে।

কোর্সে যান