ใหม่ในgit1.8.4 ที่จะเกิดขึ้น(กรกฎาคม 2013) :
" git submodule update
" อาจเลือกที่จะโคลนคลังเก็บ submodule อย่างตื้นเขิน
(และคอมไพล์ 2.10 ไตรมาสที่ 3 ปี 2016 ช่วยให้การบันทึกว่าด้วยgit config -f .gitmodules submodule.<name>.shallow true
.
ดูตอนท้ายของคำตอบนี้)
ดูการยอมรับ 275cd184d52b5b81cb89e4ec33e540fb2ae61c1f :
เพิ่ม--depth
ตัวเลือกในคำสั่งเพิ่มและอัปเดตของ "git submodule" ซึ่งจะถูกส่งต่อไปยังคำสั่ง clone สิ่งนี้มีประโยชน์เมื่อซับโดเลชั่นมีขนาดใหญ่มากและคุณไม่ได้สนใจอะไรเลยนอกจากความมุ่งมั่นล่าสุด
การทดสอบจะถูกเพิ่มและมีการปรับปรุงการเยื้องเพื่อให้สอดคล้องกับส่วนที่เหลือของ testfile ใน "การปรับปรุง submodule สามารถจัดการลิงก์สัญลักษณ์ใน pwd"
ลงชื่อออกโดย: Fredrik Gustafsson <iveqy@iveqy.com>
ตอบรับโดย: Jens Lehmann<Jens.Lehmann@web.de>
นั่นหมายความว่างานนี้:
git submodule add --depth 1 -- repository path
git submodule update --depth -- [<path>...]
ด้วย:
--depth::
ตัวเลือกนี้ใช้ได้สำหรับadd
และupdate
คำสั่ง
สร้างโคลน 'ตื้น' ที่มีประวัติถูกตัดให้เหลือจำนวนการแก้ไขที่ระบุ
atwymanเพิ่มในความคิดเห็น :
เท่าที่ฉันสามารถบอกตัวเลือกนี้ไม่สามารถใช้งานได้สำหรับ submodules ซึ่งไม่ได้ติดตามmaster
อย่างใกล้ชิด หากคุณตั้งค่าความลึก 1 จากนั้นsubmodule update
จะประสบความสำเร็จได้ก็ต่อเมื่อ submodule ยอมรับว่าคุณต้องการเป็นมาสเตอร์คนล่าสุด มิฉะนั้นคุณจะได้รับ "fatal: reference is not a tree
"
นั่นเป็นความจริง.
นั่นคือจนถึง git 2.8 (มีนาคม 2016) ด้วย 2.8, submodule update --depth
โอกาสที่จะประสบความสำเร็จมากกว่าหนึ่งแม้ว่า SHA1 สามารถเข้าถึงได้โดยตรงจากหนึ่งใน repo HEADs ระยะไกล
ดูกระทำ fb43e31 (24 กุมภาพันธ์ 2016) โดยสเตฟานสนั่น (stefanbeller
)
ช่วยโดย: Junio C Hamano (gitster
)
(รวมโดยJunio C Hamano - gitster
-ในการกระทำ 9671a76 , 26 กุมภาพันธ์ 2016)
submodule: พยายามดึง sha1 ที่ต้องการได้ยากขึ้นโดยดึง sha1 โดยตรง
เมื่อตรวจสอบการเปลี่ยนแปลงที่อัปเดต submodule ใน Gerrit แนวทางการตรวจสอบทั่วไปคือการดาวน์โหลดและเลือกแพทช์เชอร์รี่ในพื้นที่เพื่อทดสอบ
อย่างไรก็ตามเมื่อทำการทดสอบภายในเครื่อง ' git submodule update
' อาจล้มเหลวในการดึงข้อมูล submodule sha1 ที่ถูกต้องเนื่องจากการกระทำที่สอดคล้องกันใน submodule นั้นยังไม่ได้เป็นส่วนหนึ่งของประวัติโครงการ แต่ก็เป็นเพียงการเปลี่ยนแปลงที่เสนอ
ถ้า$sha1
ไม่ได้เป็นส่วนหนึ่งของการเริ่มต้นเรียกเราพยายามที่จะดึงข้อมูล$sha1
โดยตรง อย่างไรก็ตามเซิร์ฟเวอร์บางตัวไม่รองรับการดึงโดยตรงด้วย sha1 ซึ่งทำให้git-fetch
ล้มเหลวอย่างรวดเร็ว
เราสามารถทำให้ตัวเองล้มเหลวได้ที่นี่เพราะ sha1 ที่หายไปจะนำไปสู่ความล้มเหลวในขั้นตอนการชำระเงินต่อไปดังนั้นความล้มเหลวที่นี่จึงดีเท่าที่เราจะได้รับ
MVGชี้ให้เห็นในความคิดเห็นที่จะกระทำ fb43e31 (git 2.9, Feb 2016)
ดูเหมือนว่าฉันที่ยอมรับ fb43e31ร้องขอการกระทำที่ขาดหายไปโดยรหัส SHA1 ดังนั้นการตั้งค่าuploadpack.allowReachableSHA1InWant
และuploadpack.allowTipSHA1InWant
บนเซิร์ฟเวอร์อาจส่งผลกระทบต่อการทำงานนี้
ฉันเขียนโพสต์ไปยังรายการ git วันนี้ชี้ให้เห็นว่าการใช้ submodules ตื้น ๆ สามารถทำงานได้ดีขึ้นในบางสถานการณ์หรือไม่นั่นคือถ้าการกระทำเป็นแท็กด้วย
รอดูกันก่อน
ฉันเดาว่านี่เป็นเหตุผลที่ fb43e31 ทำการดึงข้อมูลสำหรับ SHA1 เฉพาะทางเลือกหลังจากการดึงข้อมูลสำหรับสาขาเริ่มต้น
อย่างไรก็ตามในกรณีของ“ - ส่วนที่ 1” ฉันคิดว่ามันสมเหตุสมผลแล้วที่จะยกเลิกก่อน: ถ้าไม่มีผู้อ้างอิงที่ระบุไว้ตรงกับที่ร้องขอและการร้องขอจาก SHA1 ไม่ได้รับการสนับสนุนจากเซิร์ฟเวอร์ ดึงสิ่งใด ๆ เนื่องจากเราจะไม่สามารถตอบสนองความต้องการ submodule ด้วยวิธีใดวิธีหนึ่ง
อัปเดตสิงหาคม 2559 (3 ปีต่อมา)
ด้วย Git 2.10 (Q3 2559) คุณจะสามารถทำได้
git config -f .gitmodules submodule.<name>.shallow true
ดูที่ " God submodule โดยไม่มีน้ำหนักเพิ่ม "
Git 2.13 (Q2 2017) จะเพิ่มในกระทำ 8d3047c (19 เมษายน 2017) โดยเซบาสเตียน Schuberth (sschuberth
)
(ผสานโดยSebastian Schuberth - sschuberth
-ในวันที่8d3047c , 20 เม.ย. 2560)
โคลนของ submodule นี้จะดำเนินการเป็นโคลนตื้น(ที่มีประวัติความลึก 1)
อย่างไรก็ตามCiro Santilliเพิ่มในความคิดเห็น (และรายละเอียดในคำตอบของเขา )
shallow = true
บน.gitmodules
จะมีผลต่อการอ้างอิงการติดตามโดยหัวของระยะไกลเมื่อใช้--recurse-submodules
แม้ว่าเป้าหมายกระทำจะชี้ไปตามสาขาและแม้กระทั่งถ้าคุณใส่branch = mybranch
ใน.gitmodules
ได้เป็นอย่างดี
Git 2.20 (Q4 2018) ปรับปรุงในส่วนสนับสนุน submodule ซึ่งได้รับการอัพเดทให้อ่านจาก blob HEAD:.gitmodules
เมื่อ.gitmodules
ไฟล์หายไปจากแผนผังการทำงาน
ดูกระทำ 2b1257e , กระทำ 76e9bdc (25 ตุลาคม 2018) และกระทำ b5c259f , กระทำ 23dd8f5 , กระทำ b2faad4 , กระทำ 2502ffc , กระทำ 996df4d , กระทำ d1b13df , กระทำ 45f5ef3 , กระทำ bcbc780 (5 ตุลาคม 2018) โดยแอนโตนิโอ Ospite (ao2
)
(ผสานโดยJunio C Hamano - gitster
- in abb4824 , 13 Nov 2018)
submodule
: สนับสนุนการอ่าน.gitmodules
เมื่อมันไม่ได้อยู่ในแผนผังการทำงาน
เมื่อ.gitmodules
ไฟล์ไม่พร้อมใช้งานในแผนผังการทำงานให้ลองใช้เนื้อหาจากดัชนีและจากสาขาปัจจุบัน
สิ่งนี้ครอบคลุมกรณีเมื่อไฟล์เป็นส่วนหนึ่งของที่เก็บ แต่ด้วยเหตุผลบางอย่างมันไม่ได้ถูกเช็คเอาต์ตัวอย่างเช่นเนื่องจากการชำระเงินแบบเบาบาง
นี้จะทำให้มันเป็นไปได้ที่จะใช้เวลาอย่างน้อย ' git submodule
' คำสั่งซึ่งอ่านgitmodules
แฟ้มการกำหนดค่าโดยไม่ต้องเต็มที่ประชากรต้นทำงาน
เขียนไปจะยังคงต้องว่าไฟล์มีการตรวจสอบออกมาเพื่อตรวจสอบว่าก่อนที่จะเรียก.gitmodules
config_set_in_gitmodules_file_gently
เพิ่มการตรวจสอบที่คล้ายกันgit-submodule.sh::cmd_add()
เพื่อคาดการณ์ความล้มเหลวในที่สุดของgit submodule add
คำสั่ง "" เมื่อ.gitmodules
ไม่สามารถเขียนได้อย่างปลอดภัย สิ่งนี้ป้องกันไม่ให้คำสั่งออกจากที่เก็บในสถานะปลอม (เช่นที่เก็บ submodule ถูกโคลน แต่.gitmodules
ไม่ถูกอัพเดตเนื่องจากconfig_set_in_gitmodules_file_gently
ล้มเหลว)
ยิ่งไปกว่านั้นตั้งแต่config_from_gitmodules()
ตอนนี้เข้าถึงที่เก็บอ็อบเจ็กต์โกลบอลจึงจำเป็นต้องปกป้องพา ธ โค้ดทั้งหมดที่เรียกใช้ฟังก์ชันจากการเข้าถึงที่เก็บอ็อบเจ็กต์โกลบอลพร้อมกัน
ปัจจุบันนี้จะเกิดขึ้นในbuiltin/grep.c::grep_submodules()
เพื่อเรียกร้อง
ก่อนที่จะเรียกใช้รหัสที่เกี่ยวข้องกับgrep_read_lock()
config_from_gitmodules()
หมายเหตุ: มีกรณีที่เกิดขึ้นได้ยากน้อยหนึ่งกรณีซึ่งคุณลักษณะใหม่นี้ทำงานไม่ถูกต้อง: submodules ที่ซ้อนกันโดยไม่ต้อง.gitmodules
อยู่ในแผนผังการทำงาน
หมายเหตุ: Git 2.24 (Q4 2019) แก้ไข segfault ที่เป็นไปได้เมื่อทำการโคลน submodule
ดูกระทำ ddb3c85 (30 กันยายน 2019) โดยอาลี Utku Selen (auselen
)
(ผสานโดยJunio C Hamano - gitster
- in 678a9ca , 09 Oct 2019)
Git 2.25 (Q1 2020) ชี้แจงgit submodule update
เอกสารประกอบ
ดูกระทำ f0e58b3 (24 พฤศจิกายน 2019) โดยฟิลิปป์ Blain (phil-blain
)
(ผสานโดยJunio C Hamano - gitster
- in ef61045 , 05 Dec 2019)
doc
: ระบุว่า 'git submodule update' เรียกคอมมิทที่หายไป
ช่วยเหลือโดย: Junio C Hamano
ช่วยเหลือโดย: Johannes Schindelin
ลงชื่อออกโดย: Philippe Blain
' git submodule
ปรับปรุง' จะเรียกใหม่กระทำจากระยะไกล submodule ถ้า SHA-1 ที่บันทึกไว้ใน superproject ไม่พบ สิ่งนี้ไม่ได้กล่าวถึงในเอกสารประกอบ
คำเตือน: ด้วย Git 2.25 (ไตรมาสที่ 1 ปี 2020) การโต้ตอบระหว่าง " git clone --recurse-submodules
" และที่เก็บวัตถุทางเลือกได้รับการออกแบบมาไม่ดี
เอกสารและรหัสได้รับการสอนเพื่อให้คำแนะนำที่ชัดเจนยิ่งขึ้นเมื่อผู้ใช้เห็นความล้มเหลว
ดูกระทำ 4f3e57e , กระทำ 10c64a0 (2 ธันวาคม 2019) โดยโจนาธานตาล (jhowtan
)
(ผสานโดยJunio C Hamano - gitster
-ในการกระทำ 5dd1d59 , 10 ธันวาคม 2019)
submodule--helper
: แนะนำเกี่ยวกับข้อผิดพลาดทางเลือกร้ายแรง
ลงชื่อออกโดย: Jonathan Tan
ตอบรับโดย: Jeff King
เมื่อทำการโคลน.gitmodules
ซูเปอร์โปรเจ็กซ้ำด้วยโมดูลตื้นบางอันที่กำหนดไว้ในนั้นจากนั้นทำการรีเคลมด้วย " --reference=<path>
" จะเกิดข้อผิดพลาด ตัวอย่างเช่น:
git clone --recurse-submodules --branch=master -j8 \
https://android.googlesource.com/platform/superproject \
master
git clone --recurse-submodules --branch=master -j8 \
https://android.googlesource.com/platform/superproject \
--reference master master2
ล้มเหลวด้วย:
fatal: submodule '<snip>' cannot add alternate: reference repository
'<snip>' is shallow
เมื่อไม่สามารถเพิ่มทางเลือกอื่นที่คำนวณได้จากทางเลือกของ superproject ไม่ว่าจะในกรณีนี้หรือในกรณีอื่นแนะนำให้ตั้งค่า " submodule.alternateErrorStrategy
" ตัวเลือกการกำหนดค่าและใช้ " --reference-if-able
" แทนการ--reference
โคลน "
นั่นคือรายละเอียดใน:
ด้วย Git 2.25 (ไตรมาสที่ 1 ปี 2020) การทำงานร่วมกันระหว่าง "git clone --recurse-submodules" และที่เก็บวัตถุสำรองได้รับการออกแบบมาไม่ดี
Doc
: อธิบาย submodule.alternateErrorStrategy
ลงชื่อออกโดย: Jonathan Tan
ตอบรับโดย: Jeff King
Commit 31224cbdc7 (" clone
: ตัวเลือกการเรียกซ้ำและการอ้างอิงจะเรียกใช้ตัวเลือก submodule", 2016-08-17, Git v2.11.0-rc0 - รวมอยู่ในชุดที่ 1 ) สอน Git เพื่อสนับสนุนตัวเลือกการกำหนดค่า " submodule.alternateLocation
" และ " submodule.alternateErrorStrategy
" ใน superproject .
หาก " submodule.alternateLocation
" ได้รับการกำหนดค่าให้เป็น " superproject
" ในซูเปอร์โปรเจ็กต์ทุกครั้งที่โคลนซูเปอร์โปรเจ็กต์นั้นถูกโคลนมันจะคำนวณพา ธ ทางเลือกแบบอะนาล็อกแทนสำหรับซูเปอร์$GIT_DIR/objects/info/alternates
โปรเจ็กต์นั้นและจากการอ้างอิง
"การsubmodule.alternateErrorStrategy
เลือก" กำหนดสิ่งที่จะเกิดขึ้นหากอื่นที่ไม่สามารถอ้างอิง
อย่างไรก็ตามมันไม่ชัดเจนว่าโคลนจะดำเนินต่อราวกับว่าไม่มีการระบุตัวเลือกอื่นเมื่อไม่ได้ตั้งค่าตัวเลือก "ตาย" (ดังที่เห็นได้จากการทดสอบใน31224cbdc7 )
ดังนั้นให้จัดทำเอกสารตามนั้น
เอกสารการตั้งค่า submoduleขณะนี้รวมถึง:
submodule.alternateErrorStrategy::
ระบุวิธีการรักษาข้อผิดพลาดกับสลับสำหรับ submodule submodule.alternateLocation
เป็นคำนวณผ่าน
ค่าที่เป็นไปได้ignore
, ,info
เริ่มต้นคือ
โปรดทราบว่าหากการตั้งค่าหรือและถ้ามีข้อผิดพลาดกับทางเลือกคำนวณเงินโคลนเช่นถ้าไม่มีสำรองถูกระบุdie
die
ignore
info
git submodule add/update
" สามารถโคลนคลังข้อมูล submodule ตอนนี้ได้อย่างง่ายดาย! ดูคำตอบของฉันด้านล่าง