আমি কীভাবে আমার পরিবর্তনগুলি গিট সাবমোডিয়ালে ফিরিয়ে আনব?


268

আমার একটি গিট সাবমডিউল (রেস্টকিট) রয়েছে যা আমি আমার রেপোতে যুক্ত করেছি।

আমি দুর্ঘটনাক্রমে সেখানে কিছু ফাইল পরিবর্তন করেছি এবং আমি উত্স সংস্করণে ফিরে যেতে চাই। এটি করার জন্য, আমি চালানোর চেষ্টা করেছি

Mac:app-ios user$ git submodule update RestKit

তবে আপনি এখানে দেখতে পাচ্ছেন, এটি এখনও "সংশোধিত সামগ্রী" হিসাবে কাজ করে নি:

Mac:app-ios user$ git status
...
#   modified:   RestKit (modified content)

এমন কি

Mac:app-ios user$ git submodule update -f RestKit 

স্থানীয়ভাবে পরিবর্তিত ফাইলগুলিকে ফিরিয়ে দেয় না।
আমি কীভাবে সেই সাবমডিউলের সামগ্রী পুনরায় সেট করব?


যদি git reset --hardকাজ না করে তবে প্রথমে রিমোট শাখাটি নির্দিষ্ট করার চেষ্টা করুন git reset --hard origin/<branch_name>
জেরি কে।

উত্তর:


208

সাবমডিউলের ডিরেক্টরিতে সরান, তারপরে git reset --hardসমস্ত সংশোধিত ফাইল তাদের শেষ প্রতিশ্রুতিবদ্ধ অবস্থানে পুনরায় সেট করতে একটি করুন । সচেতন হন যে এটি সমস্ত অ-প্রতিশ্রুতিবদ্ধ পরিবর্তনগুলি বাতিল করবে।


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

16
git submodule update --initআমার জন্য কাজ করেছেন; এটি ছাড়া --initমোটেও কার্যকর হয়নি।
প্রতি লন্ডবার্গ

চমত্কার !! যেখানে আমি এটি আমদানি করেছি তার একটি রেপোতে আমি সাবমডিউলে পরিবর্তন করেছি। অ্যান্ডিস এটির যা যা হওয়ার কথা ছিল তা ফিরিয়ে দিয়েছে।
নোটিডার্ট

2
পুনরায় সেট করুন - আমার পক্ষে কাজ করেনি, স্থানীয় পরিবর্তনের কারণে আমার সাবমডিউলটি এখনও ডিনিট করা যায়নি।
ম্যালহাল

33
git submodule update -f --initআমার মামলার জন্য @ চিহ্নশিজ ছাড়াও
otiai10

279

আপনি যদি ডিরেক্টরিগুলি পরিবর্তন না করেই সমস্ত সাবমোডিয়ুলের জন্য এটি করতে চান তবে আপনি সঞ্চালন করতে পারেন

git submodule foreach git reset --hard

আপনি সমস্ত সাবমডিউলগুলিতে প্রয়োগ করতে পুনরাবৃত্ত পতাকাটি ব্যবহার করতে পারেন:

git submodule foreach --recursive git reset --hard


7
এটি প্রতিটি সাবমডিউল ডিরেক্টরিতে সিডি করার চেষ্টা করার চেয়ে অটোমেশনের জন্য এত বেশি ভাল কাজ করে।
ট্র্যাভিস ক্যাস্তিলো

4
নোট করুন যে git submodule foreach --recursive git clean -x -f -d
আপনিও

1
আমার মেশিনে (উইন্ডোজ গিট ২.২২.০ ব্যবহার করে) --আরসিভারসিভ পতাকা ব্যবহার করার সময় আমার দ্বিতীয় গিট কমান্ডের চারপাশে একক উদ্ধৃতি প্রয়োজন বা এটি কাজ করবে না: গিট সাবমডিউল ফোর্যাচ - রিসার্চ 'গিট ক্লিন -x -f -d'
aatwo

196

পূর্ববর্তী সমস্ত উত্তরের চেয়ে আরও ব্যর্থ-নিরাপদ পদ্ধতি:

git submodule deinit -f .
git submodule update --init

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


