গিট সাবমডিউল আপডেট


242

নীচের অর্থগুলি ( গিট সাবমডিউল আপডেট ডকুমেন্টেশন থেকে) এর অর্থ পরিষ্কার করছি না :

..., submodules মস্তক বিচ্ছিন্ন করা করতে হবে যদি না --rebaseবা --mergeউল্লেখ করা হয় ...

কীভাবে --rebase/ --mergeজিনিসগুলি পরিবর্তন করে?

আমার প্রধান ব্যবহারের ক্ষেত্রে কেন্দ্রীয় সংগ্রহস্থলগুলির একটি গুচ্ছ থাকা, যা আমি সাব-মডিউলগুলির মাধ্যমে অন্যান্য সংগ্রহস্থলগুলিতে এম্বেড করব। আমি এই কেন্দ্রীয় সংগ্রহস্থলগুলিতে সরাসরি তাদের আসল অবস্থানে বা তাদের এম্বেডিং সংগ্রহস্থলের (যেগুলি এগুলি সাবমোডিয়ুলের মাধ্যমে ব্যবহার করে) এর মধ্যে থেকে উন্নত করতে সক্ষম হতে চাই।

  • এই সাবমোডিয়ুলের মধ্যে থেকে, আমি কীভাবে শাখা / পরিবর্তনগুলি তৈরি করতে পারি এবং আমি যেমন নিয়মিত সংগ্রহস্থলগুলিতে থাকি তেমন ধাক্কা / টান ব্যবহার করতে পারি, বা কিছু জিনিস সম্পর্কে সতর্ক থাকতে হবে?
  • (ট্যাগযুক্ত) ১.০ থেকে ১.১ (যদিও মূল ভান্ডারটির প্রধান ইতিমধ্যে ২.০ এ রয়েছে) থেকে সাব-মডেল রেফারেন্সড কমিটকে কীভাবে অগ্রসর করব, বা কোন শাখার কমিট আদৌ ব্যবহৃত হয়েছে তা বেছে নেব?

"বিচ্ছিন্ন মাথা" শীর্ষক বিষয়ে, ব্যবহারিক উদাহরণের জন্য স্ট্যাকওভারফ্লো / প্রশ্নগুলি / 64৪64৮76 / / হেড- এবং-orighead-in- git এবং স্ট্যাকওভারফ্লো. com / Qestions/ 237408/… দেখুন (সাব-মডিউল-সম্পর্কিত নয়, তবে এখনও )
ভনসি

"আপনি মূল প্রকল্পের মধ্যে থেকে সাব মড্যুলের সামগ্রীগুলি পরিবর্তন করতে পারবেন না": হ্যাঁ, সত্য। এবং সেই আপাত দ্বন্দ্ব সম্পর্কে কিছুটা আলোকপাত করার জন্য আমি আমার উত্তর সম্পাদনা করেছি (পরিবর্তনযোগ্য নয় এমন সাবমডিউল, যে আপনি এখনও মূল প্রকল্পের রেপো থেকে সংশোধন করতে পারেন!)
ভোনসি

উত্তর:


304

এই গিটপ্রো পৃষ্ঠাটি গিট সাবমড্যুলি আপডেটের ফলাফলটি সুন্দরভাবে সংক্ষিপ্ত করে তুলেছে

আপনি যখন চালান git submodule update, এটি প্রকল্পের নির্দিষ্ট সংস্করণটি পরীক্ষা করে তবে কোনও শাখার মধ্যে নয়। একে বিচ্ছিন্ন মাথা রাখার বলা হয় - এর অর্থ হ'ল হেড ফাইলটি প্রতিশ্রুতিবদ্ধভাবে সরাসরি নির্দেশ করে, প্রতীকী রেফারেন্সকে নয়।
সমস্যাটি হ'ল আপনি সাধারণত মাথা বিচ্ছিন্ন পরিবেশে কাজ করতে চান না কারণ পরিবর্তনগুলি হারাতে সহজ
আপনি যদি প্রাথমিক সাবমডিউল আপডেট করেন, কাজ করার জন্য কোনও শাখা তৈরি না করেই সেই সাবমডিউল ডিরেক্টরিতে প্রতিশ্রুতি দিন এবং তারপরে গিট সাবপ্রোডিয়াল আপডেটটি সুপারপোজেক্ট থেকে আবার পরিচালনা করুন, গিট আপনাকে কিছু না বলেই আপনার পরিবর্তনগুলি ওভাররাইট করে দেবে। প্রযুক্তিগতভাবে আপনি কাজটি হারাবেন না, তবে এটির দিকে নির্দেশকারী আপনার কোনও শাখা থাকবে না, সুতরাং এটি পুনরুদ্ধার করা কিছুটা কঠিন হবে।


