Git रिपॉजिटरी में सबमॉड्यूल्स की सूची बनाएं


246

मेरे पास एक Git रिपॉजिटरी है जिसमें कई सबमॉड्यूल हैं। मेरे git submodule initद्वारा चलाए जाने के बाद सभी सबमॉडल्स के नाम कैसे सूचीबद्ध करते हैं?

git submodule foreachआदेश submodule के नाम गूंज सकता है, लेकिन यह है कि केवल एक बार वे बाहर की जाँच की गई है, जो init कदम के बाद ऐसा नहीं होता है काम करता है। श्रृंखला में और अधिक चरण होते हैं, जिन्हें चेक आउट करने से पहले होने की आवश्यकता होती है, और मुझे स्क्रिप्ट में सबमॉड्यूल के हार्ड-वायर नामों के लिए नहीं चाहिए।

तो क्या वर्तमान में पंजीकृत सभी सबमॉडल्स के नाम प्राप्त करने के लिए एक Git कमांड है, लेकिन अभी तक सबमॉडल्स की जांच नहीं की गई है?


4
सुपर मूर्खतापूर्ण है कि यह नहीं करता है, लेकिन संदीप का जवाब दिखाता है कि git submoduleजैसा मैं उम्मीद करता हूं कि मैं git submodule listव्यवहार करने के लिए एक काल्पनिक उम्मीद करता हूं - मैंने कभी यह जांचने के लिए नहीं सोचा कि क्या कोई तर्क नहीं है git submodule। (खुशी है कि मैंने उस लिंक का परीक्षण किया, क्योंकि मैंने शुरू में गलत 'शेयर' लिंक को पकड़ा था!)
ऋषि

4
मैं यहां आया git submodule listथा क्योंकि अस्तित्व में नहीं था और git submodule helpमदद नहीं की थी (बाद के अनुसार, समाधान, git submoduleवैध उपयोग नहीं है)।
user2394284

अधिकांश उत्तर (स्वीकृत एक सहित) सबमॉडल को सूचीबद्ध करते हैं paths, न namesकि जब वे विशेष वर्ण होते हैं तो टूट जाते हैं। मैंने दोनों नामों और रास्तों के लिए एक उत्तर देने की कोशिश की जो सुरक्षित होना चाहिए: stackoverflow.com/a/56912913/3215929
Ente

जवाबों:


175

आप उसी तंत्र का उपयोग कर सकते हैं जो git submodule initस्वयं उपयोग करता है, अर्थात्, देखें .gitmodules। यह फ़ाइल प्रत्येक सबमॉड्यूल पथ और उस URL को बताती है जिसे वह संदर्भित करता है।

उदाहरण के लिए, रिपॉजिटरी की जड़ से, cat .gitmodulesस्क्रीन पर सामग्री प्रिंट करेगा (आपके पास यह मानते हुए cat)।

क्योंकि .itmodule फ़ाइलों में Git कॉन्फ़िगरेशन प्रारूप होता है, आप उन फ़ाइलों को पार्स करने के लिए git config का उपयोग कर सकते हैं:

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

आपको सभी सबमॉड्यूल प्रविष्टियाँ दिखाएंगे, और साथ

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

आप केवल सबमॉडल पथ ही प्राप्त करेंगे।


लेकिन यह कंसोल पर कुछ भी प्रिंट नहीं करता है।
इगोरगानापोलस्की

2
@IgorGanapolsky - आप कंसोल पर प्रिंट कर सकते हैं, यदि आप cat .gitmodulesरिपॉजिटरी रूट में करते हैं ...
sdaau

awkयदि आपके पास सबमॉडल पथ में रिक्त स्थान है तो वह भाग विफल हो जाता है।
मैकल

@ मैं नाम, पथ और url सहित सबमॉडल्स की एक सूची को पुनः प्राप्त करना चाहूंगा। मैंने निम्नलिखित Git कमांड की कोशिश की, लेकिन यह कुछ भी वापस नहीं करता है: git config --file = .itmodules --get-regexp। *। सबमॉड्यूल (। *)] पथ = (। *।) Url = (। *) I git config की कोशिश की --file = .itmodules --get-regexp। * (submod))। * (पथ)। * (url) साथ ही। शायद आपके पास कोई उपाय है। पहले ही, आपका बहुत धन्यवाद।
ओडराय

