কীভাবে একটি গিট সাবমডিউল পয়েন্টারটি ধারণকৃত ভাণ্ডারগুলিতে সঞ্চিত প্রতিশ্রুতিতে ফেরানো যায়?


128

আমার প্রধান গিট রেপোতে আমার গিট সাবমডিউল রয়েছে। আমি এটি বুঝতে পেরে, প্রধান রেপো একটি SHA মান (কোথাও ...) সঞ্চয় করে, সাবমডিউলের নির্দিষ্ট প্রতিশ্রুতিটির দিকে ইঙ্গিত করে যে এটি "লিঙ্কযুক্ত"।

আমি আমার সাবমডিউলে গিয়ে টাইপ করেছি git checkout some_other_branch। আমি কোন প্রতিশ্রুতি থেকে এসেছি জানি না।

আমি সেই পয়েন্টারটি ফিরিয়ে দিতে চাই যাতে মূল রেপো এবং সাবমডিউলটি আবার সিঙ্ক হয়।

আমার প্রথম (সম্ভবত নিষ্পাপ) প্রবৃত্তিটি বলতে হয়েছিল git reset --hard- যা মনে হয় অন্য সব কিছুর জন্য কাজ করে। আমার অবাক করার বিষয়, এটি এই দৃশ্যের জন্য কার্যকর হয়নি।

সুতরাং আমি বুঝতে পেরেছি যে আমি টাইপ করতে পারি git diff, SHA আইডি নোট করুন যা সাবমোডিয়াল পয়েন্টারটি ব্যবহার করত, এবং তারপরে সাবমোডিয়ালে intoুকুন এবং git checkout [SHA ID]... তবে অবশ্যই আরও সহজ উপায় থাকতে হবে?

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

উত্তর:


167

আপনি আপনার সাবমোডিয়ুলটি আপডেট করতে চান যাতে এটি প্যারেন্ট রিপোজিটরির বিশ্বাস করে যা এটি হওয়া উচিত with আপডেট কমান্ড এটির জন্য:

সাবমডিউল ম্যানপেজ থেকে:

নিবন্ধিত সাবমোডিয়ুলগুলি আপডেট করুন, অর্থাৎ ক্লোন অনুপস্থিত সাবমডিউলগুলি এবং
অন্তর্ভুক্তের সূচকে সুনির্দিষ্ট প্রতিশ্রুতি চেকআউট করুন
সংগ্রহস্থল। এটি সাব-মডিউলগুলি হেডকে আলাদা করে দেবে যদি না
--rebase বা - विसর নির্দিষ্ট করা আছে বা কী সাবমডিউল $ name.update
পুনর্বাসনা বা একত্রীকরণে সেট করা আছে।

এটি চালান এবং সমস্ত ভাল হওয়া উচিত:

git submodule update

4
একরকম, আমার জন্য আমার যুক্ত করা দরকার --init। তা ছাড়া, submodules সঙ্গে অবস্থায় থাকবে (new commits)। যদিও আমার সাবমডিউলগুলি ইতিমধ্যে সূচনা করা হয়েছিল।
অ্যাম্বিডেক্স

@ এম্বেডেক্স হ্যাঁ --initএই সমস্ত ক্ষেত্রে বিকল্পটি গুরুত্বপূর্ণ। আমার সাবমোডিয়ালগুলি https- তে ক্লোন করা হওয়ার কারণে আমি ব্যবহারকারীর নাম এবং পাসওয়ার্ডের জন্য অনুরোধ জানানো হয়েছিল। আমি উভয় ফোল্ডারে andুকে sshচেকআউটের জন্য প্রোটোকলটি ব্যবহার করতে রিমোটগুলি সেট করেছি ।
এ-ডাব


- সংশোধন যোগ করতে পারেন যাতে আপনাকে সমস্ত
সাবমডিউলে

21

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

অথবা, আপনি যদি চান সাবডমডিউলটি সংস্করণে শীর্ষস্থানীয় রেপোতে নির্দেশিত হয়, তা করুন git submodule update --recursive। যোগ --initযদি আপনি শুধু ক্লোন গেছেন।

এছাড়াও, git submoduleসাবমডিউল কমান্ড ব্যতীত আপনাকে যে প্রতিশ্রুতি দেখানো হয়েছে তা প্রদর্শন করবে। কমিটের সামনে যদি এটি সিঙ্ক না হয় তবে একটি - বা একটি + থাকবে।

আপনি যদি একটি সাবমডিউলযুক্ত একটি গাছের দিকে তাকান, আপনি দেখতে পাবেন যে সাবমোডুলটি commitব্লব বা গাছের মতো বাকীগুলির বিপরীতে চিহ্নিত হয়েছে ।

