วิธีการ“ git clone” รวมถึง submodules?


1991

ฉันพยายามที่จะใส่ submodule เข้าไปใน repo ปัญหาคือว่าเมื่อฉันโคลน repo ผู้ปกครองโฟลเดอร์ submodule ว่างเปล่าทั้งหมด

มีวิธีใดบ้างที่git clone parent_repoจะทำให้ข้อมูลนั้นอยู่ในโฟลเดอร์ submodule

ยกตัวอย่างเช่นhttp://github.com/cwolves/sequelize/tree/master/lib/ , nodejs-mysql-nativeชี้ที่ submodule Git ภายนอก แต่เมื่อฉันชำระเงินsequelizeโครงการโฟลเดอร์ที่ว่างเปล่า


4
คำสั่งนั้นจะเป็นgit clone --recurse-submodules --remote-submodules(Q3 2019 Git 2.23): มันจะทำการโคลนและอัพเดต submodules ในหนึ่งคำสั่ง ดูคำตอบที่แก้ไขของฉันด้านล่าง
VonC

คำตอบ:


2975

ด้วย Git เวอร์ชัน 2.13 และใหม่กว่า--recurse-submodulesสามารถใช้แทน--recursive:

git clone --recurse-submodules -j8 git://github.com/foo/bar.git
cd bar

หมายเหตุบรรณาธิการ: -j8เป็นตัวเลือกเพิ่มประสิทธิภาพการปฏิบัติที่เป็นที่มีอยู่ในรุ่น 2.8 และเรียกถึง 8 submodules ในเวลาขนาน - man git-cloneดู

ด้วยเวอร์ชัน 1.9 ของ Git จนถึงรุ่น 2.12 ( -jตั้งค่าสถานะเฉพาะในรุ่น 2.8+):

git clone --recursive -j8 git://github.com/foo/bar.git
cd bar

ด้วย Git รุ่น 1.6.5 และใหม่กว่าคุณสามารถใช้:

git clone --recursive git://github.com/foo/bar.git
cd bar

สำหรับ repos ที่โคลนแล้วหรือ Git เวอร์ชันเก่าใช้:

git clone git://github.com/foo/bar.git
cd bar
git submodule update --init --recursive

123
มีวิธีใดบ้างที่จะระบุพฤติกรรมนี้เป็นค่าเริ่มต้นในที่เก็บ git ของคุณเพื่อให้ cloners ที่มีข้อมูลน้อยลงจะได้รับการเริ่มต้น submodule โดยอัตโนมัติ?
NHDaly

11
@NHDaly น่าเศร้าที่ไม่ (ไม่ใช่ที่ฉันรู้อย่างน้อย)
งัด Bynens

6
และการคิดอย่างมีเหตุผล clit git --recursive จะเติมข้อมูลใน submodules ของ submodule ด้วยใช่ไหม
jayarjo


5
@toszter: มันฉลาดเหรอ? เกิดอะไรขึ้นถ้า repo ที่ถือครองต้องการเวอร์ชั่นของ submodule ที่ไม่ใช่ master ?
Gauthier

498

คุณต้องทำสองสิ่งก่อนที่จะเต็ม submodule:

git submodule init 
git submodule update

8
ฉันกลัวว่า ... มันไม่มีเหตุผลใด ๆ เนื่องจากคุณกำลังตรวจสอบโครงการบางส่วนในกรณีนั้น ฉันเข้าใจว่าการอัปเดต submodule ไม่อัตโนมัติ แต่ทำไมรุ่นที่ถูกผูกไว้จึงไม่ถูกเช็คเอาท์โดยอัตโนมัติ มีวิธีการบังคับหรือไม่? ฉันมีโครงการที่มี 3 ระดับของ submodules และดูเหมือนว่าไร้สาระที่จะต้องข้ามผ่านไปเพียงเพื่อทำการชำระเงิน
มาร์ค

10
โปรดอ่านgit-submodule(1)man page ( kernel.org/pub/software/scm/git/docs/git-submodule.html ) คุณจะพบว่าการสนับสนุนพารามิเตอร์ที่ดีที่เรียกว่าgit submodule update --recursive
joschi

95
ทำไมไม่ทำทั้งสองอย่างในคำสั่งเดียว? git submodule update --init(ดูคำตอบของฉันด้วย )
Mathias Bynens

