Git update submodules แบบวนซ้ำ


284

โครงงานของฉัน

ProjectA
-FrameworkA (submodule)
--Twig (submodule of FrameworkA)

ฉันจะอัปเดต submodules ซ้ำได้อย่างไร ฉันได้ลองใช้คำสั่ง git แล้ว (บนรูท ProjectA)

git submodule foreach git pull origin master

หรือ

git submodule foreach --recursive git pull origin master

แต่ไม่สามารถดึงไฟล์ของ Twig


แล้วgit-deepล่ะ?
Matthew Mathian

คำตอบ:


609
git submodule update --recursive

นอกจากนี้คุณยังอาจต้องการใช้ตัวเลือก - เริ่มต้นซึ่งจะทำให้มันเริ่มต้น submodules ไม่มีการเตรียมการใด ๆ :

git submodule update --init --recursive

หมายเหตุ: ใน Git รุ่นเก่าบางรุ่นหากคุณใช้--initตัวเลือกการส่งต่อที่เริ่มต้นแล้วอาจไม่ได้รับการอัพเดต ในกรณีนั้นคุณควรรันคำสั่งโดยไม่มี--initตัวเลือก


1
วิธีการเกี่ยวกับเพิ่มซ้ำ submodule? "git submodule เพิ่ม FrameworkA.git" เพียงแค่ดึงไฟล์ของ FrameworkA
คอมไพล์

2
คุณสามารถทำ "git submodule add blah" แล้ว "git submodule update --init --recursive"
drewag

สิ่งนี้แตกต่างจากวิธีการของฉันด้านล่างหรือไม่
William Entriken

3
@Irineau หมายเหตุเกี่ยวกับ submodules ที่เริ่มต้นแล้วไม่ได้รับการอัปเดตหาก--initใช้ไม่ตรงกับประสบการณ์ของฉันใน Git 2.2.2 ฉันเห็นทั้ง submodules ระดับบนสุดและซ้อนกันที่ได้รับการเริ่มต้นการกระทำที่ถูกต้องตรวจสอบออกเมื่อฉันใช้git submodule update --init --recursiveและฉันคิดว่าการเรียกร้องที่คุณต้องเรียกใช้คำสั่งด้วยและโดยไม่--initผิด ถ้าไม่มีใครสามารถแสดงหลักฐานว่านี่เป็นพฤติกรรมหรือแสดงให้เห็นว่ามันเปลี่ยนไประหว่างเวอร์ชันและครั้งหนึ่งเคยเป็นความจริงฉันวางแผนที่จะแก้ไขมันโดยสิ้นเชิง
Mark Amery

3
@ MarkAmery ฉันจำได้ว่านี่เป็นปัญหาในคอมไพล์บางเวอร์ชันที่ฉันจำไม่ได้ ฉันเพิ่งทดสอบใน 1.9.3 และดูเหมือนว่าปัญหาจะไม่อยู่อีกต่อไป ฉันอัปเดตคำตอบเพื่ออ้างถึง "รุ่นเก่า" ที่คลุมเครือ หากใครสามารถระบุเวอร์ชันที่เปลี่ยนพฤติกรรมนี้มันจะดีมาก
drewag

35

วิธีที่ฉันใช้คือ:

git submodule update --init --recursive
git submodule foreach --recursive git fetch
git submodule foreach git merge origin master

6
ฉันทำงานกับการเปลี่ยนบรรทัดสุดท้ายเป็น:git submodule foreach git pull --ff-only origin master
Gilad Peleg

2
ฉันจะเพิ่ม - เรียกคืนไปยังบรรทัดสุดท้าย: "git submodule foreach - git mergeive master ต้นกำเนิดผสาน" มิฉะนั้นคุณจะได้รับ submodule ที่สกปรกเมื่อมันได้ปรับปรุง submodule
Michael Scott Cuthbert

เคยมองหาสิ่งนี้ในช่วงสามชั่วโมงที่ผ่านมา ขอบคุณครับ git submodule foreach --recursive 'git commit -a | :'เพื่อเพิ่มนี้คุณยังสามารถใช้คำสั่งเหล่านี้สำหรับการกระทำเช่น: :ทำให้ห่วงมันโดยไม่คำนึงถึงผล ดูการเชื่อมโยง stackoverflow.com/questions/19728933/...
Pidgeon ที่มีประสบการณ์

17

อาจเป็นไปได้ว่าสาขาย่อยเริ่มต้นของ 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'

ฉันพยายามที่จะเพิ่มคำสั่งนี้ในMakefile ทั่วไปของฉันแต่ฉันยังคงติดอยู่กับการทำให้ GNU Make เพิกเฉยต่อการตีความลำดับ $ (... ) แม้จะมีอยู่ในเครื่องหมายคำพูดธรรมดา ใครมีความคิดบ้าง
Sebastien Varrette

คำสั่งของคุณคือสิ่งที่ฉันต้องการขอบคุณ! แต่ฉันได้รับ: Entering 'Core' fatal: ambiguous argument 'origin/HEAD': unknown revision or path not in the working tree.ที่Core submodule
Sanandrea

นอกจากนี้ฉันคิดว่าคุณต้องเข้าใจความคิดเห็นนี้stackoverflow.com/a/18008139/3383543
Ahmad AlMughrabi

การไม่มีตัวเลือกแบบเรียกซ้ำหมายถึงจะใช้งานได้เฉพาะในกรณีที่ submodules ของคุณไม่รวม submodules อีกครั้ง
erikbwork

15

ใน Git ล่าสุด (ฉันใช้ v2.15.1) ข้อมูลต่อไปนี้จะรวมการเปลี่ยนแปลง submodule upstream เข้ากับ submodule แบบเรียกซ้ำ:

git submodule update --recursive --remote --merge

คุณสามารถเพิ่ม--initเพื่อเริ่มต้น submodules ใด ๆ ที่ไม่ได้กำหนดค่าเริ่มต้นและใช้--rebaseถ้าคุณต้องการ rebase แทนการรวม

คุณต้องยอมรับการเปลี่ยนแปลงในภายหลัง:

git add . && git commit -m 'Update submodules to latest revisions'

นี้ผมคิดว่าผมทำอะไรผิดพลาด แต่คำตอบของคุณได้รับการยืนยันกับผมว่าgit submodule update --remote my-dir/my-submoduleงานก็เช่นกัน
iomv
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.