একটি নির্দিষ্ট প্রতিশ্রুতিগুলি আপনি কী করতে পারেন তা সাবমোডিয়ুলগুলিকে বোঝায়:

git ls-tree <some sha1, or branch, etc> Submodule/path

এরপরে আপনি লগ ইত্যাদি পাস করে কমিট বা অন্য যে কোনও কিছু দেখতে পাচ্ছেন ( git-dirগিট কমান্ড স্তরের বিকল্পটি আপনাকে সাবমডিউলে সিডি করতে ছাড়তে অনুমতি দেয়):

git --git-dir=Submodule/path log -1 $(<the above statement>)

নীচের কমান্ডটি আমাকে সহায়তা করেছিল (আমি সাবমডিউল এবং আমার মডিউলটিতেও যে কোনও পরিবর্তন উপেক্ষা করতে চেয়েছিলাম): গিট সাবমডিউল আপডেট --init
রাজেশ গোয়েল

6

আমি যে অন্যটি ক্ষেত্রে কেবল দৌড়ে এসেছি তা হ'ল যদি আপনি যে সাবমডিউলে কোনও বাতিল বা পরিবর্তন পরিবর্তন করতে চান যা আপনি বাতিল করতে চান। গিট সাবমডিউল আপডেট সেই পরিবর্তনটি সরাবে না, বা পিতামহিত ডিরেক্টরিতে গিটটি পুনরায় সেট করবে না hard আপনাকে সাবমডিউল ডিরেক্টরিতে যেতে হবে এবং গিট রিসেট করতে হবে --হার্ড। সুতরাং আমি যদি আমার পিতা বা মাতা এবং সাবমডিউল উভয় ক্ষেত্রেই অবিরত পরিবর্তনগুলি সম্পূর্ণরূপে বাতিল করতে চাই তবে আমি নিম্নলিখিতটি করি:

পিতামাতায়:

git reset --hard

git submodule update

সাবমডিউলে:

git reset --hard

5

git ls-tree HEAD"সাবপ্রজেক্ট" ফোল্ডারে আপনার সাবমডিউলটি মূলত কী প্রতিশ্রুতিবদ্ধ ছিল তা দেখতে ব্যবহার করুন । তারপরে সাবমডিউল ডিরেক্টরিতে পরিবর্তন করুন এবং মূল কমিটটি git log --oneline --decorateকী শাখায় রয়েছে তা দেখতে ব্যবহার করুন। অবশেষে git checkout original-commit-branch,।

আমি যে কয়েকটি পরীক্ষা ডিরেক্টরি সেট আপ করেছি তা ব্যবহার করে, কমান্ডগুলি দেখতে কেমন হতে পারে তা এখানে:

$ git --version
git version 1.7.4.1
$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   sm2 (new commits)
#
no changes added to commit (use "git add" and/or "git commit -a")
$ git ls-tree HEAD
100644 blob 76813a07ae558db274cefc6d903ec24323fdeb0d    .gitmodules
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391    main
160000 commit 7c5889497938cd5699a9234a98ee93947e52b1ed  sm1
160000 commit f68bed61cba6f94cef57554f2cf46a45a4a0d337  sm2
$ cd sm2
$ git log --oneline --decorate
5b8d48f (HEAD, foo1) foo1.1
f68bed6 (origin/master, origin/HEAD, master) Initial commit.
$ git checkout master
Switched to branch 'master'
$ cd ..
$ git status
# On branch master
nothing to commit (working directory clean)

"Superproject" শো sm2 submodule কমিট f68bed6কিন্তু sm2 এ মাথা রয়েছে 5b8d48f। সাবমডিউল কমিটটির f68bed6উপর তিনটি শাখা রয়েছে যা সাবমডিউল ডিরেক্টরিতে চেকআউটের জন্য ব্যবহৃত হতে পারে।


ধন্যবাদ ড্যান, পারফেক্টো!
আলেক

3

এখানে উত্তরটি কোনওভাবেই সাবমডিউলের সাথে আমার নির্দিষ্ট সমস্যাটি সমাধান করতে পারেনি যদি এটি আপনার ক্ষেত্রে ঘটে তবে নিম্নলিখিত চেষ্টা করুন ...

 git submodule foreach git reset --hard

https://kalyanchakravarthy.net/blog/git-discard-submodule-changes/


1
সুন্দর ওয়ান লাইনার!
user8162

1

আমি সাব-মডিউল এবং আমার মডিউলেও যে কোনও পরিবর্তন উপেক্ষা করতে চেয়েছি

নীচের আদেশটি আমাকে সহায়তা করেছে:

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