วิธีที่ง่ายที่สุดในการดึง submodules คอมไพล์ล่าสุด


1846

เรากำลังใช้ submodules git เพื่อจัดการโครงการขนาดใหญ่สองแห่งที่มีการพึ่งพาไลบรารีอื่น ๆ ที่เราได้พัฒนาขึ้น แต่ละห้องสมุดเป็น repo แยกเข้ามาในโครงการขึ้นอยู่กับ submodule ในระหว่างการพัฒนาเรามักจะต้องการเพียงแค่ไปคว้าเวอร์ชันล่าสุดของทุกซับโดเลชั่น

คอมไพล์มีคำสั่งในตัวเพื่อทำสิ่งนี้หรือไม่? ถ้าไม่เป็นเช่นนั้นไฟล์แบตช์ของ Windows หรือที่คล้ายกันนั้นสามารถทำได้


git-deepควรช่วยในเรื่องนี้
Mathew Kurian

9
@Brad คุณต้องการที่จะอัพเดทสำเนาของ submodules ของคุณเพื่อยืนยันการกระทำที่มีชื่อในโครงการต้นแบบ; หรือคุณต้องการที่จะดึง HEAD ล่าสุดที่ได้รับมอบหมายจากทุก submodule? คำตอบส่วนใหญ่ที่นี่กล่าวถึงอดีต หลายคนต้องการหลัง
chrisinmtown

คำตอบ:


2464

หากเป็นครั้งแรกที่คุณเช็คเอาต์ repo คุณต้องใช้--initก่อน:

git submodule update --init --recursive

สำหรับgit 1.8.2หรือสูงกว่ามีการ--remoteเพิ่มตัวเลือกเพื่อรองรับการอัปเดตเคล็ดลับล่าสุดของสาขาระยะไกล:

git submodule update --recursive --remote

สิ่งนี้มีประโยชน์เพิ่มเติมในการเคารพสาขา "ที่ไม่ใช่ค่าเริ่มต้น" ที่ระบุใน.gitmodulesหรือ.git/configไฟล์ (หากคุณมีค่าใด ๆ ค่าเริ่มต้นคือที่มา / ต้นแบบซึ่งในกรณีนี้คำตอบอื่น ๆ ที่นี่ก็ใช้ได้เช่นกัน)

สำหรับgit 1.7.3หรือสูงกว่าคุณสามารถใช้ (แต่ gotchas ด้านล่างเกี่ยวกับการปรับปรุงที่ยังใช้อยู่):

git submodule update --recursive

หรือ:

git pull --recurse-submodules

หากคุณต้องการที่จะดึง submodules ของคุณไปสู่การคอมมิทล่าสุดแทนที่จะคอมมิทจุดที่ยอมรับในปัจจุบัน

ดู-git submodule (1)สำหรับรายละเอียด


299
บางทีคุณควรใช้git submodule update --recursiveทุกวันนี้
Jens Kohl

38
การปรับปรุงประสิทธิภาพ:git submodule foreach "(git checkout master; git pull)&"
Bogdan Gusiev

18
การอัปเดตจะอัปเดตแต่ละ submodule เป็นการแก้ไขที่ระบุไม่ใช่อัปเดตเป็นเวอร์ชันล่าสุดสำหรับที่เก็บนั้น
Peter DeWeese

21
เพียงเพิ่ม, สุ่มสี่สุ่มห้าorigin masterที่ส่วนท้ายของคำสั่งนี้อาจมีผลลัพธ์ที่ไม่คาดคิดถ้าบางส่วนของ submodules ของคุณกำลังติดตามสาขาที่แตกต่างกันหรือชื่อสถานที่ตั้งของ submodule ที่เฉพาะเจาะจง ชัดเจนกับบางคน แต่อาจจะไม่ใช่กับทุกคน
Nathan Hornby