9
ฉันคิดว่าเป็นการดีกว่าที่จะตอบคำถามด้วยคำสั่งสองคำนี้ มันอธิบายวิธีการทำงานให้สำเร็จได้ดีกว่า
schmijos

6
@MathiasBynens เครื่องที่ฉันเพิ่งลงชื่อเข้าใช้มี git 1.5.5.6 ซึ่งเห็นได้ชัดว่าไม่สนับสนุนคำสั่งที่สั้นลง แต่สนับสนุนเป็นคำสั่งสองคำ
Jack Poulson

222

Git 2.23 (ไตรมาสที่ 3 ปี 2019): หากคุณต้องการโคลนและอัปเดต submodules เป็นการแก้ไขล่าสุด:

git clone --recurse-submodules --remote-submodules

หากคุณเพียงต้องการโคลนพวกเขาที่ SHA1 ที่บันทึกไว้:

git clone --recurse-submodules

ดูด้านล่าง


คำตอบเดิม 2010

ตามที่joschiกล่าวถึงในความคิดเห็นgit submoduleตอนนี้รองรับ--recursiveตัวเลือก (Git1.6.5 และอื่น ๆ )

หาก--recursiveมีการระบุคำสั่งนี้จะทำการหักเงินคืนใน submodules ที่ลงทะเบียนแล้วและอัพเดต submodules ที่ซ้อนอยู่ภายใน

ดูการทำงานกับ Git submodules แบบวนซ้ำสำหรับส่วน init
ดูคำgit submoduleอธิบายเพิ่มเติม

ด้วยเวอร์ชัน 1.6.5 ของ git และใหม่กว่าคุณสามารถทำสิ่งนี้ได้โดยอัตโนมัติโดยการโคลน super-project ด้วย–-recursiveตัวเลือก:

git clone --recursive git://github.com/mysociety/whatdotheyknow.git

อัปเดตปี 2559 ด้วย git 2.8: ดู " วิธีเพิ่มความเร็ว / ดาวน์โหลดขนานของ Git submodules โดยใช้git clone --recursive? "

คุณสามารถเริ่มต้นการดึงข้อมูล submodule โดยใช้หลายเธรดพร้อมกัน
ตัวอย่างเช่น

git fetch --recurse-submodules -j2

ยิ่งไปกว่านั้นด้วย Git 2.23 (ไตรมาสที่ 3 ปี 2019) คุณสามารถโคลนและชำระเงิน submodule ไปยังสาขาการติดตามของพวกเขาในหนึ่งคำสั่ง!

ดูกระทำ 4c69101 (19 พฤษภาคม 2019) โดยเบน Avison (bavison )
(ผสานโดยJunio ​​C Hamano - gitster- in 9476094 , 17 Jun 2019)

clone: เพิ่ม--remote-submodulesธง

เมื่อใช้git clone --recurse-submodulesก่อนหน้านี้ไม่มีวิธีส่งผ่าน--remoteสวิตช์ไปยังgit submodule updateคำสั่งimplicit สำหรับกรณีการใช้งานใด ๆ ที่คุณต้องการให้เช็คเอาต์ย่อยของสาขาย่อยติดตามระยะไกลแทนที่จะใช้ SHA-1 ที่บันทึกไว้ใน superproject

โปรแกรมแก้ไขนี้แก้ไขสถานการณ์นี้
อันที่จริงมันส่งผ่าน--no-fetchไปยังgit submodule updateที่ที่พวกเขาเพิ่งได้โคลนโคลนดังนั้นการดึงข้อมูลจากระยะไกลอีกครั้งก็ทำหน้าที่ชะลอสิ่งต่างๆลงเท่านั้น

นั่นหมายความว่า:

--[no-]remote-submodules:

submodules ทั้งหมดที่ถูกโคลนจะใช้สถานะของ branch การติดตามระยะไกลของ submodule เพื่ออัพเดท submodule แทนที่จะเป็น SHA-1 ที่บันทึกไว้ของ superproject เทียบเท่ากับการส่งผ่านไปยัง--remotegit submodule update


3
ดังนั้นจึงใช้เวลา Git 14 ปีในการเริ่มเพิ่มการสนับสนุนที่เหมาะสมสำหรับ submodules ใช่มั้ย ขอบคุณสำหรับการอัพเดท! จะเกิดอะไรขึ้นถ้าฉันมีโคลนของ repo หลักโดยไม่มี submodules และไม่มี SHA1 ที่บันทึกไว้และฉันต้องการดึงเวอร์ชั่นล่าสุดของแต่ละ submodule เป็นไปได้หรือไม่
ยีราฟสีม่วง

