সর্বশেষ প্রতিশ্রুতিতে একটি সাব মড্যুল আপডেট করুন


269

আমার একটি প্রকল্প এ রয়েছে যা একটি গ্রন্থাগার এবং এটি বি প্রকল্পে ব্যবহৃত হয়

এ এবং বি উভয় প্রকল্পের বিথের ভিতরে গিথুব বিটি-তে একটি পৃথক ভান্ডার রয়েছে যা আমাদের কাছে এ এর ​​একটি উপশক্তি রয়েছে have

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

এই আপডেটগুলি "রেফারেন্স" (সাবমডিউল) এর প্রতিফলন করে না সাবমডিউলটি পূর্ববর্তী প্রতিশ্রুতি বোঝায় .... গিটে সাবমোডুল আপডেট করার জন্য আমার কী করা উচিত?

উত্তর:


358

সাবমডিউল ডিরেক্টরি লিখুন:

cd projB/projA

আপনার প্রকল্প এ থেকে রেপোটি টানুন ( আপনার প্যারেন্ট, বি প্রকল্পের গিটারের অবস্থা আপডেট করবেন না ):

git pull origin master

রুট ডিরেক্টরিতে ফিরে যান এবং আপডেট পরীক্ষা করুন:

cd ..
git status

সাবমডিউলটি আগে আপডেট হলে এটি নীচের মতো কিছু প্রদর্শন করবে:

# Not currently on any branch.
# Changed but not updated:
#   (use "git add ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#
#       modified:   projB/projA (new commits)
#

তারপরে, আপডেটটি প্রতিশ্রুতিবদ্ধ করুন:

git add projB/projA
git commit -m "projA submodule updated"

হালনাগাদ

@ পল যেমন উল্লেখ করেছেন, যেহেতু গিট 1.8, আমরা ব্যবহার করতে পারি

git submodule update --remote --merge

সর্বশেষতম দূরবর্তী প্রতিশ্রুতি সাবমোডুল আপডেট। এটি বেশিরভাগ ক্ষেত্রে সুবিধাজনক হবে।


35
বিটিডাব্লু, আপনি যদি git submodule updateসাবমডিউলের মালিক না হন তবে অন্য কেউ প্রজাকে আপডেট করার সময় আপনি কেবলমাত্র এটি করতে পারেন (আপনি একটি নতুন কমিট আইডি পাবেন)।
Kjuly

আমি সাবমডিউলের প্রধান রেপো (প্রজ এ) এর মালিক কিন্তু আমি প্রজ বিতে প্রতিশ্রুতিবদ্ধ
ফ্যাট

@ কিজলি প্রতিশ্রুতি দেওয়ার পরে, কীভাবে কেউ এটি দূরবর্তী স্থানে ঠেলে দেয়? এটা কি ঠিক git push?
কেআর 29

1
@ কেআর 29 ঠিক আছে, এবং সম্পূর্ণ সিএমডি হ'ল git push <remote> <branch>উদাঃ git push origin dev
কুজলি

2
git submodule updateশুধুমাত্র পতাকা ব্যতীত কাজ করে যখন কোনও প্রতিশ্রুতি টানা হয় (প্রজ বি তে) যা প্রশ্নোত্তর সাব-মডিউলগুলিতে রেফগুলি আপডেট করে (প্রজ এ)। প্রজ এ HEADএর জন্য দূরবর্তী ট্র্যাকিং শাখার উল্লেখের জন্য প্রোজ বি আপডেট করতে , আপনি git submodule update --remote --mergeনীচে পল হ্যাচারের উত্তরে দেখানো মতো করতে চাইবেন ।
বেন বার্নস

108

গিট 1.8 যেহেতু আপনি করতে পারেন

git submodule update --remote --merge

এটি সাবমোডুলটিকে সর্বশেষতম দূরবর্তী প্রতিশ্রুতিতে আপডেট করবে। তারপরে আপনাকে পরিবর্তনটি করতে হবে যাতে পিতা-মাতৃ সংগ্রহস্থলের গিটলিংক আপডেট হয়

git commit

এবং তারপরে পরিবর্তনগুলি এটিকে হিসাবে চাপ দিন, এসএইচএ -১ পরিচয়টি সাবমোডিয়ুলের দিকে নির্দেশিত আপডেট হবে না এবং তাই পরিবর্তন অন্য কারও কাছে দৃশ্যমান হবে না।


যদিও আমি git commitঅন্য সবাই এটি এখনও দেখছি না। On branch master Your branch is up-to-date with 'origin/master'. Changes not staged for commit: modified: SubmoduleA (new commits) modified: SubmoduleB (new commits)
সর্বাধিক এন