31
เพียงชี้แจงเพื่อทุกคน git submodule update --recursiveดูที่การแก้ไขที่เก็บข้อมูลพาเรนต์ได้จัดเก็บไว้สำหรับแต่ละ submodule แล้วตรวจสอบการแก้ไขนั้นในแต่ละ submodule มันไม่ดึงข้อผูกพันล่าสุดสำหรับแต่ละ submodule git submodule foreach git pull origin masterหรือgit pull origin master --recurse-submodulesเป็นสิ่งที่คุณต้องการหากคุณตั้งใจจะอัพเดทแต่ละ submodule ให้เป็นล่าสุดจากแหล่งเก็บของพวกเขา จากนั้นคุณจะได้รับการเปลี่ยนแปลงที่รอดำเนินการใน repo แม่ด้วยแฮชการแก้ไขที่ปรับปรุงแล้วสำหรับ submodules ตรวจสอบผู้ที่อยู่ในและคุณดี
Chev

636
git pull --recurse-submodules --jobs=10

คอมไพล์คุณลักษณะที่เรียนรู้ครั้งแรกใน 1.8.5

จนกว่าข้อผิดพลาดจะได้รับการแก้ไขเป็นครั้งแรกที่คุณจำเป็นต้องเรียกใช้

git submodule update --init --recursive


29
upvoted ฉันใช้สิ่งนี้: alias update_submodules = 'git pull --recurse-submodules && git การปรับปรุง submodule'
Stephen C

3
ใช้งานได้หากดึงข้อมูลอย่างน้อยหนึ่งครั้ง แต่สำหรับรายละเอียดที่ไม่เคยตรวจสอบดูที่คำตอบของ gahooa ด้านล่าง
แมตต์บราวน์

8
สิ่งนี้จะดึงเวอร์ชันที่ repo ยอดนิยมระบุ มันไม่ได้ดึงหัว ตัวอย่างเช่นถ้า TopRepo ระบุรุ่น 2 หลัง HEAD สำหรับ SubRepo สิ่งนี้จะดึง SubRepo ด้วยรุ่นที่ 2 คำตอบอื่น ๆ ที่นี่ดึง HEAD ใน SubRepo
Chris Moschini

11
โปรดทราบว่าไม่git pull --recurse-submodulesและgit submodule update --recursiveไม่ได้เริ่มต้น submodules เพิ่มใหม่ git submodule update --recursive --initในการเริ่มต้นพวกเขาที่คุณจำเป็นต้องเรียกใช้ อ้างจากคู่มือ : หากยังไม่ได้เริ่มต้น submodule และคุณต้องการใช้การตั้งค่าที่เก็บไว้ใน. gitmodules คุณสามารถเริ่มต้น submodule ด้วยตัวเลือก - เริ่มต้นโดยอัตโนมัติ
patryk.beza

1
อาจเพิ่มคำใบ้git submodule update --recursive --remoteซึ่งยังอัปเดต submodules ไปยังการแก้ไขล่าสุดทางไกลแทน SHA-1 ที่เก็บไว้
Hanno S.

386

เมื่อ init รันคำสั่งต่อไปนี้:

git submodule update --init --recursive

จากภายในไดเรกทอรี git repo ได้ผลดีที่สุดสำหรับฉัน

สิ่งนี้จะดึงล่าสุดทั้งหมดรวมถึง submodules

อธิบาย

git - the base command to perform any git command
    submodule - Inspects, updates and manages submodules.
        update - Update the registered submodules to match what the superproject
        expects by cloning missing submodules and updating the working tree of the
        submodules. The "updating" can be done in several ways depending on command
        line options and the value of submodule.<name>.update configuration variable.
            --init without the explicit init step if you do not intend to customize
            any submodule locations.
            --recursive is specified, this command will recurse into the registered
            submodules, and update any nested submodules within.

หลังจากนี้คุณสามารถเรียกใช้:

git submodule update --recursive

จากภายในไดเรกทอรี git repo ได้ผลดีที่สุดสำหรับฉัน

สิ่งนี้จะดึงล่าสุดทั้งหมดรวมถึง submodules


