แสดงรายการ submodules ในที่เก็บ Git


247

ฉันมีที่เก็บ Git ที่มี submodules หลายอัน ฉันจะแสดงรายการชื่อของ submodules ทั้งหมดหลังจากที่git submodule initเรียกใช้แล้วได้อย่างไร

git submodule foreachคำสั่งอาจสะท้อนชื่อของ submodule แต่ที่ทำงานเฉพาะเมื่อพวกเขาได้รับการตรวจสอบออกมาซึ่งไม่ได้เกิดขึ้นหลังจากขั้นตอนการเริ่มระบบ มีขั้นตอนเพิ่มเติมในห่วงโซ่ที่ต้องเกิดขึ้นก่อนที่พวกเขาจะสามารถตรวจสอบได้และฉันไม่ต้องการที่จะต้องชื่อหนักของ submodules ลงในสคริปต์

ดังนั้นมีคำสั่ง Git เพื่อรับชื่อของการลงทะเบียนทั้งหมดในปัจจุบัน แต่ยังไม่ได้ตรวจสอบ submodules?


4
ซูเปอร์โง่ว่ามันไม่ได้ แต่Sandeep ของคำตอบที่แสดงให้เห็นว่าgit submoduleพฤติกรรมตามที่ผมคาดว่าสมมุติgit submodule listที่จะประพฤติ - ฉันก็ไม่เคยคิดที่จะตรวจสอบสิ่งที่เกิดขึ้นกับไม่มีgit submoduleข้อโต้แย้ง (ดีใจที่ผมทดสอบการเชื่อมโยงว่าตั้งแต่ผมคว้าผิดลิงก์ 'แบ่งปัน' ครั้งแรก!)
ปัญญาชน

4
ฉันมาที่นี่เพราะgit submodule listไม่มีอยู่จริงและgit submodule helpไม่ได้ช่วยเหลือ (อ้างอิงจากวิธีการแก้ปัญหาgit submoduleการใช้งานที่ไม่ถูกต้อง)
user2394284

คำตอบส่วนใหญ่ (รวมถึงคำตอบที่ยอมรับ) รายการ submodule pathsไม่ใช่namesและแตกเมื่อมีอักขระพิเศษ ผมพยายามที่จะให้คำตอบสำหรับทั้งชื่อและเส้นทางที่ควรจะปลอดภัย: stackoverflow.com/a/56912913/3215929
Ente

คำตอบ:


175

คุณสามารถใช้กลไกเดียวกับการใช้งานของตัวเองคือการมองไปที่git submodule init .gitmodulesไฟล์นี้จะแจกแจงแต่ละเส้นทาง submodule และ URL ที่อ้างถึง

ตัวอย่างเช่นจาก root of repository cat .gitmodulesจะพิมพ์เนื้อหาไปที่หน้าจอ (สมมติว่าคุณมีcat)

เนื่องจากไฟล์. gitmodule มีรูปแบบการกำหนดค่า Git คุณสามารถใช้การกำหนดค่า git เพื่อแยกวิเคราะห์ไฟล์เหล่านั้น:

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

จะแสดงรายการ submodule ทั้งหมดและด้วย

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

คุณจะได้รับเส้นทาง submodule เท่านั้น


แต่มันไม่ได้พิมพ์อะไรออกมาบนคอนโซล
IgorGanapolsky

2
@IgorGanapolsky - คุณสามารถพิมพ์บนคอนโซลหากคุณทำcat .gitmodulesในที่เก็บรูท ...
sdaau

awkส่วนหนึ่งล้มเหลวถ้าคุณมีช่องว่างในเส้นทาง submodule
maikel

@Ikeke ฉันต้องการดึงรายการของ submodules รวมถึงชื่อ path และ url ฉันลองใช้คำสั่ง Git ต่อไปนี้ แต่ไม่ได้คืนอะไรเลย: git config --file = .gitmodules --get-regexp. *? submodule (. *)] path = (. *) url = (. *) ฉัน ลอง git config --file = .gitmodules --get-regexp. *? (submodule). *? (เส้นทาง). *? (url) เช่นกัน บางทีคุณอาจมีทางออก ขอบคุณล่วงหน้า.
Odrai