1
আফসোসভাবে এটি আমার ক্ষেত্রে কার্যকর হয়নি (গিট সাবমডিউলে পরিবর্তিত স্থানীয় ফাইলগুলির সাথে), "আপডেট - ইনিট" কমান্ডটি error: Your local changes to the following files would be overwritten by checkout
স্প্রে করেছে

আপডেটের নির্দিষ্ট submodule করতে: $ Git submodule deinit -f - <submodule_path> এবং তারপর $ Git submodule আপডেট --init - <submodule_path>
Priyank

আমি এটির না হওয়া পর্যন্ত আমি উপরের সমস্ত পদ্ধতি চেষ্টা করেছি। আমার জন্য, এই মাত্র একটা যে আমার Git "পরিষ্কার" বের হয়ে পড়লেন পথ আছে (ছাড়া *আমার PS1যে git status -unoব্যাখ্যা করতে পারেনি)।
গাই র্যাপারপোর্ট

60

আমার জন্য ভাল

git reset --hard

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

git submodule update --init

তারপরে আমি যখন করি তখন git statusএটি সাবমডিউলে পরিষ্কার।


দুর্ভাগ্যক্রমে submodule update --initআমার ক্ষেত্রে স্থানীয় পরিবর্তনগুলি যেভাবেই হোক না কেন প্রত্যাশা: |
রজারডপ্যাক

48

4 টি ধাপ ক্রমিক করুন:

git submodule foreach git reset --hard HEAD
git submodule update
git submodule foreach "git checkout master; git pull"
git submodule foreach git clean -f

2
একমাত্র তিনিই আমাকে সহায়তা করেছিলেন।
ভিক্টর সার্জিইঙ্কো

প্রশ্ন, সাবমডিউলটি নতুন হলে, ডিরেক্টরিটির ভিতরে একটি .git ফাইল থাকবে না, তাই না? গিট কমান্ড পিতামাতার রেপোতে বুদবুদ দেবে?
সান্টিয়াগো আরিজিটি

1
@ জিয়াহুত এমনকি এটি করার পরেও আমার পিতামাতার কাছ থেকে 'গিট স্ট্যাটাস' করার সময় আমার সাবমডিউলের পাশে "(নতুন কমিটস") রয়েছে?
ডেভিড ডরিয়া

1
@ ডেভিডডোরিয়া আমার জন্য git submodule updateএটি স্থির করেছিল (new commits)
ubershmekel

31

এটি আমার জন্য কাজ করেছে, বার বার সাবমডিউলগুলিতে অন্তর্ভুক্ত করা (সম্ভবত সে কারণেই আপনার -f কাজ করেনি, কারণ আপনি সাবমডিউলের অভ্যন্তরে একটি সাবমডিউল পরিবর্তন করেছেন):

git submodule update -f --recursive

11

প্রথমে এটি চেষ্টা করুন, যেমন অন্যরা বলেছেন:

git submodule update --init

যদি এটি কাজ না করে তবে সাবমডিউল ডিরেক্টরিতে পরিবর্তন করুন এবং সাবমডিউলে কোনও পরিবর্তন আছে কিনা তা দেখার জন্য নিম্নলিখিত কমান্ডটি ব্যবহার করুন:

git status

যদি আপনার সাবমডিউলে পরিবর্তন হয় তবে সেগুলি থেকে মুক্তি পান। "গিট স্ট্যাটাস" চালানোর সময় আপনি কোনও পরিবর্তন দেখতে পাবেন না তা যাচাই করুন।

এরপরে, মূল সংগ্রহস্থলটিতে ফিরে যান এবং আবার "গিট সাবমডিউল আপডেট --init" চালান।


9

গিট 2.14 (কিউ 3 2017) থেকে, আপনাকে একটি git reset(যেমন হিসাবে git submodule foreach git reset --hard) করতে প্রতিটি উপ-অনুচ্ছেদে যেতে হবে না

এর কারণ গিট রিসেট নিজেই এখন জানে কীভাবে পুনরাবৃত্তভাবে সাবমডিউলে যেতে হয়।