10
ใช่ - คำตอบที่ได้รับการโหวตมากที่สุดคือวิธีที่ดีที่สุดใน '09 แต่ตอนนี้ง่ายกว่าและใช้งานง่ายกว่าเดิม
Michael Scott Cuthbert

2
@MichaelScottCuthbert ขอบคุณฉันแน่ใจในอีก 3 ปีคำสั่งนี้จะบ้าเกินไป
abc123

5
อย่างไรก็ตามสิ่งนี้ไม่ได้ตรวจสอบการแก้ไขล่าสุดจาก submodule เฉพาะการแก้ไขล่าสุดที่ผู้ปกครองติดตามเท่านั้น
นาธานออสมัน

4
@NathanOsman ซึ่งเป็นสิ่งที่คุณต้องการ ... คุณจะพบกับรหัสที่ใช้งานไม่ได้โดยไม่ติดตามการแก้ไขผู้ปกครอง หากคุณเป็นผู้ดูแลของผู้ปกครองคุณสามารถอัปเดตสิ่งเหล่านั้นด้วยตัวเองและยอมรับ
abc123

2
ใช่ แต่จากความเข้าใจของฉันนั่นไม่ใช่สิ่งที่ OP ต้องการ
Nathan Osman

305

หมายเหตุ: นี่คือจาก 2009 และอาจได้ดี แต่ตอนนี้มีตัวเลือกที่ดีกว่า

เราใช้สิ่งนี้ มันเรียกว่าgit-pup:

#!/bin/bash
# Exists to fully update the git repo that you are sitting in...

git pull && git submodule init && git submodule update && git submodule status

เพียงวางไว้ในไดเรกทอรีช่องเก็บที่เหมาะสม (/ usr / local / bin) ถ้าบน Windows คุณอาจต้องแก้ไขไวยากรณ์เพื่อให้มันทำงาน :)

ปรับปรุง:

ในการตอบสนองต่อความคิดเห็นโดยผู้เขียนต้นฉบับเกี่ยวกับการดึงในหัวทั้งหมดของ submodules ทั้งหมด - นั่นเป็นคำถามที่ดี

ฉันค่อนข้างมั่นใจว่าgitไม่มีคำสั่งสำหรับสิ่งนี้ภายใน ในการที่จะทำเช่นนั้นคุณจะต้องระบุว่า HEAD นั้นมีไว้เพื่ออะไร นั่นอาจจะง่ายเหมือนการบอกว่าmasterเป็นสาขาที่ทันสมัยที่สุด ฯลฯ ...

ติดตามสิ่งนี้สร้างสคริปต์ง่าย ๆ ที่ทำสิ่งต่อไปนี้:

  1. ตรวจสอบที่git submodule statusเก็บ "แก้ไข" อักขระตัวแรกของบรรทัดเอาต์พุตระบุสิ่งนี้ หากมีการแก้ไข repo ย่อยคุณอาจไม่ต้องการดำเนินการต่อ
  2. สำหรับแต่ละ repo จดทะเบียน, CD git checkout master && git pullลงในไดเรกทอรีของมันและเรียกใช้ ตรวจสอบข้อผิดพลาด
  3. ในตอนท้ายฉันขอแนะนำให้คุณพิมพ์หน้าจอไปยังผู้ใช้เพื่อระบุสถานะปัจจุบันของ submodules - บางทีพวกเขาจะเพิ่มทั้งหมดและกระทำ

ฉันต้องการพูดถึงว่าสไตล์นี้ไม่ได้เป็นสิ่งที่ submodules คอมไพล์ได้รับการออกแบบมาสำหรับ โดยทั่วไปคุณต้องการพูดว่า "LibraryX" เป็นรุ่น "2.32" และจะยังคงอยู่จนกว่าฉันจะบอกให้ "อัปเกรด"

นั่นคือในแง่หนึ่งสิ่งที่คุณกำลังทำกับสคริปต์ที่อธิบายไว้ แต่โดยอัตโนมัติมากขึ้น ต้องระวัง!

อัปเดต 2:

