ব্লগে ফিরুন

Git Remove Untracked Files: নিরাপদ git clean গাইড

৯ সেপ্টেম্বর, ২০২৬

TL;DR: git-এ untracked ফাইল সরাতে git clean -fd — তবে আগে সবসময় git clean -nd দিয়ে প্রিভিউ দেখুন, কারণ clean স্থায়ীভাবে মুছে আর সেগুলো কখনো ট্র্যাশে যায়ই না। ফাইলের জন্য -f, ফাইল-ডিরেক্টরি দুটোর জন্য -fd, আর gitignored বিল্ড আউটপুটও যেতে হবে হলে -fdx। সবচেয়ে পরিচিত অভিযোগ — “git clean আমার untracked ফাইল সরাচ্ছেই না” — প্রায় সবসময়ের মানে ফাইলগুলো untracked একটা ডিরেক্টরির ভেতরে (-d যোগ করুন) বা সেগুলো ignored ফাইল (-x যোগ করুন)। Untracked জঞ্জাল হলো পরীক্ষা-নিরীক্ষা, বিল্ড আর ক্লোন-সংলগ্ন স্ক্রিপ্টের স্বাভাবিক উপজাত; এই গাইডে প্রতিটি মোছার আগে প্রিভিউ নেওয়া, শুধু এক ডিরেক্টরি থেকে সরানো, আর যত্নের রিপোতে যেসব সমন্বয় কখনোই চালাবেন না তা দেখানো হলো।

git status-এ “untracked files” মানে কী?

Untracked মানে git ফাইলটাকে ডিস্কে দেখছে, কিন্তু ট্র্যাক করতে বলা হয়নি — সেটা index-এ নেই, commit history-ও নেই। git status সবকিছুকে তিন বালতিতে ভাগ করে:

$ git status --short
 M src/app.ts        # modified: ট্র্যাকড, বদলেছে
?? notes.txt         # untracked: নতুন ফাইল, git জানে না
?? build/            # untracked ডিরেক্টরি: git-এর কাছে সম্পূর্ণ নতুন

ভাগটা কাজে লাগে কারণ প্রতিটা বালতির সরানোর টুল আলাদা। ট্র্যাকড-কিন্তু-বদলে-যাওয়া ফাইল ফেরানো হয় git restore দিয়ে বা commit করে সরিয়ে ফেলা হয় — git clean এদের ছোঁয় না। শুধু ?? লাইনগুলোই git clean-এর এলাকা। Ignored ফাইল (.gitignore-এ মেলা সবকিছু) হলো লুকানো চতুর্থ বালতি: ওরা ?? হিসেবেও দেখায় না, আর -x দিয়ে স্পষ্ট অনুমতি না দিলে git clean ওদের পাশ কাটিয়ে যায়।

আসল সমস্যাটা যদি হয় একটা ট্র্যাকড ফাইল, যা কখনো commit হওয়াই উচিত ছিল না — তবে পরিষ্কারই ভুল টুল; সেটা git rm --cached-র কাজ, বা শেষ commit reset করা, যা আছে git undo last commit: পরিবর্তন রেখে-তে।

git-এ untracked ফাইল কীভাবে সরাব?

মূল কমান্ড git clean -f-f ছাড়া git কিছুই মুছতে অস্বীকার করে, শুধু সতর্কবার্তা ছাপে — ইচ্ছাকৃত নিরাপত্তা-রেল। পুরো অনুষ্ঠানটা এই রকম:

# 1. ঠিক কী মুছে যাবে দেখুন (dry run — কিছুই মোছে না)
git clean -nd

# সরিয়ে ফেলবে:
# notes.txt
# build/
# scratch/

# 2. তালিকায় দামি কিছু নেই যাচাই করে আসলেই মুছুন
git clean -fd