8
คำเตือน: awkล้มเหลวสำหรับ submodules ด้วยช่องว่าง! คำสั่งควรอ่าน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และ'')
Tino

110

คุณสามารถใช้git submodule statusหรือเป็นทางเลือกgit submodule status --recursiveหากคุณต้องการแสดง submodules ที่ซ้อนกัน

จากเอกสาร Git:

แสดงสถานะของ submodules การดำเนินการนี้จะพิมพ์ SHA-1 ของการส่งออกที่กระทำอยู่ในปัจจุบันสำหรับแต่ละ submodule พร้อมกับเส้นทาง submodule และผลลัพธ์ของ git ที่อธิบายสำหรับ SHA-1 SHA-1 แต่ละรายการจะนำหน้าด้วย - หากไม่ได้ทำการเริ่มต้น submodule, + ถ้าการส่งออกที่ทำเครื่องหมายไว้ในปัจจุบันไม่ตรงกับ SHA-1 ที่พบในดัชนีของที่เก็บที่มีอยู่และ U ถ้า submodule มีการขัดแย้งกัน


2
เพียงเรียกใช้git submodule update --init --recursiveเพื่อเริ่มต้น submodule ทั้งหมด
Jon Koops

2
@IgorGanapolsky เพียงแค่อ่านที่ความคิดเห็นของ Stefaan: ชนิดของคำสั่งนี้ทำไม่ทำงานหาก submodules จะไม่ initialised เลย ไม่มีเอาต์พุต = ไม่มี submodule (รายการว่าง)
ทิม

6
สิ่งนี้ควรถูกทำเครื่องหมายเป็นคำตอบที่ดีที่สุดสำหรับการใช้gitคำสั่งพื้นฐานและแบบธรรมดาโดยไม่มีความช่วยเหลือจากการทุบตี และวิธีการแก้ปัญหานี้มีความสง่างามในแบบที่มันทำงานได้ดี ณ จุดใด ๆ ของสำเนาการทำงาน (แต่ submodules แน่นอนซึ่งผลลัพธ์จะนำไปใช้กับตัวเองโดยตรง)
ทิม

ในฐานะที่เป็น Sandeep กิของคำตอบที่บอกว่าgit submoduleมีข้อโต้แย้งไม่เป็นเช่นเดียวกับgit submodule statusเพื่อให้คุณสามารถช่วยตัวเองพิมพ์ 7 ตัวอักษร ;-)
แซม

@ Sam พวกเขาไม่เหมือนกันตั้งแต่git submodule status --recursiveทำงาน แต่git submodule --recursiveไม่ ตัวละครทั้ง 7 นั้นซื้อของให้คุณ ขึ้นอยู่กับความต้องการของคุณ
Kevin Rak

60

หากต้องการส่งคืนชื่อของ submodules ที่ลงทะเบียนคุณสามารถใช้คำสั่งนี้:

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) ละเว้นบรรทัดที่มีความคิดเห็นใน. gitmodules
Colin D Bennett

6
และมันก็เป็นที่น่าจดจำในการบูท!
Dan