หากคุณอยู่บนแพลตฟอร์ม windows คุณอาจต้องการใช้ Python เพื่อใช้งานสคริปต์เนื่องจากมีความสามารถในด้านเหล่านี้ หากคุณใช้ระบบยูนิกซ์ / ลินุกซ์ฉันขอแนะนำให้ใช้สคริปต์ทุบตี

ต้องการคำชี้แจงใด ๆ ? เพียงแค่แสดงความคิดเห็น


ฉันไม่คิดว่าเป็นสิ่งที่ฉันต้องการ จะไม่ดึงรุ่นของ submodules ที่ super-project ถูกคอมมิตด้วย ฉันต้องการดึงเฮดเดอร์เวอร์ชั่นทั้งหมด
แบรดโรบินสัน

3
สิ่งนี้ใช้งานได้ดีและไม่เพียง แต่จะปรับปรุง submodules แต่ยังสามารถดึงข้อมูลได้เป็นครั้งแรกหากนั่นคือสิ่งที่คุณต้องการ
Matt Browne

ฉันเพิ่งได้รับ "ไม่มีข้อมูลการติดตามสำหรับสาขาปัจจุบันโปรดระบุสาขาที่คุณต้องการผสานด้วย" ไม่ว่าฉันจะลองทำอะไร: /
นาธานฮอร์นบี้

9
ทำไมไม่สร้างนามแฝงแทน? git config --global alias.pup '!git pull && git submodule init && git submodule update && git submodule status'แล้วใช้git pupโดยไม่ใช้สคริปต์ใด ๆ
fracz

ขอบคุณด้วยเหตุผลบางอย่างแม้ว่าฉันมีคอมไพล์ 1.9.1 ฉันต้องแสดงgit submodule initหลังจากดึงครั้งแรกที่มี submodules รวมเพื่อให้ทุกอย่างจะเริ่มทำงานอย่างถูกต้อง
Ben Usman

164

เฮนริกอยู่ในเส้นทางที่ถูกต้อง คำสั่ง 'foreach' สามารถเรียกใช้งานเชลล์สคริปต์โดยพลการใด ๆ สองตัวเลือกในการดึงล่าสุดอาจเป็น

git submodule foreach git pull origin master

และ,

git submodule foreach /path/to/some/cool/script.sh

ที่จะวนซ้ำทั้งหมดsubmodules เริ่มต้นและเรียกใช้คำสั่งที่กำหนด


144

สิ่งต่อไปนี้ใช้ได้กับฉันบน Windows

git submodule init
git submodule update

6
นี่ไม่ใช่สิ่งที่ OP ต้องการ มันจะอัปเดตเป็น submodule ที่เชื่อมโยงและไม่ใช่ข้อมูลล่าสุด
Patrick

52
อย่างไรก็ตามนี่เป็นเพียงสิ่งเดียวในหน้านี้ที่ได้รับ git เพื่อดึง submodules ครั้งแรกที่ฉันตรวจสอบ repo
theheadofabroom

2
สามารถใช้: git submodule update - init - recursive (โดยเฉพาะถ้า submodule ที่มีปัญหาคือ RestKit จาก clone สด)
HCdev

33

แก้ไข :

ในความคิดเห็นที่ถูกชี้ให้เห็น (โดยphilfreo ) ว่ารุ่นล่าสุดจะต้อง หากมี submodules ซ้อน ๆ ที่จำเป็นต้องอยู่ในเวอร์ชั่นล่าสุด:

git submodule foreach --recursive git pull

----- ความคิดเห็นที่ล้าสมัยด้านล่าง -----

นี่ไม่ใช่วิธีที่เป็นทางการที่จะทำหรือไม่

git submodule update --init

ฉันใช้มันทุกครั้ง ไม่มีปัญหาจนถึงตอนนี้

แก้ไข:

ฉันเพิ่งพบว่าคุณสามารถใช้:

git submodule foreach --recursive git submodule update --init 

ซึ่งจะดึงซ้ำทั้งหมดของ submodules นั่นคือการพึ่งพา


