গিট সংগ্রহস্থলের সাবমডিউলগুলি তালিকাভুক্ত করুন


246

আমার একটি গিট সংগ্রহস্থল রয়েছে যার বেশ কয়েকটি সাবমডিউল রয়েছে। git submodule initচালানোর পরে আমি কীভাবে সমস্ত সাবমোডিয়ুলের নাম তালিকাভুক্ত করব ?

git submodule foreachকমান্ড submodule নাম echo পারে, কিন্তু যে শুধুমাত্র একবার তারা চেক আউট করা হয়েছে যা Init পদক্ষেপ পর ঘটেনি কাজ করে। চেইনে আরও কয়েকটি পদক্ষেপ রয়েছে যাগুলি চেক আউট করার আগে ঘটতে হবে এবং আমি স্ক্রিপ্টে সাবমোডিয়ুলের হার্ড-ওয়্যার নামগুলি নিতে চাই না।

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


4
দুর্দান্ত মূর্খতা যে এটি না, তবে সন্দীপের জবাবটি দেখায় যে git submoduleআমি অনুমানের মতো git submodule listআচরণ করার প্রত্যাশা করতাম - আমি কখনই কোন তর্ক ছাড়াই কী ঘটে যায় তা যাচাই করার চিন্তা করিনি git submodule। (আনন্দিত আমি, যে লিঙ্কটি পরীক্ষা যেহেতু আমি প্রথমে ভুল 'ভাগ করুন' লিঙ্কে ধরলাম!)
ঋষি

4
আমি এখানে এসেছি কারণ git submodule listউপস্থিত ছিল না এবং git submodule helpসাহায্য করেনি (উত্তর অনুসারে, সমাধানটি, git submoduleবৈধ ব্যবহার নয়)।
ব্যবহারকারী 2394284

বেশিরভাগ উত্তর (স্বীকৃত এক সহ) সাবডমডিউলটি তালিকাভুক্ত করে paths, না namesএবং বিরতিতে যখন তাদের মধ্যে বিশেষ অক্ষর থাকে। আমি দুটি নাম এবং পাথের জন্য একটি উত্তর দেওয়ার চেষ্টা করেছি যা নিরাপদ হওয়া উচিত: stackoverflow.com/a/56912913/3215929
এন্টে

উত্তর:


175

আপনি একই প্রক্রিয়া ব্যবহার করতে পারে git submodule initব্যবহারসমূহ নিজেই, যথা, তাকান .gitmodules। এই ফাইলগুলি প্রতিটি উপ-মডেল পাথ এবং এটির URL উল্লেখ করে en

উদাহরণস্বরূপ, সংগ্রহস্থলের মূল থেকে, cat .gitmodulesস্ক্রিনে সামগ্রীগুলি মুদ্রণ করা হবে (ধরে নিবেন যে আপনার কাছে রয়েছে cat)।

.Gitmodule ফাইলগুলিতে গিট কনফিগারেশন ফর্ম্যাট রয়েছে বলে আপনি এই ফাইলগুলি বিশ্লেষণ করতে গিট কনফিগারেশন ব্যবহার করতে পারেন:

git config --file .gitmodules --name-only --get-regexp path

আপনাকে সমস্ত সাব-মডিউল এন্ট্রি এবং সহ প্রদর্শন করবে

git config --file .gitmodules --get-regexp path | awk '{ print $2 }'

আপনি কেবল পঠনপথের পথটি পেয়ে যাবেন।


তবে এটি কনসোলে কিছু মুদ্রণ করে না।
ইগোরগানাপলস্কি

2
@ ইগোরগানাপলস্কি - আপনি যদি কনপোলটি মুদ্রণ করতে পারেন, আপনি যদি cat .gitmodulesসংগ্রহস্থলের
মূলটিতে করেন

awkঅংশ ব্যর্থ যদি আপনি submodule পথে শূণ্যস্থান আছে।
মাইকেল 1