1
আপনার প্রতিশ্রুতিবদ্ধ হওয়ার পরে কি আপনি "গিট পুশ" করেছেন, মনে রাখবেন প্রতিশ্রুতিবদ্ধভাবে কেবল আপনার স্থানীয় ভান্ডার বদল করে, আপনি প্রত্যেকে প্রত্যেকে এটি দেখতে পাবে
পল হ্যাচার

এই উত্তরটি থেকে অনুপস্থিত (তবে নীচে অন্যান্য উত্তরে উল্লেখ করা হয়েছে): প্রতিশ্রুতি দেওয়ার আগে আপডেট করা সাবমডিউলটি পর্যায়ক্রমে করা উচিত git add
জোশং

1
@ জোশং আমি অনুভব করি যে তারা যারা সাবমোডিয়ুলগুলিতে কাজ করছে সেই স্থানে যে কেউ আছেন তারা বুঝতে পারবেন। এটিই একমাত্র পোস্ট যা আমাকে সাহায্য করেছিল, অনেক ধন্যবাদ।
ভুট্টো রেকমস

38

যদি আপনি কোনও উপ-মডেল আপডেট করেন এবং এটিতে প্রতিশ্রুতিবদ্ধ হন তবে আপনাকে ধারণকারী, বা উচ্চ স্তরের রেপোতে যেতে হবে এবং সেখানে পরিবর্তন যুক্ত করতে হবে।

git status

এর মতো কিছু দেখাবে:

modified:
   some/path/to/your/submodule

সাবমডিউলটি সিঙ্কের বাইরে চলে আসার বিষয়টিও দেখা যায়

git submodule

আউটপুট প্রদর্শিত হবে:

+afafaffa232452362634243523 some/path/to/your/submodule

প্লাসটি নির্দেশ করে যে আপনার সাবমোডিউলটি শীর্ষ রেপো যেখানে এটির দিকে প্রত্যাশা করে তার আগেই নির্দেশ করছে।

কেবল এই পরিবর্তনটি যুক্ত করুন:

git add some/path/to/your/submodule

এবং এটি প্রতিশ্রুতিবদ্ধ:

git commit -m "referenced newer version of my submodule"

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

git submodule update

সাবমডিউলগুলি সম্পর্কে আরও তথ্য এখানে পাওয়া যাবে http://progit.org/book/ch6-6.html


আপনি +যখন দৌড়ানোর সময় যদি কিছু না দেখেন তবে git submoduleনিশ্চিত হয়ে নিন যে আপনি সাবমোডিয়ালগুলি আরম্ভ করেছেন এবং আমদানি করেছেন। এর জন্য আদেশগুলি যথাক্রমে git submodule initএবং git submodule update
fureigh


2

অন্যান্য উত্তরগুলির মধ্যে কয়েকটি সাবমোডুলের ডিরেক্টরিতে অন্তর্নিহিত / প্রতিশ্রুতি দেওয়ার প্রস্তাব দেয় যা আইএমও কিছুটা অগোছালো হয়ে যেতে পারে।

রিমোট সার্ভারটির নাম দেওয়া হয়েছে originএবং আমরা masterসাব-মডিউল (গুলি) এর শাখা চাই বলে আমি মনে করি:

git submodule foreach "git fetch && git reset --hard origin/master"

দ্রষ্টব্য: এই প্রতিটি submodule উপর একটি হার্ড রিসেট হবে - যদি এই না চান, তবে আপনি পরিবর্তন করতে পারেন --hardথেকে --soft


1

আমার প্রকল্পটির সাবমডিউলের জন্য 'সর্বশেষ' ব্যবহার করা উচিত। ম্যাক ওএসএক্স 10.11, গিট সংস্করণ ২..1.১ এ, আমার সাবমোডিয়াল ফোল্ডারটির কমিটগুলি সংগ্রহ করার জন্য আমাকে 'intoোকা' দেওয়ার দরকার পড়েনি। আমি কেবল একটি নিয়মিত করেছি

git pull --rebase 

শীর্ষ স্তরে এবং এটি সঠিকভাবে আমার সাবমডিউলটিকে আপডেট করেছে।


0

অ্যান্ডির প্রতিক্রিয়া $ পথে পালিয়ে আমার পক্ষে কাজ করেছিল:

git submodule foreach "(git checkout master; git pull; cd ..; git add \$path; git commit -m 'Submodule Sync')"

@ অ্যান্ডি ওয়েবভের উত্তর থেকে পালানোর প্রয়োজন না হওয়ার সম্ভবত কারণ হ'ল তারা পথের চারপাশে একক উদ্ধৃতি ব্যবহার করেছেন, যেমন। '$path'
এস 0 এন্ড এস 0
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.