5
คำตอบของคุณไม่ได้ตอบคำถามของ OP แต่เพื่อทำสิ่งที่คุณเสนอคุณสามารถพูดได้git submodule update --init --recursive
philfreo

2
ฉันเข้าใจแล้วจำเป็นต้องใช้เวอร์ชันล่าสุด อย่างนี้อาจเป็นประโยชน์ถ้ามี submodules ที่ซ้อนกัน: git submodule foreach --recursive git pull
antitoxic

1
ฉันไม่สามารถดาวน์โหลดอะไรได้เลย - "การอัพเดต submodule git - init --recursive" ใช้ได้สำหรับฉัน
BrainSlugs83

33

เนื่องจากอาจเกิดขึ้นที่สาขาเริ่มต้นของ submodules ของคุณไม่ได้ masterนี่คือวิธีที่ฉันทำการอัพเกรด submodules Git แบบอัตโนมัติ:

git submodule init
git submodule update
git submodule foreach 'git fetch origin; git checkout $(git rev-parse --abbrev-ref HEAD); git reset --hard origin/$(git rev-parse --abbrev-ref HEAD); git submodule update --recursive; git clean -dfx'

จากคำตอบมากมายสำหรับคำถามมากมายอันนี้ใช้ได้สำหรับฉัน (2019 ข้อผิดพลาด GitHub กับรหัสแฮชที่เฉพาะเจาะจง)
38919

30

ครั้งแรก

โมดูลย่อย Clone และ Init

git clone git@github.com:speedovation/kiwi-resources.git resources
git submodule init

ส่วนที่เหลือ

ในระหว่างการพัฒนาเพียงแค่ดึงและอัปเดต submodule

git pull --recurse-submodules  && git submodule update --recursive

อัปเดต Git submodule เป็นคอมมิทล่าสุดที่กระทำ

git submodule foreach git pull origin master

วิธีที่ต้องการควรอยู่ด้านล่าง

git submodule update --remote --merge

หมายเหตุ: สองคำสั่งสุดท้ายมีพฤติกรรมเหมือนกัน


ฉันทำคอมไพล์ git โดยไม่มี submodules โดยไม่ได้ตั้งใจและตัวเลือกอื่น ๆ ทั้งหมดไม่ทำงานไม่มีใครทำ clone submodules ใช้แสดงความนับถือgit submodule updateไม่หลอกลวง ตอนนี้ฉันกำลังดาวน์โหลดข้อมูล submodules ที่ขาดหายไปจากขั้นตอนแรกของการโคลน ขอบคุณ. ฉันไม่เก่งเรื่องคอมไพล์: C
m3nda

anser นี้เป็นคำตอบที่ดีมากที่จะถามคำถามที่นี่ด้านบน: ทำไมฉันต้อง ".. --recursive-submodules .. " จากนั้นจึงเพิ่ม "... update ... " และแม้กระทั่ง ".. ก่อนหน้านี้ ... "ในภายหลังเพื่อรับภาระล่าสุด? ทั้งหมดนี้ดูไม่เหมือน GIT เลย! "ปรับปรุง" ทำอะไรและทำไมฉันต้องไปที่แต่ละโมดูลด้วยตนเองเพื่อดึง? นั่นไม่ใช่สิ่งที่ "... --recurse-submodules .. " กำลังทำอะไรอยู่เหรอ? คำใบ้ใด ๆ
Peter Branforn

20

ฉันไม่รู้ตั้งแต่รุ่น git นี้ใช้งานได้ แต่นั่นคือสิ่งที่คุณกำลังค้นหา:

git submodule update --recursive

ฉันใช้มันgit pullเพื่ออัปเดตที่เก็บรูทเช่นกัน:

git pull && git submodule update --recursive

10

คำตอบข้างต้นนั้นดี แต่เราใช้ git-hooks เพื่อทำให้ง่ายขึ้น แต่ปรากฎว่าในgit 2.14คุณสามารถตั้งค่าgit config submodule.recurseเป็นจริงเพื่อเปิดใช้งาน submodules เพื่อปรับปรุงเมื่อคุณดึงไปยังที่เก็บ git ของคุณ