@ ইক্কে আমি নাম, পথ এবং url সহ সাবমডিউলগুলির একটি তালিকা পুনরুদ্ধার করতে চাই। আমি নীচের গিট কমান্ডটি চেষ্টা করেছি, তবে এটি কিছুই ফেরায় না: git config --file = .gitmodules --get-regexp। *? Submodule (। *)] Path = (। *) Url = (। *) I git config --file = .gitmodules --get-regexp। *? (submodule)। *? (पथ)। *? (url) চেষ্টা করে দেখুন। সম্ভবত আপনি একটি সমাধান আছে। তুমাকে অগ্রিম ধন্যবাদ.
ওদরাই

8
সতর্কতা: awkস্পেস সহ সাবমডিউলগুলির জন্য ব্যর্থ! কমান্ডটি পড়তে হবে git config -z --file .gitmodules --get-regexp '\.path$' | sed -nz 's/^[^\n]*\n//p' | tr '\0' '\n'(আপনার sedসাথে একটি আধুনিক প্রয়োজন -z)। এটি তাদের মধ্যে নিউলাইনগুলির সাথে পাথগুলি ব্যর্থ করে (সেগুলি দিয়ে তৈরি করা যেতে পারে git mv)। আপনি যদি এগুলির বিরুদ্ধে সুরক্ষিত থাকতে চান তবে এটিকে ছেড়ে যান | tr '\0' '\n'এবং ... | while IFS='' read -d '' path; do ...ব্যাশের সাথে আরও প্রক্রিয়াজাতকরণের মতো কিছু ব্যবহার করুন । এর জন্য একটি আধুনিক বাশ দরকার যা বুঝতে পারে read -d ''( -dএবং এর মধ্যে স্থানটি ভুলে যাবেন না '')।
টিনো

109

নেস্টেড সাবমডিউলগুলি দেখাতে চাইলে আপনি ব্যবহার করতে পারেন git submodule statusবা git submodule status --recursiveallyচ্ছিকভাবে।

গিট ডকুমেন্টেশন থেকে:

সাবমডিউলগুলির স্থিতি প্রদর্শন করুন। এটি সাবমোডুল পথ এবং SHA-1 এর জন্য বর্ণনা করা গিট আউটপুট সহ প্রতিটি সাবমোডিয়ালের জন্য বর্তমানে চেক করা কমিটের SHA-1 মুদ্রণ করবে। প্রতিটি SHA-1 এর সাথে উপসর্গ করা হবে - যদি সাবমোডিয়ালটি আরম্ভ করা না হয়, + যদি বর্তমানে পরীক্ষিত সাবমডিউল কমিট সংস্থানকৃত রিপোজিটরি এবং ইউ এর সূচীতে পাওয়া SHA-1 এর সাথে মেলে না তবে যদি সাবমোডুলটি মার্জ কনফারেন্সগুলিতে থাকে।


2
git submodule update --init --recursiveসমস্ত সাবমোডিয়াল সূচনা করতে কেবল চালান ।
জন কোপস

2
@ ইগোরগানাপলস্কি কেবল স্টেফানের মন্তব্যে পড়েছেন: সাবমডিউলগুলি এখনও শুরু না করা হলে এই ধরণের কমান্ডগুলি কাজ করে না । কোনও আউটপুট = কোনও উপ-মডুল (খালি তালিকা) নেই।
টিম

6
বাশের কোনও সহায়তা ছাড়াই একটি সাধারণ এবং নেটিভ- ভিত্তিক কমান্ড ব্যবহারের জন্য এটি অবশ্যই সেরা উত্তর হিসাবে চিহ্নিত করা উচিত git। এবং এই সমাধানটি কার্যকরী অনুলিপির যে কোনও সময়ে এটি ভালভাবে চলে সেভাবে মার্জিত (তবে সাবমোডিয়ুলরা অবশ্যই তাদের পক্ষে ফলস্বরূপ যার ফলে ফলাফলটি সরাসরি তাদের ক্ষেত্রে প্রযোজ্য)।
টিম