8
चेतावनी: awkरिक्त स्थान के साथ सबमॉडल्स के लिए विफल रहता है! कमांड को पढ़ना चाहिए git config -z --file .gitmodules --get-regexp '\.path$' | sed -nz 's/^[^\n]*\n//p' | tr '\0' '\n'(आपको आधुनिक के sedसाथ की आवश्यकता है -z)। यह उन में Newlines के साथ पथ के लिए विफल रहता है (वे के साथ बनाया जा सकता है git mv)। यदि आप इन से सुरक्षित रहना चाहते हैं, तो छोड़ दें | tr '\0' '\n'और ... | while IFS='' read -d '' path; do ...बैश के साथ आगे की प्रक्रिया के लिए कुछ का उपयोग करें । इसके लिए एक आधुनिक बैश की जरूरत होती है, जो समझता है read -d ''(बीच की जगह को न भूलें -dऔर '')।
टीनो

109

यदि आप नेस्टेड सबमॉड्यूल्स दिखाना चाहते हैं तो आप git submodule statusवैकल्पिक रूप से उपयोग या वैकल्पिक कर सकते हैं git submodule status --recursive

Git प्रलेखन से:

सबमॉडल्स की स्थिति दिखाएं। यह प्रत्येक सबमॉड्यूल के लिए वर्तमान में जाँच किए गए SHA-1 को, सबमॉड्यूल पथ के साथ और SHA-1 के लिए git वर्णन के आउटपुट को प्रिंट करेगा। प्रत्येक SHA-1 के साथ उपसर्ग किया जाएगा - यदि सबमॉडल को आरंभीकृत नहीं किया गया है, + यदि वर्तमान में चेक किया गया सबमॉड्यूल कमिट एसएचए -1 से युक्त रिपॉजिटरी और यू के इंडेक्स में नहीं मिला है, तो यदि सबमॉड्यूल में मर्ज का विरोध है।


2
बस git submodule update --init --recursiveसभी सबमॉड्यूल को इनिशियलाइज़ करने के लिए दौड़ें ।
जॉन कोप्स

2
@IgorGanapolsky ने स्टीफ़न की टिप्पणी को केवल पढ़ा: इस तरह के आदेश काम नहीं करते हैं यदि सबमॉड्यूल अभी तक आरंभ नहीं किए गए हैं । कोई आउटपुट नहीं = कोई सबमॉड्यूल (खाली सूची) नहीं।
टिम

6
यह निश्चित रूप से बिना किसी मदद के एक सरल और देशी- आधारित कमांड का उपयोग करने के लिए सर्वोत्तम उत्तर के रूप में चिह्नित किया जाना चाहिए git। और यह समाधान इस तरीके से सुरुचिपूर्ण है कि यह काम करने वाले कॉपी के किसी भी बिंदु पर अच्छी तरह से चलता है (लेकिन खुद को सबमॉड्यूल करता है, जिसके लिए परिणाम सीधे खुद पर लागू होता है)।
टिम

जैसा कि संदीप गिल का जवाब है, git submoduleकोई तर्क नहीं है git submodule status, इसलिए आप खुद को 7 अक्षर टाइप करने से बचा सकते हैं
सैम

@Sam वे 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) किसी भी उपनिर्देशिका (हालांकि एक सबमॉड्यूल के अंदर नहीं) से काम करता है का उपयोग करें ; (2) नाम से सबमॉडल्स को क्रमबद्ध करें; और (3) .OGmodules में टिप्पणी की गई लाइनों की उपेक्षा करता है।
कॉलिन डी बेनेट

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मौजूद होना आवश्यक है।
टीनो

56

निम्न आदेश सबमॉडल्स को सूचीबद्ध करेगा:

git submodule--helper list