นี่จะมีผลข้างเคียงของการผลักดันการเปลี่ยนแปลงทั้งหมดของ submodules ที่คุณมีหากพวกมันอยู่บนกิ่งไม้ แต่ถ้าคุณมีความต้องการของพฤติกรรมนั้นแล้วมันสามารถทำงานได้

สามารถทำได้โดยใช้:

git config submodule.recurse true

ต้องรักตัวเลือกนี้ แต่น่าเสียดายที่ยังต้องใช้git submodule initก่อนมือแม้ว่าถ้า submodule ของคุณยังไม่ได้เริ่มต้น
เม็ด

5

Git สำหรับ windows 2.6.3 :

git submodule update --rebase --remote


นั่นเป็นคนเดียวที่ทำงานให้ฉัน ผมไม่ได้สามารถที่จะ init หรืออัปเดตเป็นตัวชี้ submodule ก็ชี้ไปที่รุ่นที่ไม่ได้อยู่ในระยะไกลอีกต่อไป
พาเวล P

4

จากระดับสูงสุดในธุรกรรมซื้อคืน:

git submodule foreach git checkout develop
git submodule foreach git pull

สิ่งนี้จะสลับสาขาทั้งหมดเพื่อพัฒนาและดึงล่าสุด


2
ไม่ทำงานสำหรับฉันด้วย git 2.7
Bruno Haible

คุณมีไฟล์คล้ายกับ Everything sln ซึ่งเพิ่มการอ้างอิงโครงการทั้งหมดในแผนผังหรือไม่ คุณเห็นข้อผิดพลาดอะไร คุณช่วยตรวจสอบไฟล์ gitignore ของคุณได้ไหม
Srayan Guhathakurta

1
git submodule foreach git pull origin masterต้องผนวกสาขาที่ฉันต้องการดึง นอกเหนือจากนั้นทำงานได้อย่างสมบูรณ์แบบ
Torxed

3

ฉันทำสิ่งนี้โดยปรับคำตอบของgahooa ด้านบน :

รวมเข้ากับคอมไพล์[alias]...

หากโปรเจคหลักของคุณมีสิ่งนี้ใน.gitmodules:

[submodule "opt/submodules/solarized"]
    path = opt/submodules/solarized
    url = git@github.com:altercation/solarized.git
[submodule "opt/submodules/intellij-colors-solarized"]
    path = opt/submodules/intellij-colors-solarized
    url = git@github.com:jkaving/intellij-colors-solarized.git

เพิ่มสิ่งนี้ภายใน. gitconfig ของคุณ

[alias]
    updatesubs = "!sh -c \"git submodule init && git submodule update && git submodule status\" "

จากนั้นเพื่ออัปเดต submodules ของคุณให้รัน:

git updatesubs

ผมมีตัวอย่างของมันในของฉันตั้งค่า repo


3

สิ่งที่คุณต้องทำตอนนี้เป็นเรื่องง่าย git checkout

ตรวจสอบให้แน่ใจว่าได้เปิดใช้งานผ่านการกำหนดค่าระดับโลก git config --global submodule.recurse true


2

นี่คือบรรทัดคำสั่งที่จะดึงจากที่เก็บคอมไพล์ทั้งหมดของคุณไม่ว่าจะเป็นที่เก็บหรือไม่

ROOT=$(git rev-parse --show-toplevel 2> /dev/null)
find "$ROOT" -name .git -type d -execdir git pull -v ';'

หากคุณใช้มันในพื้นที่เก็บข้อมูลบนคอมไพล์ของคุณคุณสามารถแทนที่เข้า"$ROOT".


1