ফ্ল্যাগে ফ্ল্যাগে:

  • -f / --force — আবশ্যক। Untracked ফাইল সত্যিই মুছে দেয়।
  • -d — untracked ডিরেক্টরির ভেতরে ঢোকে। খালি -f শুধু উপরের স্তরের untracked ফাইল সরায়, আর যেসব ডিরেক্টরি ছুঁতে অস্বীকার করেছে সেগুলোর খবর দেয়।
  • -n / --dry-run — কী সরতে পারত দেখায়। সবসময় এটা দিয়েই শুরু করুন।
  • -xignored ফাইলও মুছে দেয় (node_modules, বিল্ড আউটপুট, .env)।
  • -Xকেবল ignored ফাইল মুছে, untracked-কিন্তু-ignored-নয় সেগুলো রেখে দেয়।
  • -i — ইন্টারঅ্যাক্টিভ মোড; dry-run তালিকা লম্বা হলে কাজের।

নকল করার মতো অভ্যাস: git clean -nd-কে git diff-এর মতোই সারুন — commit-এর আগে যেমন দেখেন, পরিষ্কারের আগেও তেমন দেখুন।

git clean আমার untracked ফাইল সরাচ্ছে না কেন?

তিনটা আসল কারণ, যে ক্রমে সেগুলো কামড় দেয়:

1. ফাইলগুলো untracked ডিরেক্টরির ভেতরে। শুধু -f দিলে git খোলা untracked ফাইল সরায় কিন্তু ডিরেক্টরিতে থামে — আসল দৌড়ে মুছেও না, রহস্যজনকভাবে Would remove build/ জানিয়ে দেয়। -d যোগ করুন:

git clean -fd

2. ফাইলগুলো gitignored। node_modules/, dist/, .venv/ — ignored পথ খালি clean-এর চোখে অদৃশ্য। Dry run তালিকাও করে না, clean-ও সরায় না। স্পষ্টভাবে opt in করুন:

git clean -fdx   # untracked + ignored ফাইল ও ডিরেক্টরি

3. পথে নেস্টেড git রিপোজিটরি বা submodule। Git বাইরে থেকে আরেক রিপোর ভেতরের জিনিস কখনো মোছে না। Submodule যথাযথ নিয়মে সরান, বা --force দুবার দিন (git clean -ffd) — প্রথম পথটাই পছন্দ করুন।

Dry run কিছু না দেখালেও git status এখনো ?? দেখালে সম্ভবত ভুল working tree-তে আছেন — git rev-parse --show-toplevel চালিয়ে দেখুন, যে রিপো পরিষ্কার করার কথা তার ভেতরেই আছেন তো।

শুধু নির্দিষ্ট ডিরেক্টরি থেকে untracked ফাইল কীভাবে সরাব?

পাথ দিয়ে clean-এর পরিসর বাঁধুন — বাকি সব না-ছোঁয়া থাকে:

git clean -fd build/          # শুধু build/-এর ভেতরে
git clean -fd src/generated   # একটা নির্দিষ্ট ট্রি

“আমি build/-এর untracked ফাইল-ফোল্ডার সরাব, কিন্তু রিপো রুটের আবর্জনা-নোটগুলো রাখব” — এরই উত্তর। পাথটা বর্তমান ডিরেক্টরির সাপেক্ষে, তাই রিপো রুট থেকে চালালে পরিসর পুরো রিপো, সাবডিরেক্টরি থেকে চালালে সেই সাবট্রি।

ফাইল না মুছে কি untracked ফাইল সরানো যায়?

Dry run এমন ফাইল দেখাল যা পরে লাগতে পারে — জুয়া খেলবেন না; আগে জমান, তারপর পরিষ্কার করুন:

# Untracked ফাইল stash করুন (-a দিলে ignored-ও) মুছে না ফেলে
git stash push --include-untracked
git clean -fd                      # ট্রি পরিষ্কার
git stash pop                      # দরকার হলে ফিরিয়ে আনুন

git stash -u untracked ফাইলকে ট্রি থেকে সরিয়ে রাখে, তবে উদ্ধারযোগ্য — মানুষ যে “মুছে না ফেলে সরাও” অর্থে খোঁজে, আসলে সেটাই। রাখা যায় এমন প্রিভিউ চাইলে git clean -nd > clean-plan.txt — কোনো সিদ্ধান্তের আগেই হুবহু তালিকা হাতে। git clean -f-এর পরে undo নেই: মোছা মানেই গেছে।

