ফাইলটি .gitignore-এর সাথে মিল থাকা সত্ত্বেও যদি Git সেটিকে তালিকাভুক্ত করতে থাকে, তবে স্থানীয় কপিটি রেখে দিয়ে Git-এর ইনডেক্স থেকে ফাইলটি সরিয়ে ফেলুন। Terminal-এ, রিপোজিটরিতে যান, git rm --cached -- "path/to/file" চালান, তারপর স্টেজ করা অপসারণ এবং ইগনোর নিয়মটি কমিট করুন। Git-এর ডকুমেন্টেশন নিশ্চিত করে যে ইগনোর নিয়মগুলো আনট্র্যাকড ফাইলগুলোর ওপর কাজ করে; এগুলো ইতিমধ্যে ইনডেক্সে থাকা ফাইলগুলোর ট্র্যাকিং বন্ধ করে না। (Git gitignore ডকুমেন্টেশন)
.gitignore কেন ফাইলটির ট্র্যাকিং বন্ধ করেনি
একটি .gitignore প্যাটার্ন Git-কে বলে যাতে এটি ম্যাচ করা আনট্র্যাকড পাথগুলোকে বাদ রাখে। কোনো ফাইল যদি রিপোজিটরিতে আগেই যোগ করা হয়ে থাকে, তবে পরবর্তীতে যুক্ত করা ইগনোর নিয়ম থাকা সত্ত্বেও Git সেটির পরিবর্তনগুলো ট্র্যাক করতে থাকে। নিয়মটি সঠিক হতে পারে এবং তাও ফাইলটি ইনডেক্স থেকে সরিয়ে না ফেলা পর্যন্ত কোনো প্রভাব ফেলছে না বলে মনে হতে পারে। (Git gitignore ডকুমেন্টেশন)
Mac-এ, Terminal খুলুন এবং রিপোজিটরির টপ-লেভেল ফোল্ডারে যান। Apple টার্মিনালকে macOS-এর কমান্ড-লাইন ইন্টারফেস হিসেবে নথিভুক্ত করে এবং zsh-কে ডিফল্ট শেল হিসেবে শনাক্ত করে; নিচের কমান্ডগুলো সাধারণ zsh সেটআপে কাজ করে। ইনডেক্স পরিবর্তন করার আগে আপনি সঠিক রিপোজিটরিতে আছেন কিনা তা নিশ্চিত করুন:
git status
পরবর্তী কমান্ডের ফাইল পাথটি রিপোজিটরি রুটের সাপেক্ষে। উদাহরণের স্থানটিতে প্রকৃত পাথ ব্যবহার করুন। উদ্ধৃতিচিহ্নগুলো (quotes) বজায় রাখুন: এগুলো স্পেস এবং *-এর মতো অক্ষরগুলোকে শেল দ্বারা ইন্টারপ্রেট হওয়া থেকে রক্ষা করে। -- চিহ্নের মাধ্যমে অপশনগুলোর সমাপ্তি চিহ্নিত হয়, ফলে হাইফেন দিয়ে শুরু হওয়া পাথকে পাথ হিসেবে গণ্য করা হয়।
ইনডেক্স থেকে ফাইলটি সরান এবং Mac-এর কপিটি রাখুন
চালান:
git rm --cached -- "path/to/file"
--cached পাথটিকে Git-এর ইনডেক্স থেকে সরিয়ে দেয়, ওয়ার্কিং ট্রি থেকে নয়। ফাইলটি আপনার Mac-এ থেকে যাওয়া উচিত। এটি পরবর্তী কমিটের জন্য একটি অপসারণ স্টেজ করে; এটি ফাইলের পূর্বে কমিট করা ইতিহাস মুছে ফেলে না। (Git git rm ডকুমেন্টেশন)
পাথটি যদি কোনো ডিরেক্টরির ভেতরে থাকে এবং আপনি পুরো ডিরেক্টরিটির ট্র্যাকিং বন্ধ করতে চান, তবে -r যোগ করুন এবং সেটির পাথ ব্যবহার করুন:
git rm --cached -r -- "path/to/directory"
এটি সাবধানে ব্যবহার করুন: Git সেই ডিরেক্টরির অধীনে থাকা সমস্ত ট্র্যাক করা পাথ ইনডেক্স থেকে সরিয়ে ফেলে। স্থানীয় ফাইলগুলো থেকে যায়, তবে অপসারণটি স্টেজ করা হয়। ফাইলটিতে স্টেজ করা পরিবর্তন থাকলে বা এর বিষয়বস্তু সর্বশেষ কমিটের সংস্করণের চেয়ে আলাদা হওয়ার কারণে Git যদি প্রত্যাখ্যান করে, তবে থামুন এবং git status পরীক্ষা করুন; কোন স্টেজ করা পরিবর্তনগুলো বাতিল হয়ে যাবে তা না বুঝলে -f যোগ করবেন না। Git এ ধরনের পরিবর্তনের জন্য তার স্বাভাবিক সুরক্ষা অতিক্রম করার উপায় হিসেবে 'force'-কে নথিভুক্ত করে। (Git git rm ডকুমেন্টেশন)
ইগনোর নিয়মটি পরীক্ষা করুন এবং কী কমিট করা হবে তা পর্যালোচনা করুন
নিশ্চিত করুন যে .gitignore প্যাটার্নটি সেই ইগনোর ফাইলের অবস্থান থেকে পাথটির সাথে মেলে। উদাহরণস্বরূপ, রিপোজিটরি-রুটের .gitignore-এ থাকা একটি নিয়ম যাতে local-settings.json রয়েছে, তা যেকোনো ডিরেক্টরি লেভেলে সেই নামের ফাইলগুলোর সাথে মেলে; /local-settings.json ম্যাচটিকে কেবল রিপোজিটরি রুটের মধ্যে সীমাবদ্ধ করে। Git প্যাটার্নগুলো .gitignore ধারণকারী ডিরেক্টরির সাপেক্ষে কাজ করে, এবং আরও সুনির্দিষ্ট লোয়ার-লেভেল ইগনোর ফাইলগুলো ফলাফলে প্রভাব ফেলতে পারে। (Git gitignore ডকুমেন্টেশন)
এখন-আনট্র্যাকড ফাইলের সাথে কোন নিয়মটি মিলছে তা Git-কে জিজ্ঞাসা করুন:
git check-ignore -v -- "path/to/file"
-v অপশনটি এর জন্য দায়ী সোর্স এবং প্যাটার্ন দেখায়। এটি যদি কিছুই প্রিন্ট না করে, তবে বানান, পাথ এবং প্যাটার্নের অবস্থান পুনরায় পরীক্ষা করুন। Git-এর FAQ ইতিমধ্যে ট্র্যাক করা কোনো ফাইলকে আনট্র্যাক এবং ইগনোর করার জন্য git rm --cached এবং সাথে একটি ম্যাচিং ইগনোর প্যাটার্ন ব্যবহারের পরামর্শ দেয়। (Git FAQ)
কমিট করার আগে স্টেজ করা পরিবর্তন এবং ওয়ার্কিং কপি পর্যালোচনা করুন:
git status
স্ট্যাটাসে পাথটি মুছে ফেলা (deleted) হিসেবে স্টেজ করা দেখাতে হবে এবং .gitignore-এর পরিবর্তন যদি ইতিমধ্যে স্টেজ করা না থাকে তবে সেটিকে পরিবর্তিত (modified) হিসেবে দেখাতে হবে। কাজের ফাইলটি তখনও উপস্থিত থাকা উচিত। প্রয়োজনে ইগনোর ফাইলটি স্টেজ করুন, তারপর উভয় পরিবর্তন কমিট করুন:
git add -- .gitignore
git commit -m "Stop tracking local file"
প্রাসঙ্গিক ইগনোর ফাইলটি যদি কোনো সাবডিরেক্টরিতে থাকে, তবে git add-এ সেটির রিপোজিটরি-আপেক্ষিক পাথ ব্যবহার করুন। কমিট করার আগে আবার git status পর্যালোচনা করুন, বিশেষ করে যদি অন্য কোনো কাজ স্টেজ করা থাকে, যাতে কমিটে কেবল আপনার কাঙ্ক্ষিত পরিবর্তনগুলোই অন্তর্ভুক্ত হয়।
কমিটের পরে কী ঘটে
কমিটের পরে, Git বর্তমান ব্রাঞ্চে সেই পাথটিকে আর ট্র্যাক করে না, এবং ইগনোর নিয়মটি এটিকে দুর্ঘটনাবশত আবার যুক্ত হওয়া থেকে বিরত রাখে। কমিটটি একটি অপসারণ রেকর্ড করে, তাই যেসব সহকর্মী সেই কমিট চেক আউট করবেন তারা তাদের ওয়ার্কিং ট্রি থেকে ট্র্যাক করা ফাইলটি অপসারিত হতে দেখবেন; প্রত্যেকের স্থানীয় ইগনোর করা কপি Git দ্বারা স্বয়ংক্রিয়ভাবে সংরক্ষিত হয় না। ফাইলটিতে যদি এমন শেয়ার্ড কনফিগারেশন থাকে যা দলের সদস্যদের এখনও প্রয়োজন, তবে কমিট করার আগে সমন্বয় করে নিন। পূর্বে কমিট করা সংস্করণগুলো রিপোজিটরির ইতিহাসে থেকে যায়, তাই এই পদ্ধতিটি অতীতের কপিগুলোকে মুছে ফেলে না। (Git git rm ডকুমেন্টেশন)
আপনি যদি ফাইলটিকে সবার জন্য ট্র্যাক করা রেখে কেবল স্থানীয় সম্পাদনাগুলো লুকাতে চান, তবে .gitignore এর জন্য সঠিক ব্যবস্থা নয়। Git সেই উদ্দেশ্যে assume-unchanged বা skip-worktree ব্যবহার না করার পরামর্শ দেয়; এর পরিবর্তে একটি ট্র্যাক করা টেমপ্লেট এবং আলাদাভাবে একটি ইগনোর করা স্থানীয় কনফিগারেশন ফাইল ব্যবহারের কথা বিবেচনা করুন। (Git FAQ)
সূত্র
Git FAQ — Git
Change the default shell in Terminal on Mac — Apple Support