ฉันคิดว่าคุณจะต้องเขียนสคริปต์เพื่อทำสิ่งนี้ จะซื่อสัตย์ผมอาจจะติดตั้งหลามที่จะทำมันเพื่อให้คุณสามารถใช้os.walkเพื่อcdไปยังไดเรกทอรีแต่ละคนและออกคำสั่งที่เหมาะสม การใช้ไพ ธ อนหรือภาษาสคริปต์อื่น ๆ นอกเหนือจากแบทช์จะช่วยให้คุณสามารถเพิ่ม / ลบโปรเจ็กต์ย่อยได้โดยไม่ต้องแก้ไขสคริปต์


1

หมายเหตุ: ไม่ใช่วิธีที่ง่ายเกินไป แต่สามารถใช้การได้และมีข้อดีเป็นของตัวเอง

หากใครต้องการโคลนเพียงHEADการแก้ไขของที่เก็บและเพียงHEADs ทั้งหมดของ submodules (เช่นการชำระเงิน "ลำต้น") จากนั้นหนึ่งสามารถใช้สคริปต์Luaดังต่อไปนี้ บางครั้งคำสั่งง่ายๆgit submodule update --init --recursive --remote --no-fetch --depth=1อาจทำให้เกิดgitข้อผิดพลาดที่ไม่สามารถกู้คืนได้ ในกรณีนี้เราต้องล้างไดเรกทอรีย่อยของ.git/modulesไดเรกทอรีและโคลน submodule ด้วยตนเองโดยใช้git clone --separate-git-dirคำสั่ง ความซับซ้อนเพียงอย่างเดียวคือการค้นหาURL , เส้นทางของ.gitไดเรกทอรีของ submodule และเส้นทางของ submodule ในต้นไม้ superproject

หมายเหตุ: สคริปต์ทดสอบกับที่https://github.com/boostorg/boost.gitเก็บเท่านั้น ลักษณะเฉพาะของมัน: submodules ทั้งหมดโฮสต์บนโฮสต์เดียวกันและ.gitmodulesมีเพียงURL ที่เกี่ยวข้องs

-- mkdir boost ; cd boost ; lua ../git-submodules-clone-HEAD.lua https://github.com/boostorg/boost.git .
local module_url = arg[1] or 'https://github.com/boostorg/boost.git'
local module = arg[2] or module_url:match('.+/([_%d%a]+)%.git')
local branch = arg[3] or 'master'
function execute(command)
    print('# ' .. command)
    return os.execute(command)
end
-- execute('rm -rf ' .. module)
if not execute('git clone --single-branch --branch master --depth=1 ' .. module_url .. ' ' .. module) then
    io.stderr:write('can\'t clone repository from ' .. module_url .. ' to ' .. module .. '\n')
    return 1
end
-- cd $module ; git submodule update --init --recursive --remote --no-fetch --depth=1
execute('mkdir -p ' .. module .. '/.git/modules')
assert(io.input(module .. '/.gitmodules'))
local lines = {}
for line in io.lines() do
    table.insert(lines, line)
end
local submodule
local path
local submodule_url
for _, line in ipairs(lines) do
    local submodule_ = line:match('^%[submodule %"([_%d%a]-)%"%]$')
    if submodule_ then
        submodule = submodule_
        path = nil
        submodule_url = nil
    else
        local path_ = line:match('^%s*path = (.+)$')
        if path_ then
            path = path_
        else
            submodule_url = line:match('^%s*url = (.+)$')
        end
        if submodule and path and submodule_url then
            -- execute('rm -rf ' .. path)
            local git_dir = module .. '/.git/modules/' .. path:match('^.-/(.+)$')
            -- execute('rm -rf ' .. git_dir)
            execute('mkdir -p $(dirname "' .. git_dir .. '")')
            if not execute('git clone --depth=1 --single-branch --branch=' .. branch .. ' --separate-git-dir ' .. git_dir .. ' ' .. module_url .. '/' .. submodule_url .. ' ' .. module .. '/' .. path) then
                io.stderr:write('can\'t clone submodule ' .. submodule .. '\n')
                return 1
            end
            path = nil
            submodule_url = nil
        end
    end
end
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.