সন্দীপ গিলের উত্তর যেমনটি বলেছে, git submoduleকোনও যুক্তি ছাড়াই হ'ল না git submodule status, তাই আপনি নিজের জন্য characters টি অক্ষর টাইপ করে বাঁচাতে পারবেন ;-)
স্যাম

@ সাম এগুলি git submodule status --recursiveকাজ করার পরে থেকে একেবারে এক নয় , তবে git submodule --recursiveহয় না। এই 7 টি অক্ষর আপনাকে কিছু কিনে দেয়। এটি যদিও আপনার প্রয়োজনের উপর নির্ভর করে।
কেভিন রাক

60

নিবন্ধিত সাবমোডিয়ুলের কেবলমাত্র নাম ফেরত দিতে, আপনি এই আদেশটি ব্যবহার করতে পারেন:

grep path .gitmodules | sed 's/.*= //'

git submodule --listযার অস্তিত্ব নেই তা নিয়ে ভাবুন ।


3
পরিবর্তে, perl -ne '/^\s*path =\s*(.*)/ and push(@submods, $1); END { print(join("\n", sort(@submods)));}' "$(git rev-parse --show-toplevel)/.gitmodules"এই উত্তরের তুলনায় যা ব্যবহার করুন (1) কোনও উপ-ডিরেক্টরি থেকে কাজ করে (যদিও কোনও সাবমডিউলের অভ্যন্তরে নয়); (২) নাম অনুসারে সাবমডিউলগুলি বাছাই করে; এবং (3)। গিটমডিউলগুলিতে মন্তব্য করা লাইনগুলি উপেক্ষা করে।
কলিন ডি বেনেট

6
এবং এটি বুট করার জন্য স্মরণীয়!
ড্যান

