আপনি যদি আপনার ম্যাকে কোনো Git রিপোজিটরি ক্লোন করে থাকেন এবং এর সাবমডিউল ফোল্ডারগুলো খালি থাকে, তবে Terminal খুলুন, রিপোজিটরির ভেতরে যান এবং git submodule update --init --recursive চালান। এটি প্রজেক্ট দ্বারা রেকর্ড করা সাবমডিউলগুলো ইনিশিয়ালাইজ করে, প্যারেন্ট রিপোজিটরিতে নির্দিষ্ট করা কমিটগুলো চেকআউট করে এবং নেস্টেড সাবমডিউলগুলোও পরিচালনা করে। এর জন্য আপনার Git ইনস্টল করা থাকতে হবে এবং প্রতিটি সাবমডিউলের রিমোট রিপোজিটরিতে অ্যাক্সেস থাকতে হবে।
ক্লোন করা রিপোজিটরিতে ইনিশিয়ালাইজেশন কমান্ডটি চালান
Terminal খুলুন এবং git clone দ্বারা তৈরি ডিরেক্টরিতে প্রবেশ করতে cd ব্যবহার করুন। ডিরেক্টরির নামে স্পেস থাকলে তা কোটেশনের মধ্যে রাখুন, উদাহরণস্বরূপ:
cd "$HOME/Projects/My Project"
git submodule update --init --recursive
উদাহরণস্বরূপ দেওয়া পাথটির জায়গায় আপনার ক্লোন করা রিপোজিটরির আসল লোকেশন বসান। আপনি cd লিখে Finder থেকে রিপোজিটরি ফোল্ডারটি Terminal উইন্ডোতে ড্র্যাগ করে এনে এর পাথটি ইনসার্ট করতে পারেন এবং Return চাপতে পারেন। Apple-এর ডকুমেন্টেশনে Terminal-কে macOS-এর কমান্ড-লাইন ইন্টারফেস হিসেবে উল্লেখ করা হয়েছে এবং zsh-কে এর ডিফল্ট শেল হিসেবে শনাক্ত করা হয়েছে; উপরের কমান্ডগুলোতে সাধারণ শেল সিনট্যাক্স ব্যবহার করা হয়েছে যা zsh-এ কাজ করে। Open or quit Terminal on Mac, Change the default shell in Terminal on Mac
Git-এর অফিসিয়াল ডকুমেন্টেশনে ব্যাখ্যা করা হয়েছে যে, --init সেসকল সাবমডিউলকে ইনিশিয়ালাইজ করে যেগুলো ইনিশিয়ালাইজ করা হয়নি, আর --recursive নেস্টেড সাবমডিউলগুলোকেও আপডেট করে। update অনুপস্থিত কমিটগুলো ফেচ করে এবং প্যারেন্ট রিপোজিটরি প্রত্যাশিত রিভিশনটি চেকআউট করে। git-submodule documentation
সাবমডিউলগুলো ইনিশিয়ালাইজ হয়েছে কিনা তা পরীক্ষা করুন
প্যারেন্ট রিপোজিটরিতে কী রেকর্ড করা আছে তা দেখতে, চালান:
git submodule status --recursive
একটি সাবমডিউল স্ট্যাটাস লাইনে সাধারণত একটি কমিট আইডি এবং পাথ প্রদর্শিত হয়। শুরুতে একটি বিয়োগ চিহ্ন (-) থাকার অর্থ হলো সাবমডিউলটি ইনিশিয়ালাইজ করা হয়নি; একটি যোগ চিহ্ন (+) থাকার অর্থ হলো এর চেকআউট করা কমিটটি প্যারেন্ট রিপোজিটরিতে রেকর্ড করা কমিট থেকে আলাদা; এবং U দিয়ে কোনো কনফ্লিক্ট নির্দেশ করে। রিকার্সিভ স্ট্যাটাস অপশনটি নেস্টেড সাবমডিউলগুলোর রিপোর্টও প্রদান করে। git-submodule documentation
যদি আউটপুটে বিয়োগ চিহ্নসহ পাথ প্রদর্শিত হয়, তবে রিপোজিটরির শীর্ষ স্তরের ডিরেক্টরি (top-level directory) থেকে ইনিশিয়ালাইজেশন কমান্ডটি পুনরায় চালান। যদি কোনো সাবমডিউল দেখা না যায়, তবে বর্তমান ক্লোনটিতে আসলেই কোনো .gitmodules ফাইল আছে কিনা এবং আপনি কাঙ্ক্ষিত রিপোজিটরিতে আছেন কিনা তা যাচাই করুন। কোনো রিপোজিটরিতে সাবমডিউল নাও থাকতে পারে, অথবা আপনি যে কমিটটি ক্লোন করেছেন তাতে কোনো সাবমডিউল রেকর্ড করা নাও থাকতে পারে।
কোন রিভিশনটি চেকআউট হচ্ছে তা বুঝুন
প্রতিটি সাবমডিউল নিজেই একটি স্বতন্ত্র Git রিপোজিটরি, এবং প্যারেন্ট রিপোজিটরি এর জন্য একটি নির্দিষ্ট কমিট রেকর্ড করে রাখে। স্বাভাবিক update আচরণ সেই রেকর্ড করা কমিটটি চেকআউট করে, যার ফলে সাধারণত সাবমডিউলটি একটি ডিটাচড (detached) HEAD-এ চলে যায়। প্যারেন্ট প্রজেক্ট সেটআপ করার সময় এটাই প্রত্যাশিত: এটি প্যারেন্ট দ্বারা নির্বাচিত সংস্করণটিকে হুবহু ফিরিয়ে আনে। Git - Submodules, git-submodule documentation
এই কারণে, আপনার লক্ষ্য যখন কেবল ক্লোনটিকে ইনিশিয়ালাইজ করা, তখন --remote যোগ করবেন না। এই অপশনটি প্যারেন্ট দ্বারা রেকর্ড করা কমিটের পরিবর্তে সাবমডিউলের রিমোট-ট্র্যাকিং ব্রাঞ্চ ব্যবহার করে, যা একটি ভিন্ন সংস্করণ তৈরি করতে পারে। আপনি যদি সাবমডিউলের ভেতরে ডেভেলপমেন্ট করতে চান, তবে প্রথমে প্রজেক্টের ওয়ার্কফ্লো জেনে নিন; কোনো ব্রাঞ্চে সুইচ করা বা এর ভেতরে কমিট তৈরি করা সাবমডিউল ইনিশিয়ালাইজ করার চেয়ে আলাদা একটি বিষয়।
কমান্ডটি ব্যর্থ হলে করণীয়
সাবমডিউল আপডেটের জন্য প্রজেক্টের কনফিগারেশনে তালিকাভুক্ত রিমোটগুলোর সাথে সংযোগ স্থাপন করতে হয়, তাই নেটওয়ার্কের সমস্যা বা প্রয়োজনীয় অ্যাক্সেস না থাকলে চেকআউট ব্যাহত হতে পারে। প্রাইভেট সাবমডিউলগুলোর জন্য হোস্টিং সার্ভিসে অথেনটিকেশন বা রিপোজিটরিতে অনুমতির প্রয়োজন হতে পারে। Git যদি রিপোর্ট করে যে এটি কোনো রিপোজিটরি খুঁজে পাচ্ছে না বা হোস্ট সমাধান করতে পারছে না, তবে আপনার নেটওয়ার্ক সংযোগ এবং অ্যাক্সেস নিশ্চিত করুন, তারপর পুনরায় চেষ্টা করুন।
যদি কোনো প্রজেক্ট সম্প্রতি কোনো সাবমডিউলের URL পরিবর্তন করে থাকে, তবে git submodule sync --recursive কমান্ডটি .gitmodules থেকে লোকাল URL কনফিগারেশন সিঙ্ক্রোনাইজ করতে পারে; এরপর git submodule update --init --recursive চালান। যে সাবমডিউলগুলো ইতিমধ্যেই ইনিশিয়ালাইজ করা হয়েছে বা নতুন যোগ করা হয়েছে সেগুলোর URL কনফিগারেশন আপডেট করার জন্য Git-এর ডকুমেন্টেশনে sync-এর কথা উল্লেখ রয়েছে। git-submodule documentation
সাবমডিউলের ভেতরে যদি ইতিমধ্যে আপনার লোকাল কোনো কাজ থাকে, তবে কোনো আপডেট ফোর্স করার আগে বা রিভিশন পরিবর্তন করার আগে তা ভালোভাবে দেখে নিন। স্ট্যান্ডার্ড ইনিশিয়ালাইজেশন কমান্ড লোকাল পরিবর্তনের ওপর জোরপূর্বক চেকআউট করার জন্য Git-কে নির্দেশ দেয় না; সমস্যা সমাধানের সংক্ষিপ্ত উপায় হিসেবে ডিরেক্টরিটি মুছে ফেলার চেয়ে বরং সতর্কতার সাথে সেই কাজটির সমাধান করুন বা তা সংরক্ষণ করুন।
যখন git submodule status --recursive কোনো শুরুতে বিয়োগ চিহ্ন ছাড়াই প্রত্যাশিত কমিট আইডিগুলো দেখাবে, তখন রিপোজিটরির রেকর্ড করা সাবমডিউল রিভিশনগুলো চেকআউট সম্পন্ন হয়েছে। প্রজেক্টের নির্দেশাবলীতে কোনো সাবমডিউলের ভেতরে আলাদা কাজের কথা বলা না থাকলে মূল প্যারেন্ট রিপোজিটরি থেকেই আপনার কাজ চালিয়ে যান।
তথ্যসূত্র
Git - Submodules — Git
Open or quit Terminal on Mac — Apple