নোট মার্চ 2013:

" গিট সাবমডিউল ট্র্যাকিং সর্বশেষ " তে উল্লিখিত হিসাবে , এখন একটি সাবমডিউল (git1.8.2) একটি শাখা ট্র্যাক করতে পারে।

# add submodule to track master branch
git submodule add -b master [URL to Git repo];

# update your submodule
git submodule update --remote 
# or (with rebase)
git submodule update --rebase --remote

" git submodule update --remoteবনামgit pull " দেখুন।

MindTooth এর উত্তর একটি ম্যানুয়াল আপডেট চিত্রিত (স্থানীয় কনফিগারেশন ছাড়াই):

git submodule -q foreach git pull -q origin master

উভয় ক্ষেত্রে, এটি সাবমোডিয়াল রেফারেন্সগুলিকে পরিবর্তন করবে ( গিটলিংক , প্যারেন্ট রেপো সূচকে একটি বিশেষ এন্ট্রি ), এবং আপনাকে মূল রেপো থেকে রেফারেন্সগুলি যুক্ত করতে, প্রতিশ্রুতিবদ্ধ হতে এবং চাপ দিতে হবে।
পরের বার আপনি সেই প্যারেন্ট রেপোটিকে ক্লোন করবেন, এটি নতুন SHA1 রেফারেন্সগুলি প্রতিবিম্বিত করার জন্য সাবমোডিয়ুলগুলি বিশিষ্ট করবে।

এই উত্তরটির বাকী অংশে ক্লাসিক সাবমডিউল বৈশিষ্ট্য (একটি নির্দিষ্ট প্রতিশ্রুতি সম্পর্কিত রেফারেন্স , যা একটি সাবমোডিয়ুলের ধারণার পিছনে সমস্ত পয়েন্ট) বিশদের বিবরণ দেয় ।


এই সমস্যাটি এড়াতে, আপনি যখন গিট চেকআউট-বি কাজ বা সমতুল্য কিছু দিয়ে একটি সাবমডিউল ডিরেক্টরিতে কাজ করেন তখন একটি শাখা তৈরি করুন। আপনি যখন দ্বিতীয়বার সাবমডিউলটি আপডেট করবেন, এটি তখনও আপনার কাজটিকে ফিরিয়ে দেবে, তবে কমপক্ষে আপনার কাছে ফিরে আসার জন্য একটি পয়েন্টার রয়েছে।

সেগুলিতে সাবমডিউলগুলি দিয়ে শাখাগুলি স্যুইচ করাও জটিল be আপনি যদি একটি নতুন শাখা তৈরি করেন, সেখানে একটি সাবমডিউল যুক্ত করুন এবং তারপরে সেই সাবমডিউল ব্যতীত কোনও শাখায় ফিরে যেতে পারেন, আপনার এখনও সাবমডিউল ডিরেক্টরিটি একটি চিহ্নবিহীন ডিরেক্টরি হিসাবে রয়েছে:


সুতরাং, আপনার প্রশ্নের উত্তর দিতে:

আমি কীভাবে শাখাগুলি / পরিবর্তনগুলি তৈরি করতে পারি এবং ধাক্কা / টান ব্যবহার করতে পারি ঠিক তেমনভাবেই আমি নিয়মিত রেপোগুলিতে থাকি, বা কিছু জিনিস সম্পর্কে সতর্ক থাকতে হবে?