git clean vs git rm vs git restore: কখন কোনটি?

কমান্ডকাকে ছোঁয়ডিস্ক থেকে মোছেকখন ব্যবহার করবেন
git clean -fdUntracked ফাইল/ডিরেক্টরিহ্যাঁGit কখনো ট্র্যাক করেনি এমন ফাইল মুছতে
git clean -fdxUntracked + ignoredহ্যাঁপূর্ণ reset, node_modules ও বিল্ড আউটপুটসহ
git rm <file>ট্র্যাকড ফাইলহ্যাঁ (staged)ফাইল মুছুন এবং মোছাটা git-এ লিপিবদ্ধ করুন
git rm --cached <file>ট্র্যাকড ফাইলনাট্র্যাকিং বন্ধ করুন, ফাইল ডিস্কে রাখুন
git restore <file>ট্র্যাকড ফাইলনালোকাল এডিট ফেলে দিন, ফাইল রাখুন

এক-লাইনের নিয়ম: clean সামলায় git যা জানেই না; rm আর restore সামলায় যা জানে। এই দুটো গুলিয়ে ফেলাতেই মানুষ কাজ হারায় — git clean -fdx চালিয়ে মনে মনে ভাবা যে এটা git restore-এর মতোই আচরণ করবে।

git clean কখনো কোথায় চালানো উচিত নয়?

একেবারে এড়ার দুটো অভ্যাস:

  1. মনোরিপো বা workspace-এ অন্ধের মতো git clean -fdx কখনো নয়। এটা প্রতিটা ignored ডিরেক্টরি মুছে দেয় — প্রতিটা node_modules, প্রতিটা virtualenv, ট্রির প্রতিটা লোকাল .env। ফিরিয়ে আনতে ঘণ্টার পুনর্ইনস্টল লাগতে পারে, আর মোছা .env হয়তো আর ফেরেই না।
  2. Force ভাঁজ করা alias কখনো নয়। git config alias.wipe "clean -fd" দক্ষ লাগে, যতদিন পাথে টাইপো না করেন। Dry run এক কি-প্রেসের দূরত্বে রাখুন (git clean -nd) আর অনুষ্ঠানটা দুই-কমান্ডের রাখুন — আগে প্রিভিউ, পরে মোছা।

এটাও জানা ভালো: fork-কে upstream-এর সাথে sync করার pull-এর ঠিক আগে untracked ফাইল পরিষ্কার করলে merge-এর সংঘর্ষের জায়গা ছোট থাকে — গোছানো ট্রিই সবচেয়ে সস্তা কনফ্লিক্ট-বিমা: fork-কে upstream-এর সাথে sync, ধাপে ধাপে

নিরাপদ git clean ওয়ার্কফ্লো, সংক্ষেপে

git status --short        # ট্রিতে কী আছে?
git clean -nd             # প্রিভিউ: কী যেতে পারত?
git clean -fd             # untracked ফাইল + ডিরেক্টরি মুছুন
git clean -fdX            # (ঐচ্ছিক) শুধু ignored বিল্ড আউটপুট সাফ
git status --short        # যাচাই: working tree পরিষ্কার

প্রিভিউ, মোছা, যাচাই — ত্রিশ সেকেন্ড, শূন্য আফসোস, আর git status অবশেষে আবার পরিষ্কার পড়া যায়।

— mrsaynothing

— mrsaynothing

AI, Linux ও self-hosting নিয়ে ফিল্ড নোটস।

পোস্টটি নিয়ে dev.to-তে আলোচনা করুন dev.to ↗

পরের হাউ-টু ইমেইলে পান

প্রতি পোস্টে একটি ইমেইল। সমাধান করুন, এগিয়ে যান।

self-hosted · কোনো তৃতীয় পক্ষ নেই · এক ক্লিকে আনসাবস্ক্রাইব

এটা কী?

Rsync vs SCP: কোন Linux কপি কমান্ড ব্যবহার করবেন

লেখাগুলো ভালো লাগছে? এমন জিনিস বানানোই আমার পেশা। আমাকে নিন