1
@VioletGiraffe หากที่เก็บโคลนนั้นมี submodules มันมี "บันทึก SHA1" และgit submodule update --init --recursive --remoteควรอัปเดตพวกเขาเป็นความมุ่งมั่นล่าสุดของสาขาที่เกี่ยวข้อง (เช่น: stackoverflow.com/a/56981834/6309 )
VonC

1
ให้ฉันอธิบายด้วยตัวอย่าง: ฉันมีโครงการเทมเพลตบน Github ที่ใช้ submodules และฉันยังยืนยันการแก้ไขที่เฉพาะเจาะจงของ submodules ใน repo แม่แบบนี้ แต่เมื่อฉันสร้างโครงการใหม่จาก repo นี้ไม่มีคำสั่งที่คุณระบุไว้ (ค่าclone --recurse-submodules --remote-submodulesมิได้submodule update --init --recursive --remote) ให้ฉันจริงดึงข้อมูล subrepos สิ่งที่ฉันได้รับคือไฟล์. gitmodules และฉันไม่สามารถหาวิธีใดที่จะเริ่ม subrepos อื่น ๆ ได้นอกจากการโคลนด้วยตนเองทีละตัว อย่างน้อยฉันก็อยากให้สคริปต์ทำกับsubmodule foreach...
Violet Giraffe

หากคุณรู้วิธีการแก้ปัญหาฉันจะถามคำถามแยกต่างหากที่คุณสามารถตอบได้ นี่คือ repo ทดสอบที่ฉันไม่สามารถหาวิธีที่จะเริ่มต้นอื่น ๆ ด้วยมือ: github.com/VioletGiraffe/TEST
Violet Giraffe

@VioletGiraffe นั่นเป็นเพราะคุณได้เพิ่มและยอมรับ. gitmodules แต่ไม่ใช่ gitlink ( stackoverflow.com/a/16581096/6309 , รายการพิเศษในดัชนี: stackoverflow.com/a/19354410/6309 ) ที่นี่เป็นที่เก็บ มีการลงทะเบียน gitlink ที่เหมาะสม: github.com/tiagomazzutti/antlr4dart
VonC

108

[คำตอบที่รวดเร็ว]

คุณสามารถใช้คำสั่งนี้เพื่อโคลน repo ของคุณด้วย submodules ทั้งหมด:

git clone --recursive YOUR-GIT-REPO-URL

หรือถ้าคุณได้โคลนโครงการแล้วคุณสามารถใช้:

git submodule init
git submodule update

33

ถ้า submodule ของคุณถูกเพิ่มในสาขาต้องแน่ใจว่ารวมไว้ในคำสั่ง clone ของคุณ ...

git clone -b <branch_name> --recursive <remote> <directory>