আপনি একটি শাখা তৈরি করতে পারেন এবং পরিবর্তনগুলি ঠেলাতে পারেন।

সতর্কতা ( গিট সাবমডিউল টিউটোরিয়াল থেকে ): সবসময় সাবমোডিয়াল পরিবর্তন প্রকাশের আগে (ধাক্কা) প্রকাশ করুন (ধাক্কা) সুপারপ্রজেক্টে পরিবর্তনটি উল্লেখ করে যা এটি উল্লেখ করে। আপনি যদি সাবমডিউল পরিবর্তনটি প্রকাশ করতে ভুলে যান তবে অন্যরা সংগ্রহস্থলটিকে ক্লোন করতে সক্ষম হবে না।

আমি কীভাবে সাব-মডেল রেফারেন্সড কমিটকে বলি (ট্যাগযুক্ত) ১.০ থেকে ১.১ (যদিও মূল রেপোর মাথা ইতিমধ্যে ২.০ এ রয়েছে)

" বোঝার সাবমডিউলস " পৃষ্ঠাটি সহায়তা করতে পারে

গিট সাবমডিউলগুলি দুটি চলন্ত অংশ ব্যবহার করে প্রয়োগ করা হয়:

  • .gitmodulesফাইল এবং
  • একটি বিশেষ ধরণের গাছের বস্তু।

এগুলি একসাথে একটি নির্দিষ্ট সংগ্রহস্থলের একটি নির্দিষ্ট সংশোধন ত্রিভঙ্গ করে যা আপনার প্রকল্পের একটি নির্দিষ্ট স্থানে পরীক্ষা করা হয়।


থেকে Git submodule পৃষ্ঠা

আপনি মূল প্রকল্পের মধ্যে থেকে সাব মড্যুলের সামগ্রীগুলি পরিবর্তন করতে পারবেন না

১০০% সঠিক: আপনি কোনও উপ-মডেলটি সংশোধন করতে পারবেন না, কেবল এর একটির কমিটকেই উল্লেখ করুন।

এ কারণেই, আপনি যখন মূল প্রকল্পের মধ্যে থেকে একটি উপ-মডেলটি পরিবর্তন করেন, আপনি:

  • সাবমোডিয়ুলের (আপস্ট্রিম মডিউলে) মধ্যে প্রতিশ্রুতিবদ্ধ এবং ধাক্কা দিতে হবে , এবং
  • তারপরে আপনার মূল প্রকল্পে যান, এবং পুনরায় প্রতিশ্রুতি দিন (সেই মূল প্রকল্পটির জন্য নতুন সাব-মডিউলটি আপনাকে সবেমাত্র তৈরি এবং ধাক্কা দেওয়ার জন্য প্রতিশ্রুতি দেয়)

একটি সাবমডিউল আপনাকে একটি উপাদান-ভিত্তিক পদ্ধতির বিকাশ করতে সক্ষম করে , যেখানে মূল প্রকল্পটি কেবলমাত্র অন্যান্য উপাদানগুলির নির্দিষ্ট কমিটগুলিকে বোঝায় (এখানে "উপ-মডিউল হিসাবে ঘোষিত অন্যান্য গিট সংগ্রহস্থল")।

একটি সাবমডিউল হ'ল অন্য গিট সংগ্রহস্থলের একটি চিহ্নিতকারী (প্রতিশ্রুতিবদ্ধ) যা মূল প্রকল্প বিকাশের চক্র দ্বারা আবদ্ধ নয়: এটি ("অন্যান্য" গিট রেপো) স্বাধীনভাবে বিকশিত হতে পারে।
এটি যে অন্যান্য রেপো প্রয়োজন তা প্রতিশ্রুতিবদ্ধ থেকে বাছাই মূল প্রকল্পের উপর নির্ভর করে।

তবে, আপনার সুবিধার্থে , আপনার মূল প্রকল্প থেকে সরাসরি সেই সাবমোডিয়ুলগুলির মধ্যে একটিটি সংশোধন করতে চান, গিট আপনাকে এটি করার অনুমতি দেয়, তবে আপনি প্রথমে সেগুলি মূল গিট রেপোতে সাবমডিউল পরিবর্তনগুলি প্রকাশ করেন এবং তারপরে আপনার মূল প্রকল্পটির প্রতিশ্রুতিবদ্ধ হন সাবমডিউলের একটি নতুন সংস্করণ।