आउटपुट कुछ इस तरह है:

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

नोट: इसके लिए Git 2.7.0 या इसके बाद के संस्करण की आवश्यकता है।


1
महान!। इस कमांड को कहां दस्तावेजित किया गया है। Windwos के लिए Git पर काम करता है, लेकिन git-scm.com
DarVar

1
git ls-files --stage | grep ^160000(उत्तर stackoverflow.com/a/29325219 से ) एक ही परिणाम का उत्पादन लगता है, इसलिए शायद यह एक अच्छा प्रतिस्थापन है यदि आपको पुराने गिट्टियों के अनुकूल होने की आवश्यकता है।
टीनो

--डबल डैश पर ध्यान देंsubmodule--helper
it3xl

25

उपयोग:

$ git submodule

यह निर्दिष्ट गिट रिपॉजिटरी में सभी सबमॉडल्स को सूचीबद्ध करेगा।


3
यह प्रभावी रूप से दो अन्य उत्तरों का एक डुप्लिकेट उत्तर है जो उल्लेख करता है git submodule [status](ध्यान दें कि statusयदि छोड़ा गया है, तो यह वही है)।
कॉलिन डी बेनेट

हमेशा काम नहीं करता है। fatal: no submodule mapping found in .gitmodules for path 'bla-bla/foo-bar'। सबसे पहले आपको सभी आंतरिक रिपॉजिटरी को हटाना होगा जो अभी तक सबमॉडल नहीं हैं।
it3xl

1
सर्वश्रेष्ठ उत्तर (• answer ω • ́) R
रेज़वान फ़्लेवियस पांडा

ध्यान दें कि यदि आप --recursiveध्वज का उपयोग करना चाहते हैं , तो आपको स्पष्ट रूप से statusकमांड जोड़ना होगा : git submodule status --recursiveकार्य करता है, लेकिन git submodule --recursiveनहीं।
सैम

17

मैं इसका उपयोग करता हूं:

git config --list|egrep ^submodule

1
@IgorGanapolsky ने स्टीफ़न की टिप्पणी को पढ़ा: यदि सबमॉड्यूल अभी तक आरंभिक नहीं हैं, तो यह काम नहीं करता है । कोई आउटपुट नहीं = कोई सबमॉड्यूल (खाली सूची) नहीं।
टिम

यह अतिश्योक्ति है कि मुझे क्या चाहिए। यह सबमॉडल्स के सबफ़ोल्डर्स और उनके रीमोट के यूआरएल को दर्शाता है।
thinsoldier

17

मैंने देखा कि इस प्रश्न के उत्तर में दी गई कमांड ने मुझे वह जानकारी दी जिसकी मुझे तलाश थी:

कोई सबमॉड्यूल मैपिंग नहीं है।

git ls-files --stage | grep 160000

यह उत्तर अच्छा और साफ है, क्या mholm815 के उत्तर पार्सिंग .gitmodules की तुलना में कोई नुकसान हैं ?
कॉलिन डी बेनेट

BTW, यदि आप सिर्फ सबमॉडल्स के नाम चाहते हैं, तो उपयोग करेंgit ls-files --stage | grep 160000 | perl -ne 'chomp;split;print "$_[3]\n"'
कॉलिन डी बेनेट

यह मेरे लिए तब से काम कर रहा है जब मेरे पास कोई .gimodulesया कुछ भी नहीं था .git/config। (मुझे यकीन नहीं है कि यह कैसे होता है, मुझे इस राज्य में भंडार मिला। यह कुछ गलती थी, इसलिए समाधान था git rm।)
wenzeslaus

1
यह नंगे रेपो के साथ काम कर रहा है। विपरीत .itmodules समाधान।
kupson

1
यह सबसे अच्छा जवाब है। बस एक छोटा सा नाइट: grep "^160000 "थोड़ा और मजबूत होगा।
लस्सी

12

यदि आपको केवल आरंभिक सबमॉड्यूल पर काम करने में कोई आपत्ति नहीं है, तो आप git submodule foreachपाठ पार्सिंग से बचने के लिए उपयोग कर सकते हैं ।