นี่เป็นสิ่งที่ฉันกำลังมองหา ... แต่ submodules แสดงรายการสาขาของพวกเขาว่า 'แฝด' :(
AceFunk

28

ลองสิ่งนี้:

git clone --recurse-submodules

มันจะดึงข้อมูล submodule โดยอัตโนมัติโดยสมมติว่าคุณได้เพิ่ม submodule เข้ากับโปรเจคหลักแล้ว


37
โปรดทราบว่า--recurse-submodulesและ--recursiveเป็นนามแฝงที่เทียบเท่ากัน
Joel Purra

@SuperUberDuper ในกรณีที่คุณสามารถทำgit submodule update --init --recursiveตามที่อธิบายไว้ในคำตอบนี้
Enrico


21

ตอบช้า

// git CLONE INCLUDE-SUBMODULES ADDRESS DESTINATION-DIRECTORY
git clone --recursive https://USERNAME@bitbucket.org/USERNAME/REPO.git DESTINATION_DIR

ในขณะที่ฉันเพิ่งใช้เวลาเล่นเกมกับเพื่อนไปทั้งชั่วโมง: แม้ว่าคุณจะมีสิทธิ์ของผู้ดูแลระบบใน BitBucket ก็ตามให้ทำการโคลนที่เก็บต้นฉบับและใช้รหัสผ่านของผู้ที่เป็นเจ้าของ repo อยู่เสมอ น่ารำคาญที่พบว่าคุณพบกับ minetrap นี้: P


นั่นคือสิ่งที่ฉันจัดการกับ ดังนั้นคุณจะบอกว่าใครก็ตามที่ต้องการพัฒนาบนพื้นที่เก็บข้อมูลบิตบิตที่มี submodules ต้องใช้ข้อมูลประจำตัวของผู้สร้างพื้นที่เก็บข้อมูล? Blech
jsleuth

@jsleuth ดูเหมือนดังนั้น - มันดูดครั้งใหญ่ ... และฉันรู้ว่ามัน
ไกเซอร์

นั่นฟังดูเหมือนแมลง คุณรายงานไปยัง Bitbucket หรือไม่?
Mathias Bynens

@MathiasBynens คุณเจอปัญหานี้หรือไม่? อีกหนึ่งปีครึ่งหลังจากนั้นจริง ๆ แล้วฉันไม่รู้ว่านี่เป็นกรณีนี้หรือไม่
ไกเซอร์

4
มันไม่ได้ตอบคำถามในเชิงพรรณนา แต่อธิบายรายละเอียดข้อผิดพลาดที่ไม่เกี่ยวข้องใน Bitbucket; ซึ่งบังเอิญสามารถย่อให้เล็กลงเพื่อ "ใช้การรับรองความถูกต้องของคีย์ SSH"
Treffynnon

18

ลองใช้วิธีนี้รวมถึง submodules ในที่เก็บ git

git clone -b <branch_name> --recursive <remote> <directory>

หรือ

git clone --recurse-submodules

18

คุณสามารถใช้--recursiveแฟล็กเมื่อทำการโคลนที่เก็บ พารามิเตอร์นี้บังคับให้คอมไพล์โคลนโคลนทั้งหมดที่กำหนดไว้ในแหล่งเก็บข้อมูล

git clone --recursive git@repo.org:your_repo.git

หลังจากโคลนบางครั้ง submodules branch อาจเปลี่ยนไปดังนั้นให้รันคำสั่งนี้หลังจาก:

git submodule foreach "git checkout master"

17

[คำตอบที่รวดเร็ว]

หลังจากการโคลน repo พาเรนต์ (ซึ่งมี repo submodule repo) ให้ทำดังนี้:

git submodule update --init --recursive

11

Submodules fetch แบบขนานมีจุดมุ่งหมายเพื่อลดเวลาที่ต้องใช้ในการดึงที่เก็บและ submodules ที่เกี่ยวข้องทั้งหมดโดยเปิดใช้งานการดึงที่เก็บหลายแห่งพร้อมกัน สามารถทำได้โดยใช้ตัวเลือก --jobs ใหม่เช่น:

git fetch --recurse-submodules --jobs=4

จากข้อมูลของทีม Git สิ่งนี้สามารถเพิ่มความเร็วในการอัปเดตคลังเก็บข้อมูลที่มี submodules จำนวนมาก เมื่อใช้ --recurse-submodules โดยไม่มีตัวเลือก --jobs ใหม่ Git จะดึงข้อมูล submodules ทีละตัว

ที่มา: http://www.infoq.com/news/2016/03/git28-released


8

ฉันมีปัญหาเดียวกันสำหรับที่เก็บ GitHub บัญชีของฉันไม่มีคีย์ SSH กระบวนการนี้เป็น

  1. สร้างคีย์ SSH
  2. การเพิ่มคีย์ SSH ใหม่ให้กับบัญชี GitHub ของคุณ

จากนั้นคุณสามารถโคลนพื้นที่เก็บข้อมูลด้วย submodules ( git clone --recursive YOUR-GIT-REPO-URL)

หรือ

เรียกใช้git submodule initและgit submodule updateเพื่อดึงข้อมูล submodules ในที่เก็บโคลนแล้ว


ใช่นั่นคือPermission denied (publickey). fatal: Could not read from remote repository.ข้อผิดพลาด
Ender

5

ลองสิ่งนี้

git clone -b <branch_name> --recursive <remote> <directory>

หากคุณเพิ่ม submodule ในสาขาตรวจสอบให้แน่ใจว่าคุณเพิ่มลงในคำสั่ง clone


5

หากเป็นโครงการใหม่คุณสามารถทำได้ดังนี้

$ git clone --recurse-submodules https://github.com/chaconinc/YourProjectName 

หากติดตั้งแล้วกว่า:

$ cd YourProjectName (for the cases you are not at right directory) 
$ git submodule init
$ git submodule update
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.