তবে মূল ধারণাটি রয়ে গেছে: নির্দিষ্ট উপাদানগুলির উল্লেখ করা যা:

  • তাদের নিজস্ব জীবনচক্র আছে
  • তাদের নিজস্ব ট্যাগ সেট আছে
  • তাদের নিজস্ব উন্নয়ন আছে

আপনি আপনার মূল প্রকল্পে উল্লেখ করছেন এমন নির্দিষ্ট কমিটের তালিকাটি আপনার কনফিগারেশনটিকে সংজ্ঞায়িত করে ( কনফিগারেশন ম্যানেজমেন্ট যা কেবল ভার্সন কন্ট্রোল সিস্টেমকে নিযুক্ত করে )

যদি আপনার মূল প্রকল্পের একই সময়ে কোনও উপাদান সত্যই বিকাশিত হতে পারে (কারণ মূল প্রকল্পে কোনও সংশোধনী উপ-ডিরেক্টরিটি সংশোধন করে এবং এর বিপরীতে জড়িত), তবে এটি আর একটি "সাবমডিউল" হবে না, তবে একটি সাবট্রি মার্জ ( সিভিএস থেকে বিতরণকৃত ভাণ্ডারগুলিতে লিগ্যাসি কোড বেস স্থানান্তরিত করার প্রশ্নেও উপস্থাপন করা হয়েছে ), দুটি গিট রেপুর ইতিহাসকে একত্রে সংযুক্ত করে।

এটি কি গিট সাবমডিউলের প্রকৃত প্রকৃতি বুঝতে সহায়তা করে?


77
কি দারুন. মূলত এমন কিছু এমন কিছুর জন্য এতক্ষণের ব্যাখ্যার যে কোনও আগমনকারীকে কেবল তাদের এসএনএন: বহিরাগতের সাথে আঁকিয়ে রাখতে ভয় দেখানোর পক্ষে যথেষ্ট হওয়া উচিত। ;-)
সংযোগ

2
@ আইকনি: তবে, আমি যেমন " গিট সাবমডিউলগুলি এসএনএন এক্সটার্নালের সাথে বেমানান কেন? " এ বিশদ হিসাবে, সাবমোডিউলগুলি মৌলিক ভিন্ন এবং এর সাথে সামঞ্জস্যপূর্ণ নয় svn:externals
ভোনসি

1
দুঃখিত, আমার নিজের প্রশ্নের জবাব দেওয়ার জন্য, আমি সাবমডিউলে সিডি'টি সংগ্রহ করি এবং গিট চেকআউট করে একটি শা, বা গিট টান / আনতে ভাল কাজ করবে। তারপরে স্থানীয় সংগ্রহস্থলে আপডেট করা হচ্ছে।
হেনরিক

2
@ hced: আপনি একবারে ব্যবহার করে সমস্ত সাবমোডিয়ুল হিট করতে পারেনgit submodule foreach
ডেভ ক্লার্ক

1
.. তবুও পাচ্ছি না। ওয়েবে কোথাও সহজ ব্যাখ্যা আছে?
ইউজিন

135

প্রতিটি সাবমডিউল আপডেট করার জন্য, আপনি নিম্নলিখিত কমান্ডটি (সংগ্রহস্থলের মূল অংশে) আবেদন করতে পারেন:

git submodule -q foreach git pull -q origin master

পুরো প্রক্রিয়াটি অনুসরণ করতে আপনি -q বিকল্পটি সরাতে পারেন ।


15
আপনি যদি কেবল git submodule update --init --recursiveমূল থেকে চালান তবে এটি সমস্তটি পুনরাবৃত্তভাবে পেয়ে যাবে এবং যদি তারা ইতিমধ্যে না থাকে তবে তাদের আরম্ভ করবে।
স্যাম সোফেস