1
โปรดทราบว่านี่เป็นวิธีการทำที่เลอะเทอะอย่างที่pathอาจเป็นในชื่อ submodule ( git submodule add https://github.com/commercialhaskell/path.git) แต่คุณคงเคยรู้มาก่อนแล้ว หากคุณต้องการเข้าถึง.gitconfigจากที่ใดก็ได้ใน worktree หรือจำเป็นต้องเปิดใช้งานใน--baregit cat-file -p HEAD:.gitmodules | ...พื้นที่เก็บข้อมูลที่คุณสามารถใช้สิ่งที่ต้องการ หากคุณต้องการอ้างถึงไฟล์ "staged" คุณสามารถทำได้git cat-file -p :.gitmodules | ...อย่างไรก็ตามต้องมีคอมไพล์indexอยู่
Tino

57

คำสั่งต่อไปนี้จะแสดงรายการ submodules:

git submodule--helper list

ผลลัพธ์เป็นดังนี้:

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

หมายเหตุ: ต้องใช้ Git 2.7.0 ขึ้นไป


1
ที่ดี !. เอกสารคำสั่งนี้อยู่ที่ไหน ใช้งานได้กับ Git สำหรับ Windwos แต่ไม่สามารถหาเอกสารใด ๆ บนgit-scm.com
DarVar

1
git ls-files --stage | grep ^160000(จาก Answer stackoverflow.com/a/29325219 ) ดูเหมือนว่าจะให้ผลลัพธ์ที่เหมือนกันดังนั้นอาจเป็นการทดแทนที่ดีหากคุณจำเป็นต้องเข้ากันได้กับ gits รุ่นเก่า
Tino

ให้ความสนใจกับ--ขีดกลางสองเท่าในsubmodule--helper
it3xl

25

ใช้:

$ git submodule

มันจะแสดงรายการ submodules ทั้งหมดในที่เก็บ Git ที่ระบุ


3
นี่เป็นคำตอบที่ซ้ำซ้อนของคำตอบอีกสองคำที่กล่าวถึงgit submodule [status](โปรดทราบว่าstatusหากไม่ได้รับการบอกกล่าว
โคลิน D Bennett

ไม่ได้ผลเสมอไป fatal: no submodule mapping found in .gitmodules for path 'bla-bla/foo-bar'. ก่อนอื่นคุณต้องลบที่เก็บข้อมูลภายในทั้งหมดที่ยังไม่ได้ส่งข้อมูล
it3xl

1
คำตอบที่ดีที่สุด (• ̀ ω• ́) ✧
Răzvan Flavius ​​Panda

โปรดทราบว่าหากคุณต้องการใช้การ--recursiveตั้งค่าสถานะคุณต้องเพิ่มstatusคำสั่งอย่างชัดเจน: ใช้git submodule status --recursiveงานได้ แต่git submodule --recursiveไม่ได้
Sam

17

ฉันใช้สิ่งนี้:

git config --list|egrep ^submodule

1
@IgorGanapolsky เพียงแค่อ่านที่ความคิดเห็นของ Stefaan: นี้ไม่ทำงานถ้า submodules จะไม่ initialised เลย ไม่มีเอาต์พุต = ไม่มี submodule (รายการว่าง)
ทิม

นี่คือสิ่งที่ฉันต้องการ มันแสดงให้เห็นถึงโฟลเดอร์ย่อยของ submodules และ URL ของรีโมทของพวกเขา
thinsoldier

17

ฉันสังเกตเห็นว่าคำสั่งที่ให้ไว้ในคำตอบสำหรับคำถามนี้ให้ข้อมูลที่ฉันต้องการ:

ไม่พบการแมป submodule ใน. gitmodule สำหรับเส้นทางที่ไม่ใช่ submodule

git ls-files --stage | grep 160000

คำตอบนี้ดีและสะอาดมีข้อเสียใดเมื่อเทียบกับคำตอบของ mholm815 ที่แยกวิเคราะห์คำว่า. gitmodules ?
Colin D Bennett

BTW ถ้าคุณเพียงต้องการชื่อของ submodules ใช้git ls-files --stage | grep 160000 | perl -ne 'chomp;split;print "$_[3]\n"'
Colin D Bennett

สิ่งนี้ใช้ได้กับฉันตั้งแต่ฉันไม่มี.gimodulesสิ่งใด.git/configเลย (ฉันไม่แน่ใจว่ามันจะเกิดขึ้นฉันได้รับพื้นที่เก็บข้อมูลในรัฐนี้มันเป็นข้อผิดพลาดบางอย่างดังนั้นการแก้ปัญหาคือgit rm.)
58

1
มันทำงานร่วมกับ repos เปลือย ต่างจาก. gitmodules solution
kupson

1
นี่คือคำตอบที่ดีที่สุด แค่grep "^160000 "นิดหน่อยเล็กน้อย: จะแข็งแกร่งขึ้นเล็กน้อย
Lassi

12

หากคุณไม่รังเกียจที่จะทำงานเฉพาะกับ submodules ที่เริ่มต้นแล้วคุณสามารถใช้git submodule foreachเพื่อหลีกเลี่ยงการแยกวิเคราะห์ข้อความ

git submodule foreach --quiet 'echo $name'

1
คำตอบนี้มีความเฉพาะในการใช้งานสำหรับ submodules ที่ได้รับการเริ่มต้นเท่านั้น ขึ้นอยู่กับสิ่งที่คุณต้องการนี่อาจเป็นพฤติกรรมที่ต้องการ (แต่มันอาจเป็นสิ่งที่ไม่คาดคิดและไม่พึงประสงค์)
Seth Johnson

9

คุณสามารถใช้ได้:

git submodule | awk '{ print $2 }'

1
ดูเหมือนว่าจะสร้างผลลัพธ์เดียวกันกับstackoverflow.com/a/23490756/895245แต่สั้นกว่า
Ciro Santilli 郝海东冠状病六四事件法轮功

downvoted คำสั่งนี้จะเป็นอันตรายเพราะมันล้มเหลวสำหรับ submodule เช่นชื่อtest (master)(ชื่อที่มีเว้นวรรคแล้วตามด้วยวงเล็บ) ซึ่งเป็นชื่อ submodule ที่ถูกต้อง คำสั่งยังไม่สามารถแก้ไขได้เพราะคอมไพล์ทั้งพิมพ์หรือmodule module (branch)และยิ่งแย่ลงไปกว่านั้นเนื่องจากคำสั่งนี้ไม่ทำให้รูพรุนดังนั้นเอาต์พุตของคำสั่งอาจเปลี่ยนแปลงได้ในอนาคตโดยไม่ต้องแจ้งให้ทราบล่วงหน้า
Tino

7

ฉันใช้อันนี้:

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

เอาท์พุท (เส้นทาง + รุ่น):

tools/deploy_utils (0.2.4)

ข้อเสียที่ฉันเห็นของรุ่นนี้คือมันช้า ดูเหมือนว่าจะทำการตรวจสอบสถานะบางอย่างในแต่ละ submodule อาจใกล้กับวินาทีต่อ submodule บนเครื่องของฉันดังนั้นในโครงการที่มี submodule จำนวนมากนี่ไม่ใช่ทางออกที่ดีหรือถ้ามันควรจะเรียกใช้จากสคริปต์เป็นต้น
Colin D Bennett

7

ในการแสดงรายการทั้งหมดของชื่อย่อย:

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


7

สิ่งนี้ใช้ได้กับฉัน:

git ls-files --stage | grep ^160000

มันขึ้นอยู่กับบทความที่ยอดเยี่ยมนี้: การทำความเข้าใจ Submodules Git

grep ^160000มันจะต้องอ่าน


1
git ls-files --stage | grep ^160000ดูเหมือนว่าจะสร้างผลลัพธ์เดียวกันกับgit submodule--helper listจากคำตอบstackoverflow.com/a/40877379
Tino

5

เพียงแค่เส้นทาง submoduleโปรดแหม่ม ...

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

👍🏼


4
แม้ว่านี่อาจเป็นคำตอบที่ถูกต้องสำหรับคำถาม แต่นี่คือข้อ จำกัด บางประการ: ใช้งานได้กับ submodules ที่ไม่มีจุดในชื่อเท่านั้น จุดถูกต้องสมบูรณ์ในชื่อโมดูล มันไม่ได้ จำกัด เฉพาะ.urlคีย์ดังนั้นรายการอื่น ๆ อาจปรากฏขึ้นเช่นกัน (โดยปกติจะไม่มีเลย คุณควรใช้--localที่นี่เพราะคุณไม่ต้องการที่จะเห็น--globalและ--systemการตั้งค่า และสุดท้ายที่ควรทราบเนื่องจากอาจถูกมองข้ามมันใช้งานได้เฉพาะกับ submodules ซึ่งมีอยู่แล้วใน.git/config(เช่นหลังจากgit submodule initดูคำถาม)
Tino

5

git configอนุญาตให้ระบุไฟล์กำหนดค่า
และ.gitmodules ก็เป็นไฟล์ปรับแต่ง

ดังนั้นด้วยความช่วยเหลือของ " ใช้พื้นที่เป็นตัวคั่นด้วยคำสั่งตัด ":

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

ที่จะแสดงรายการเส้นทางเท่านั้นหนึ่งต่อการประกาศ submodule

ในขณะที่Tinoชี้ให้เห็นในความคิดเห็น :

  • สิ่งนี้ล้มเหลวสำหรับ submodules ที่มีช่องว่างในนั้น
  • เส้นทาง submodule อาจมีการขึ้นบรรทัดใหม่เช่นเดียวกับใน

    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 '')


hmmm ... "จะต้องมีวิธีที่ดีกว่า" คือความคิดของฉันในทันที
arcseldon

เดาฉันสามารถนามแฝงว่าคำสั่งในโปรไฟล์ทุบตี ฯลฯ ขอบคุณใด ๆ
arcseldon

สิ่งนี้ล้มเหลวสำหรับ submodules ที่มีช่องว่างในนั้น โปรดทราบว่าเส้นทางนั้นอาจมี Newlines ( git submodule add https://github.com/hilbix/bashy.git "sub module"; git mv 'sub module' $'sub\nmodule') ดูความคิดเห็นของฉันต่อคำตอบที่ยอมรับซึ่งคล้ายกับของคุณมาก
Tino

@ คะแนนดีมาก ฉันได้รวมความคิดเห็นของคุณไว้ในคำตอบเพื่อให้มองเห็นได้ชัดเจนขึ้น
VonC

3

ในรุ่นของฉัน Git [1]ทุก submodule Git มีและname pathพวกเขาไม่จำเป็นต้องเหมือนกัน[2] รับทั้งในวิธีที่เชื่อถือได้โดยไม่ต้องตรวจสอบ submodules ก่อน ( git update --init) เป็นบิตของพ่อมดเชลล์

รับรายการ submodule names

ฉันไม่พบวิธีการใช้สิ่งนี้git configหรือgitคำสั่งอื่น ๆ ดังนั้นเราจะกลับไป regex บน.gitmodules(super น่าเกลียด) แต่ดูเหมือนว่าจะค่อนข้างปลอดภัยตั้งแต่gitจำกัด พื้นที่รหัสที่เป็นไปได้ได้รับอนุญาตให้ namessubmodule นอกจากนี้เนื่องจากคุณอาจต้องการใช้รายการนี้สำหรับการประมวลผลเชลล์เพิ่มเติมโซลูชันด้านล่างแยกรายการด้วย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 ''ต้องการbashshและจะไม่ทำงานกับ

รับรายการ submodule paths

ในวิธีการของฉันฉันพยายามไม่ได้ที่จะดำเนินการส่งออกจากgit config --get-regexpกับawk, tr, sed... git config --getแต่แทนที่จะผ่านมันไบต์ศูนย์แยกออกจากกันกลับไป นี้คือการหลีกเลี่ยงการเกิดปัญหากับการขึ้นบรรทัดใหม่, ช่องว่างและอักขระพิเศษอื่น ๆ (เช่น Unicode) ใน pathssubmodule นอกจากนี้เนื่องจากคุณอาจต้องการใช้รายการนี้สำหรับการประมวลผลเชลล์เพิ่มเติมโซลูชันด้านล่างแยกรายการด้วยNULL-bytes ( \0)

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

ตัวอย่างเช่นในสคริปต์ Bash คุณสามารถ:

#!/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 ''ต้องและจะไม่ทำงานกับbashsh


เชิงอรรถ

[1]รุ่น Git

$ git --version
git version 2.22.0

[2] Submodule พร้อม diverging 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 = ./

ย้าย submodule เพื่อสร้าง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 = ./

รับรายการ submodule 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

รับรายการ submodule 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ไฟล์ใด ๆแต่มีการกำหนดค่า submodules ใน.git/modules/:

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

0

นี่เป็นอีกวิธีในการแยกวิเคราะห์ God submodule ชื่อจาก. gitmodules โดยไม่จำเป็นต้องตั้งค่า IFS หรือ sed :-)

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

"ด้านบน" และ "ด้านล่าง" ไม่ทำงานในการเรียงลำดับตามการลงคะแนน
Ente
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.