দেখুন কমিট 35b96d1 (21 এপ্রিল 2017), এবং f2d4899 কমিট , 823bab0 কমিট , cd279e2 কমিট দ্বারা (18 এপ্রিল 2017) স্টিফান Beller ( stefanbeller)
(দ্বারা একীভূত junio সি Hamano - gitster- মধ্যে 5f074ca কমিট , 29 মে 2017)

বিল্টিন / রিসেট: --recurse-submodules স্যুইচ করুন

git-reset এটি আর একটি কার্যকরী ট্রি ম্যানিপুলেটর, যা সাবমডিউলগুলি সম্পর্কে শেখানো উচিত।

যখন কোনও ব্যবহারকারী গিট-রিসেট ব্যবহার করে এবং সাবমোডিয়ুলগুলিতে পুনরাবৃত্তি করার জন্য অনুরোধ করে, তখন এটি সাবমোডিয়ালগুলিকে সুপারপ্রজেক্টে রেকর্ডকৃত অবজেক্ট নামটিতে পুনরায় সেট করে, হেডগুলি পৃথক করে।

সতর্কতা : এর মধ্যে পার্থক্য:

  • git reset --hard --recurse-submodule এবং
  • git submodule foreach git reset --hard

এটি হ'ল প্রাক্তনটি আপনার প্রধান পিতামাতার রেপো ওয়ার্কিং ট্রিটিকেও পুনরায় সেট করবে, কারণ পরবর্তীকালে কেবলমাত্র সাবমডিউলগুলি কার্যকারী গাছকে পুনরায় সেট করবে।
তাই সাবধানতার সাথে ব্যবহার করুন।


7

গিটের জন্য <= 2.13 এই দুটি কমান্ডের সম্মিলন করা উচিত আপনার পুনরাবৃত্ত সাব-মডিউলগুলির সাথে পুনরায় সেট করতে হবে:

git submodule foreach --recursive git reset --hard
git submodule update --recursive --init

3

এটি আমাদের লাইব্রেরিগুলি GIT v1.7.1 চলমান সাথে কাজ করে, যেখানে আমাদের একটি ডিইভি প্যাকেজ রেপো এবং লাইভ প্যাকেজ রেপো রয়েছে। নিজস্ব সংগ্রহস্থলগুলি কোনও প্রকল্পের জন্য সম্পত্তি প্যাকেজ করার জন্য খোল ছাড়া কিছুই নয়। সমস্ত submodule।

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

ডিইভি-তে প্যাকেজ সংগ্রহস্থল

এখানে আমরা সমস্ত প্রবাহের পরিবর্তনগুলি টানতে চাই যা আমরা এখনও অবগত নই, তারপরে আমরা আমাদের প্যাকেজ সংগ্রহস্থলটি আপডেট করব।

# Recursively reset to the last HEAD
git submodule foreach --recursive git reset --hard

# Recursively cleanup all files and directories
git submodule foreach --recursive git clean -fd

# Recursively pull the upstream master
git submodule foreach --recursive git pull origin master

# Add / Commit / Push all updates to the package repo
git add .
git commit -m "Updates submodules"
git push   

লাইভে প্যাকেজ সংগ্রহস্থল

এখানে আমরা DEV সংগ্রহস্থলে প্রতিশ্রুতিবদ্ধ পরিবর্তনগুলি টানতে চাই, তবে প্রবাহের অজানা পরিবর্তনগুলি নয়।

# Pull changes
git pull

# Pull status (this is required for the submodule update to work)
git status

# Initialize / Update 
git submodule update --init --recursive

2

আপনি যদি সাব মডিউলগুলির সাথে পুরো সংগ্রহস্থলের সমস্ত পরিবর্তন বাতিল করতে চান তবে আপনি এটি ব্যবহার করতে পারেন

git restore . --recurse-submodules

এটি সংগ্রহস্থল এবং উপ-মডিউলগুলিতে করা সমস্ত পরিবর্তন পূর্বাবস্থায় ফিরিয়ে আনবে।


0

সমস্ত সাবমোডিয়ুল পুনরায় সেট করার জন্য আমার উপায় (তাদের "মাস্টার" শাখা বিচ্ছিন্ন করে রাখার পরে):

গিট সাবমডিউল ফোরাচ 'গিট চেকআউট মাস্টার && গিট রিসেট --হরড $ শ'

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.