10
@ সামসফস যা সম্পূর্ণরূপে একটি ভিন্ন উদ্দেশ্যে কাজ করে। সাবমোডিয়ুলগুলি আপডেট করা আপাতত তারা যে প্রতিশ্রুতি দিচ্ছে তাতে সাবমোডিয়ালগুলি পরীক্ষা করে দেখবে (অগত্যা সর্বশেষ প্রতিশ্রুতি নয়)। উপরের উত্তরের সমাধানটি প্রতিটি সাবমডিউলের প্রতিশ্রুতিটি উত্স / মাস্টার থেকে সর্বশেষতম হেডের কাছে আপডেট করে।
ইন্দ্রাদি

7
আমার নতুন পদ্ধতি:git submodule update --rebase --remote
মাইন্ডথুথ

19

--rebaseবনাম --mergeবিকল্পটি সম্বোধন করতে :

ধরা যাক আপনার কাছে সুপার রিপোজিটরি এ এবং সাবমডিউল বি রয়েছে এবং আপনি উপ-বি বিতে কিছু কাজ করতে চান আপনি নিজের গৃহকর্মটি করেছেন এবং জেনে রাখুন যে ফোন করার পরে

git submodule update

আপনি একটি নিম্ন-স্বল্প অবস্থায় আছেন, সুতরাং এই মুহুর্তে আপনি যে কোনও কমিট করেন তা ফিরে পাওয়া শক্ত। সুতরাং, আপনি বি সাবমোডুল বিতে একটি নতুন শাখায় কাজ শুরু করেছেন

cd B
git checkout -b bestIdeaForBEver
<do work>

এদিকে, প্রকল্প এ এর ​​অন্য কেউ সিদ্ধান্ত নিয়েছে যে বি এর সর্বশেষতম এবং সর্বশ্রেষ্ঠ সংস্করণটি সত্যই এ-এর প্রাপ্য। আপনি, অভ্যাসের বাইরে, সাম্প্রতিক পরিবর্তনগুলি একত্রে মার্জ করুন এবং আপনার সাবমডিউলগুলি আপডেট করুন।

<in A>
git merge develop
git submodule update

ওহ নোস! আপনি আবার মাথা নিচু অবস্থায় ফিরে এসেছেন, সম্ভবত কারণ বি এখন বি এর নতুন টিপের সাথে যুক্ত এসএইচএ-র প্রতি ইঙ্গিত করছে, বা অন্য কোনও প্রতিশ্রুতিবদ্ধ। যদি কেবল আপনার কাছে থাকে:

git merge develop
git submodule update --rebase

Fast-forwarded bestIdeaForBEver to b798edfdsf1191f8b140ea325685c4da19a9d437.
Submodule path 'B': rebased into 'b798ecsdf71191f8b140ea325685c4da19a9d437'

এখন থেকে বি এর পক্ষে সর্বকালের সেরা ধারণাটি নতুন প্রতিশ্রুতিতে পুনর্বাসিত হয়েছে, এবং আরও গুরুত্বপূর্ণ, আপনি এখনও বি এর জন্য আপনার উন্নয়ন শাখায় রয়েছেন, মাথা বিহীন অবস্থায় নেই!

(এই --mergeপরিবর্তনগুলি আপডেটএসএ-এর পরে আপডেটগুলি আপনার কার্য শাখায় রূপান্তরিত করবে, আপডেটএসএ-এর পরে আপনার পরিবর্তনগুলি ছাড় দেওয়ার বিপরীতে))


7

গিট 1.8.2 একটি নতুন বিকল্প বৈশিষ্ট্যযুক্ত --remote, যা ঠিক এই আচরণটি সক্ষম করে। চলমান

git submodule update --rebase --remote

প্রতিটি সাবমোডিয়ুলের উপরের দিক থেকে সর্বশেষ পরিবর্তনগুলি এনেছে, সেগুলি পুনর্বাসিত করবে এবং সাবমডিউলের সর্বশেষ সংশোধন পরীক্ষা করবে। ডকুমেন্টেশন যেমন রাখে:

--remote