1
মনে রাখবেন এটি এটি করার অত্যন্ত নিবিড় উপায়, যেমনটি pathসাবমডিউলের নামে উপস্থিত থাকতে পারে ( git submodule add https://github.com/commercialhaskell/path.git)। তবে আপনি সম্ভবত এটি আগেই জানতেন। আপনি যদি .gitconfigকোনও ওয়ার্করির যে কোনও জায়গা থেকে অ্যাক্সেস করতে চান বা এটি কোনও --bareসংগ্রহশালায় চালাতে চান তবে আপনি এর মতো কিছু ব্যবহার করতে পারেন git cat-file -p HEAD:.gitmodules | ...। আপনার যদি "মঞ্চযুক্ত" ফাইলটি উল্লেখ করতে হয় git cat-file -p :.gitmodules | ...তবে আপনি এটি করতে পারেন , তবে indexএটি উপস্থিত থাকার জন্য একটি গিট দরকার ।
টিনো 16

56

নিম্নলিখিত কমান্ডটি সাবমোডিয়ুলগুলি তালিকাভুক্ত করবে:

git submodule--helper list

আউটপুটটি এরকম কিছু:

<mode> <sha1> <stage> <location>

দ্রষ্টব্য: এটির জন্য 2.7.0 বা ততোধিক গিট প্রয়োজন।


1
গ্রেট !. এই কমান্ড নথিভুক্ত যেখানে। উইন্ডোসের
দারভিয়ার

1
git ls-files --stage | grep ^160000(উত্তর থেকে stackoverflow.com/a/29325219 ), একই ফলাফল উত্পাদন বলে মনে হয় আপনি পুরোনো Gits সামঞ্জস্যপূর্ণ হতে হবে, যাতে সম্ভবত এই একটি ভাল প্রতিস্থাপন।
টিনো

--ডাবল ড্যাশগুলিতে মনোযোগ দিনsubmodule--helper
3xl

25

ব্যবহার করুন:

$ git submodule

এটি নির্দিষ্ট গিট সংগ্রহস্থলের সমস্ত সাবমোডিয়ুল তালিকাভুক্ত করবে।


3
এটি কার্যকরভাবে উল্লেখ করা অন্য দুটি উত্তরের একটি সদৃশ উত্তর git submodule [status]( উল্লেখ করুন যে statusবাদ দিলে বোঝানো হয়, সুতরাং এটি একই)।
কলিন ডি বেনেট

সবসময় কাজ করে না। fatal: no submodule mapping found in .gitmodules for path 'bla-bla/foo-bar'। প্রথমে আপনাকে সমস্ত অভ্যন্তরীণ সংগ্রহস্থল মুছতে হবে যা এখনও জমা দেওয়া হয়নি।
it3xl

1
সেরা উত্তর (• ̀ ω • ́) ✧
রেজওয়ান ফ্ল্যাভিয়াস পান্ডা

মনে রাখবেন যে আপনি --recursiveপতাকাটি ব্যবহার করতে চাইলে আপনাকে স্পষ্টভাবে statusকমান্ডটি যুক্ত করতে হবে : git submodule status --recursiveকাজ git submodule --recursiveকরে তবে কার্যকর হয় না।
স্যাম

17

আমি এটি ব্যবহার:

git config --list|egrep ^submodule

1
@ ইগোরগানাপলস্কি কেবল স্টেফানের মন্তব্যটি পড়েছেন: সাবমডিউলগুলি এখনও আরম্ভ না করা হলে এটি কাজ করে না । কোনও আউটপুট = কোনও উপ-মডুল (খালি তালিকা) নেই।
টিম

এটি আমার যা প্রয়োজন তা স্পষ্টই বলা যায়। এটি সাবমোডিউলগুলির সাবফোল্ডারগুলি এবং তাদের প্রত্যন্তগুলির url দেখায়।
Thinsoldier

17

আমি লক্ষ্য করেছি যে এই প্রশ্নের উত্তরে প্রদত্ত আদেশটি আমাকে যে তথ্যটি সন্ধান করছিল তা দিয়েছে:

সাবমডিউল নয় এমন পথের জন্য .gitmodule এ কোনও সাবমডিউল ম্যাপিং পাওয়া যায় নি

git ls-files --stage | grep 160000

এই উত্তরটি সুন্দর এবং পরিষ্কার, mholm815 এর উত্তর পার্সিংয়ের তুলনায় কোনও অসুবিধা আছে কি? গিটমডিউলগুলি ?
কলিন ডি বেনেট

বিটিডাব্লু, আপনি যদি কেবল সাবমডিউলগুলির নাম চান তবে ব্যবহার করুনgit ls-files --stage | grep 160000 | perl -ne 'chomp;split;print "$_[3]\n"'
কলিন ডি বেনেট

আমার পক্ষে .gimodulesকিছু না থাকায় এটি আমার পক্ষে কাজ করেছিল .git/config। (এটি কীভাবে হয় আমি নিশ্চিত নই, আমি এই অবস্থায় git rm
ভান্ডারটি

1
এটি বেয়ার রেপোসের সাথে কাজ করছে। .Gitmodules সমাধানের বিপরীতে।
kupson

1
এটি সেরা উত্তর। কেবল একটি ছোট্ট নীট: grep "^160000 "কিছুটা আরও দৃust় হবে।
লাসি

12

আপনি যদি কেবলমাত্র আরম্ভ করা সাবমডিউলগুলিতে অপারেশন করতে আপত্তি না করেন তবে আপনি git submodule foreachপাঠ্য বিশিষ্টতা এড়ানোর জন্য ব্যবহার করতে পারেন ।

git submodule foreach --quiet 'echo $name'

1
এই উত্তরটি অনন্য that আপনার যা প্রয়োজন তার উপর নির্ভর করে, এটি পছন্দসই আচরণ হতে পারে (তবে এটি অপ্রত্যাশিত এবং অনাকাঙ্ক্ষিতও হতে পারে))
শেঠ জনসন

9

তুমি ব্যবহার করতে পার:

git submodule | awk '{ print $2 }'

1
এটি স্ট্যাকওভারফ্লো . com/a/23490756/895245 হিসাবে একই আউটপুট উত্পাদন করে বলে মনে হচ্ছে তবে এটি সংক্ষিপ্ত।
সিরো সান্তিলি 郝海东 冠状 病 六四 事件

Downvoted। এই কমান্ডটি বিপজ্জনক, কারণ এটি আইএমই নামের একটি সাবমোডিয়াল test (master)(প্যারেন্টেসিসের পরে একটি স্থানের সাথে নাম) এর জন্য ব্যর্থ হয়েছে , যা একটি বৈধ সাব-মডুলোর নাম । কমান্ডটিও ঠিক করা যায় না, কারণ গিটটি প্রিন্ট করে moduleবা হয় module (branch)। এবং এটি আরও খারাপ, যেহেতু এই কমান্ডটি পোরস্লেইন নয়, সুতরাং ভবিষ্যতে পূর্বের বিজ্ঞপ্তি ছাড়াই কমান্ডের আউটপুট পরিবর্তন হতে পারে।
টিনো

7

আমি এটি ব্যবহার করি:

git submodule status | cut -d' ' -f3-4 

আউটপুট (পথ + সংস্করণ):

tools/deploy_utils (0.2.4)

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

7

নাম অনুসারে সমস্ত সাবমডিউল তালিকাবদ্ধ করতে:

git submodule --quiet foreach --recursive 'echo $name'



5

শুধু submodule পাথ খুশি, ম্যাম ...

git config --list | grep \^submodule | cut -f 2 -d .
Vendor/BaseModel
Vendor/ObjectMatcher
Vendor/OrderedDictionary
Vendor/_ObjC
Vendor/XCodeHelpers

👍🏼


4
যদিও এটি সম্ভবত প্রশ্নের সম্পূর্ণ বৈধ উত্তর, এখানে কিছু সাবধানবাণী রয়েছে: এটি কেবলমাত্র সাবমডিউলগুলির জন্য কাজ করে যা তাদের নামে বিন্দু ধারণ করে না। একটি বিন্দু সম্পূর্ণরূপে মডিউল নামে বৈধ। এটি .urlকীগুলিতে সীমাবদ্ধ করে না , তাই অন্যান্য এন্ট্রিগুলিও প্রদর্শিত হতে পারে (সাধারণত সেখানে কিছুই থাকে না তবে ছিটেফোঁটা হয়)। আপনার --localএখানে ব্যবহার করা উচিত , কারণ আপনি দেখতে --globalএবং --systemসেটিংস দেখতে চান না । এবং সর্বশেষে লক্ষণীয়, কারণ এটি উপেক্ষা করা হতে পারে, এটি কেবলমাত্র সাবমডিউলগুলির জন্য কাজ করে, যা ইতিমধ্যে উপস্থিত রয়েছে .git/config(পরে git submodule init, প্রশ্নটি দেখুন)।
টিনো

5

git configএকটি কনফিগার ফাইল নির্দিষ্ট করার অনুমতি দেয়।
আর .gitmodules হয় একটি কনফিগ ফাইল।

সুতরাং, " কাট কমান্ড সহ একটি সীমানা হিসাবে স্থান ব্যবহার করুন " এর সাহায্যে:

git config --file=.gitmodules --get-regexp ^^submodule.*\.path$ | cut -d " " -f 2

এটি কেবলমাত্র পাথের তালিকাভুক্ত করবে, ঘোষিত সাবমডিউল প্রতি এক।

টিনো মন্তব্যগুলিতে যেমন উল্লেখ করেছেন :

  • এটিতে ফাঁকা স্থান সহ সাবমডিউলগুলির জন্য এটি ব্যর্থ ।
  • submodule পাথ থাকতে পারে নতুন লাইন , হিসাবে

    git submodule add https://github.com/hilbix/bashy.git "sub module"
      git mv 'sub module' $'sub\nmodule'
    

আরও শক্তিশালী বিকল্প হিসাবে, টিনো প্রস্তাব দেয়:

git config -z --file .gitmodules --get-regexp '\.path$' | \
  sed -nz 's/^[^\n]*\n//p' | \
  tr '\0' '\n' 

সেগুলিতে নতুন লাইনের সাথে পাথের জন্য (সেগুলি দিয়ে তৈরি করা যেতে পারে git mv), ছেড়ে দিন | tr '\0' '\n'এবং ... | while IFS='' read -d '' path; do ...ব্যাশ দিয়ে আরও প্রক্রিয়াজাতকরণের মতো কিছু ব্যবহার করুন ।
এর জন্য একটি আধুনিক বাশ দরকার যা বুঝতে পারে read -d ''(এর মধ্যে স্থানটি ভুলে যাবেন না -d and '')।


হুম ... "আরও ভাল উপায় থাকতে হবে"
হ'ল

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

এটিতে ফাঁকা স্থান সহ সাবমডিউলগুলির জন্য এটি ব্যর্থ। আরও মনে রাখবেন, সেই পাথগুলিতে নিউলাইনস ( git submodule add https://github.com/hilbix/bashy.git "sub module"; git mv 'sub module' $'sub\nmodule') থাকতে পারে । গৃহীত উত্তরের সাথে আমার মন্তব্য দেখুন যা আপনার সাথে খুব মিল similar
টিনো

@ টিনো ভাল পয়েন্ট। আরও দৃশ্যমানতার জন্য আমি আপনার মন্তব্যে উত্তরে অন্তর্ভুক্ত করেছি।
ভোনসি

3

আমার গীত [1] এর সংস্করণে , প্রতিটি গিট সাবমোডিয়ুলের a nameএবং a রয়েছে path। অগত্যা তাদের একই হতে হবে না [2] । প্রথমে সাবমডিউলগুলি পরীক্ষা না করেই (উভয়কেই নির্ভরযোগ্য উপায়ে পাওয়া git update --init) শেল উইজার্ডারি a

সাবমডিউলের একটি তালিকা পান names

কীভাবে git configবা অন্য কোনও gitকমান্ড ব্যবহার করে এটি অর্জন করার উপায় খুঁজে পেলাম না । অতএব আমরা .gitmodules(সুপার কুরুচিপূর্ণ) রিজেেক্সে ফিরে এসেছি । তবে এটি কিছুটা নিরাপদ বলে মনে হচ্ছে যেহেতু gitসাবমডিউলের জন্য অনুমোদিত কোড স্পেসটিকে সীমাবদ্ধ করে names। এছাড়াও, যেহেতু আপনি সম্ভবত এই তালিকাটি আরও শেল প্রসেসিংয়ের জন্য ব্যবহার করতে চান, তাই NULL-বিটস ( \0) এর সাথে পৃথক এন্ট্রিগুলির নীচে সমাধান ।

$ sed -nre \
  's/^\[submodule \"(.*)\"]$/\1\x0/p' \
  "$(git rev-parse --show-toplevel)/.gitmodules" \
| tr -d '\n' \
| xargs -0 -n1 printf "%b\0"

এবং আপনার স্ক্রিপ্টে:

#!/usr/bin/env bash

while IFS= read -rd '' submodule_name; do
  echo submodule name: "${submodule_name}"
done < <(
  sed -nre \
    's/^\[submodule \"(.*)\"]$/\1\x0/p' \
    "$(git rev-parse --show-toplevel)/.gitmodules" \
  | tr -d '\n' \
  | xargs -0 -n1 printf "%b\0"
)

দ্রষ্টব্য : read -rd ''প্রয়োজন bashএবং এর সাথে কাজ করবে না sh

সাবমডিউলের একটি তালিকা পান paths

আমার পদ্ধতির আমি চেষ্টা না থেকে আউটপুট প্রক্রিয়া git config --get-regexpসঙ্গে awk, tr, sed, ... কিন্তু এর পরিবর্তে পাস এটি একটি শূন্য বাইট ফিরে পৃথক git config --get। এটি সাবমডিউলে নতুনলাইন, স্পেস এবং অন্যান্য বিশেষ অক্ষরগুলির (যেমন ইউনিকোড) সমস্যাগুলি এড়ানো paths। এছাড়াও, যেহেতু আপনি সম্ভবত এই তালিকাটি আরও শেল প্রসেসিংয়ের জন্য ব্যবহার করতে চান, তাই NULL-বিটস ( \0) এর সাথে পৃথক এন্ট্রিগুলির নীচে সমাধান ।

$ git config --null --file .gitmodules --name-only --get-regexp '\.path$' \
| xargs -0 -n1 git config --null --file .gitmodules --get

উদাহরণস্বরূপ, কোনও বাশ স্ক্রিপ্টে আপনি তখন করতে পারেন:

#!/usr/bin/env bash

while IFS= read -rd '' submodule_path; do
  echo submodule path: "${submodule_path}"
done < <(
  git config --null --file .gitmodules --name-only --get-regexp '\.path$' \
  | xargs -0 -n1 git config --null --file .gitmodules --get
)

দ্রষ্টব্য : read -rd ''প্রয়োজন bashএবং এর সাথে কাজ করবে না sh


পাদটিকা

[1] গিট সংস্করণ

$ git --version
git version 2.22.0

[২] ডাইভার্জিং সহ nameএবং সাবমডিউলpath

পরীক্ষার সংগ্রহস্থল সেট আপ করুন:

$ git init test-name-path
$ cd test-name-path/
$ git checkout -b master
$ git commit --allow-empty -m 'test'
$ git submodule add ./ submodule-name
Cloning into '/tmp/test-name-path/submodule-name'...
done.
$ ls
submodule-name

$ cat .gitmodules
[submodule "submodule-name"]
    path = submodule-name
    url = ./

সাবমোডিয়ুলটি তৈরি nameএবং ডাইভার্জ করতে সরান path:

$ git mv submodule-name/ submodule-path

$ ls
submodule-path

$ cat .gitmodules
[submodule "submodule-name"]
    path = submodule-path
    url = ./

$ git config --file .gitmodules --get-regexp '\.path$'
submodule.submodule-name.path submodule-path

পরীক্ষামূলক

পরীক্ষার সংগ্রহস্থল সেট আপ করুন:

$ git init test
$ cd test/
$ git checkout -b master
$ git commit --allow-empty -m 'test'
$
$ git submodule add ./ simplename
Cloning into '/tmp/test/simplename'...
done.
$
$ git submodule add ./ 'name with spaces'
Cloning into '/tmp/test/name with spaces'...
done.
$
$ git submodule add ./ 'future-name-with-newlines'
Cloning into '/tmp/test/future-name-with-newlines'...
done.
$ git mv future-name-with-newlines/ 'name
> with
> newlines'
$
$ git submodule add ./ 'name-with-unicode-💩'
Cloning into '/tmp/test/name-with-unicode-💩'...
done.
$
$ git submodule add ./ sub/folder/submodule
Cloning into '/tmp/test/sub/folder/submodule'...
done.
$
$ git submodule add ./ name.with.dots
Cloning into '/tmp/test/name.with.dots'...
done.
$
$ git submodule add ./ 'name"with"double"quotes'
Cloning into '/tmp/test/name"with"double"quotes'...
done.
$
$ git submodule add ./ "name'with'single'quotes"
Cloning into '/tmp/test/name'with'single'quotes''...
done.
$ git submodule add ./ 'name]with[brackets'
Cloning into '/tmp/test/name]with[brackets'...
done.
$ git submodule add ./ 'name-with-.path'
Cloning into '/tmp/test/name-with-.path'...
done.

.gitmodules:

[submodule "simplename"]
    path = simplename
    url = ./
[submodule "name with spaces"]
    path = name with spaces
    url = ./
[submodule "future-name-with-newlines"]
    path = name\nwith\nnewlines
    url = ./
[submodule "name-with-unicode-💩"]
    path = name-with-unicode-💩
    url = ./
[submodule "sub/folder/submodule"]
    path = sub/folder/submodule
    url = ./
[submodule "name.with.dots"]
    path = name.with.dots
    url = ./
[submodule "name\"with\"double\"quotes"]
    path = name\"with\"double\"quotes
    url = ./
[submodule "name'with'single'quotes"]
    path = name'with'single'quotes
    url = ./
[submodule "name]with[brackets"]
    path = name]with[brackets
    url = ./
[submodule "name-with-.path"]
    path = name-with-.path
    url = ./

সাবমডিউলের তালিকা পান names

$ sed -nre \
  's/^\[submodule \"(.*)\"]$/\1\x0/p' \
  "$(git rev-parse --show-toplevel)/.gitmodules" \
| tr -d '\n' \
| xargs -0 -n1 printf "%b\0" \
| xargs -0 -n1 echo submodule name:
submodule name: simplename
submodule name: name with spaces
submodule name: future-name-with-newlines
submodule name: name-with-unicode-💩
submodule name: sub/folder/submodule
submodule name: name.with.dots
submodule name: name"with"double"quotes
submodule name: name'with'single'quotes
submodule name: name]with[brackets
submodule name: name-with-.path

সাবমডিউলের তালিকা পান paths

$ git config --null --file .gitmodules --name-only --get-regexp '\.path$' \
| xargs -0 -n1 git config --null --file .gitmodules --get \
| xargs -0 -n1 echo submodule path:
submodule path: simplename
submodule path: name with spaces
submodule path: name
with
newlines
submodule path: name-with-unicode-💩
submodule path: sub/folder/submodule
submodule path: name.with.dots
submodule path: name"with"double"quotes
submodule path: name'with'single'quotes
submodule path: name]with[brackets
submodule path: name-with-.path

0

যদি কোনও .gitmodulesফাইল না থাকে তবে একটি সাবমডিউল কনফিগারেশন উপস্থিত রয়েছে .git/modules/:

find .git/modules/ -name config -exec grep url {} \;

0

সিড বা অভিনব আইএফএস সেটিংসের প্রয়োজন ছাড়াই। গিটমডিউলগুলি থেকে গিট সাবমডিউলগুলির নাম পার্স করার আরও একটি উপায় is :-)

#!/bin/env bash

function stripStartAndEndQuotes {
  temp="${1%\"}"
  temp="${temp#\"}"
  echo "$temp"
}

function getSubmoduleNames {
  line=$1
  len=${#line} # Get line length
  stripStartAndEndQuotes "${line::len-1}" # Remove last character
}

while read line; do
  getSubmoduleNames "$line"
done < <(cat .gitmodules | grep "\[submodule.*\]" | cut -d ' ' -f 2-)

এছাড়াও, এই সমাধানটি পালিয়ে যাওয়া ডাবল উদ্ধৃতি উদাহরণকে সঠিকভাবে পরিচালনা করছে বলে মনে হচ্ছে যেখানে উপরের সমাধানটি একটি পালিয়ে যাওয়া আউটপুট তৈরি করে। যা কিছু ক্ষেত্রে সঠিক নাও হতে পারে। ;-)
devC0de

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