git submodule foreach --quiet 'echo $name'

1
यह उत्तर इस मायने में अनोखा है कि यह केवल उन सबमॉड्यूल्स के लिए काम करता है जिन्हें आरंभीकृत किया गया है। आपको जो चाहिए, उसके आधार पर, यह वांछित व्यवहार हो सकता है (लेकिन यह अप्रत्याशित और अवांछित भी हो सकता है।)
सेठ जॉनसन

9

आप उपयोग कर सकते हैं:

git submodule | awk '{ print $2 }'

1
ऐसा लगता है कि stackoverflow.com/a/23490756/895245 के रूप में एक ही आउटपुट का उत्पादन होता है लेकिन कम होता है।
सिरो सेंटिल्ली 郝海东 i iro i 16 '11

Downvoted। यह कमांड खतरनाक है, क्योंकि यह एक सबमॉड्यूल iE नाम test (master)(कोष्ठक के बाद वाले स्थान के साथ नाम) के लिए विफल रहता है , जो कि एक वैध सबमॉड्यूल नाम है । कमांड को भी ठीक नहीं किया जा सकता है, क्योंकि या तो प्रिंट करता है moduleया module (branch)। और यह और भी बदतर है, क्योंकि यह कमांड पोर्सलेन नहीं है, इसलिए भविष्य में बिना किसी पूर्व सूचना के कमांड का आउटपुट बदल सकता है।
टीनो

7

मैं इस एक का उपयोग करें:

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

आउटपुट (पथ + संस्करण):

tools/deploy_utils (0.2.4)

इस संस्करण को मैं देख रहा नुकसान यह है कि यह धीमा है। यह, प्रत्येक submodule पर स्थिति की जाँच के किसी तरह का कर रही करने के लिए हो सकता है मेरी मशीन पर submodule प्रति एक दूसरे के करीब लगता है तो कई submodules के साथ परियोजनाओं पर यह एक अच्छा समाधान नहीं है, या यह एक स्क्रिप्ट आदि से चलाया जाना चाहिए
कॉलिन डी बेनेट

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 रास्तों में newlines हो सकते हैं , जैसे कि

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

एक अधिक मजबूत विकल्प के रूप में, Tino का प्रस्ताव है:

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') हो सकते हैं । स्वीकृत उत्तर के लिए मेरी टिप्पणी देखें जो आपके लिए बहुत समान है।
टीनो

@ टिनो अच्छे अंक। अधिक दृश्यता के उत्तर में मैंने आपकी टिप्पणी को शामिल किया है।
VonC

3

Git [1] के मेरे संस्करण में , हर Git सबमॉड्यूल में a nameऔर a है path। जरूरी नहीं कि वे एक ही हों [2] । पहले सबमॉडल्स की जांच किए बिना, विश्वसनीय तरीके से दोनों प्राप्त करना (git update --init ), शेल विज़ार्डरी का एक मुश्किल सा है।

सबमॉड्यूल की एक सूची प्राप्त करें names

मुझे यह कैसे git configया किसी अन्य gitकमांड का उपयोग करके प्राप्त करने का तरीका नहीं मिला । इसलिए हम वापस .gitmodules(सुपर बदसूरत) regex करने के लिए कर रहे हैं । लेकिन यह gitसबमोडुले के लिए संभव कोड स्थान को सीमित करने के बाद से कुछ हद तक सुरक्षित लगता है names। इसके अलावा, चूंकि आप संभवतः आगे की शेल प्रोसेसिंग के लिए इस सूची का उपयोग करना चाहते हैं, इसलिए NULL-bytes ( \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-bytes ( \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


फुटनोट

[१] गिट संस्करण

$ 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

यहाँ sed या फैंसी IFS सेटिंग्स की आवश्यकता के बिना .itmodules से Git सबमॉड्यूल नामों को पार्स करने का एक और तरीका है। :-)

#!/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

"ऊपर" और "नीचे" वास्तव में मतदान आधारित क्रम में काम नहीं करता है।
एन्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.