এই বিকল্পটি শুধুমাত্র আপডেট আদেশের জন্য বৈধ। সাবমডিউলটি আপডেট করার জন্য সুপারপ্রজেক্টের রেকর্ড করা SHA-1 ব্যবহার না করে সাবমডিউলের দূরবর্তী ট্র্যাকিং শাখার স্থিতি ব্যবহার করুন।

এটি git pullপ্রতিটি সাবমোডিয়ুলে চলার সমতুল্য , যা সাধারণত আপনি চান ঠিক তেমন হয়।

(এটি এই উত্তর থেকে অনুলিপি করা হয়েছিল ।)


যদি আপনি কোনও পুরানো প্রশ্নের উত্তর দেওয়ার সিদ্ধান্ত নিয়ে থাকেন যা ভালভাবে প্রতিষ্ঠিত হয়েছে এবং সঠিক উত্তর দিয়েছে, দিনের শেষ দিকে একটি নতুন উত্তর যুক্ত করা আপনার কোনও কৃতিত্ব নাও পেতে পারে। আপনার যদি কিছু স্বতন্ত্র নতুন তথ্য থাকে, বা আপনি নিশ্চিত হন যে অন্য উত্তরগুলি সবই ভুল, তবে একটি নতুন উত্তর যুক্ত করুন, তবে 'আরও একটি উত্তর' প্রশ্নটি জিজ্ঞাসিত হওয়ার দীর্ঘ সময় পরে একই মৌলিক তথ্য প্রদান করে ' আপনি অনেক ক্রেডিট অর্জন করবেন না। এটি কী করে তার কোনও ব্যাখ্যা নেই - বাহ্যিক ডকুমেন্টেশনের লিঙ্কও নয় (যা যথেষ্ট হবে না)।
জোনাথন লেফলার 21

2
এটি "আরও একটি উত্তর" নয়, কারণ অন্য কোনও উত্তরের এই আদেশ নেই (আমাকে ভুল প্রমাণ করুন)। অন্যান্য উত্তরগুলি আমার পক্ষে কাজ করে নি, এই মন্তব্যটি করেছে, তাই মূল মালিককে creditণ দেওয়ার সময় আমি উত্তর হিসাবে পোস্ট করার সিদ্ধান্ত নিয়েছি। সুতরাং আপনার ডাউনটোট অপসারণ বিবেচনা করুন।
Iulian Onofrei

একটা ব্যাপার মন্তব্য দ্বারা MindTooth 2015 থেকে বলছে এই কি তারা এখন কি হয়। এটি কী করে সে সম্পর্কে আপনি কোনও ব্যাখ্যা দেন না (যদিও আপনি মাইন্ডথুথের কথা উল্লেখ করেছেন, তবে সেই URL- এর এমবেডিং দ্বারা আপনি কী বোঝাতে চাইছেন তার কোনও সত্য ব্যাখ্যা নেই, যেমন এই মন্তব্যে সহায়তা করবে)। আপনি এটি বলবেন না কেন এটি একটি ভাল ধারণা। আপনি কোন সতর্কতা প্রদান করবেন না। এটি আমার দৃষ্টিতে সহায়ক সহায়ক নয় কারণ এটি সমাধানের চেয়ে আরও বেশি প্রশ্ন উত্থাপন করে।
জোনাথন লেফলার

1
এর মাধ্যমে, আমি বোঝাতে চাইছি এটি কাজ না করে পরিবর্তে কাজ করে। বিশ্বাস করুন, যদি আরও লোক এই উত্তরটি দেখতে পান তবে তারা খুশি হবেন, কারণ এটি কার্যকর । এই জাতীয় জিনিসের জন্য, বেশিরভাগ লোকেরা কমান্ডটি জানতে চায় যা একটি গিট সাবমডিউল আপডেট করে, কীভাবে এটি প্রয়োগ করা হয় না।
Iulian Onofrei

আমি আপনাকে ভুল প্রমাণ করার জন্য উত্তর সম্পাদনা করেছি, এছাড়াও, stackoverflow.com/questions/1979167/git-submodule-update/… !!!
Iulian Onofrei
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.