การผลักดันโมดูลย่อย Git


128

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


4
ด้วยคอมไพล์ 2.7 (มกราคม 2016) git config push.recurseSubmodules on-demandคุณจะต้องตั้งค่าครั้งเดียว จากนั้นวิธีง่ายๆgit pushก็เพียงพอที่จะผลักดันทุกอย่าง (repo หลักและโมดูลย่อย) ดูคำตอบที่แก้ไขของฉันด้านล่าง
VonC

โปรดระบุโค้ดตัวอย่างสำหรับสิ่งที่คุณกำลังพยายามทำ
Ciro Santilli 郝海东冠状病六四事件法轮功

คำตอบ:


138

โมดูลย่อยไม่ใช่อะไรเลยนอกจากโคลนของ git repo ภายใน repo อื่นที่มีข้อมูลเมตาพิเศษบางอย่าง (รายการต้นไม้ gitlink, ไฟล์. gitmodules)

$ cd your_submodule
$ git checkout master
<hack,edit>
$ git commit -a -m "commit in submodule"
$ git push
$ cd ..
$ git add your_submodule
$ git commit -m "Updated submodule"

1
ใช่และอย่าลืมดึงการเปลี่ยนแปลงจากสาขาในพื้นที่ของคุณที่ซิงโครไนซ์ (ถ้ามี) ก่อนที่จะผลักดัน เกิดขึ้นเช่น. เมื่อทำงานกับgh-pagesสาขาสำหรับเอกสารใน github repo :)
NiKo

ฉันไม่เข้าใจว่าคุณสามารถ cd your_submodule ก่อนที่จะเพิ่ม your_submodule ได้อย่างไร ฉันเป็นวิธีที่ดีที่สุดในการเพิ่มโมดูลย่อยคือการใช้คำสั่ง "เพิ่ม" git มีวิธีอื่นในการเพิ่มโมดูลย่อยหรือไม่?
MrSo

1
@MrSo ฉันคิดว่าโมดูลย่อยมีอยู่แล้วเขากำลังอ้างถึงมันเพื่อเปลี่ยนแปลงบางสิ่งในโมดูลย่อย
HattrickNZ

108

โปรดทราบว่าตั้งแต่ git1.7.11 ( [ประกาศ] Git 1.7.11.rc1และบันทึกประจำรุ่นมิถุนายน 2012) กล่าวถึง:

" git push --recurse-submodules" เรียนรู้ที่จะเลือกดูประวัติของโมดูลย่อยที่เชื่อมโยงกับซุปเปอร์โปรเจ็กต์และผลักดันออกมา

อาจเสร็จสิ้นหลังจากแพทช์นี้และ--on-demandตัวเลือก:

recurse-submodules=<check|on-demand>::

ตรวจสอบให้แน่ใจว่าโมดูลย่อยทั้งหมดที่ใช้โดยการแก้ไขที่จะพุชนั้นมีอยู่ในสาขาการติดตามระยะไกล

  • หากcheckใช้ระบบจะตรวจสอบว่าโมดูลย่อยทั้งหมดที่คอมมิตที่เปลี่ยนแปลงในการแก้ไขที่จะพุชนั้นพร้อมใช้งานบนรีโมท
    มิฉะนั้นการพุชจะถูกยกเลิกและออกโดยมีสถานะไม่ใช่ศูนย์
  • หากon-demandใช้โมดูลย่อยทั้งหมดที่เปลี่ยนแปลงในการแก้ไขที่จะพุชจะถูกพุช
    หากออนดีมานด์ไม่สามารถผลักดันการแก้ไขที่จำเป็นทั้งหมดได้ก็จะถูกยกเลิกและออกด้วยสถานะที่ไม่ใช่ศูนย์

ดังนั้นคุณสามารถผลักดันทุกอย่างในคราวเดียวด้วย (จาก repo หลัก) a:

git push --recurse-submodules=on-demand

ตัวเลือกนี้ใช้ได้กับการซ้อนระดับเดียวเท่านั้น การเปลี่ยนแปลงโมดูลย่อยภายในโมดูลย่อยอื่นจะไม่ถูกผลัก


ด้วยคอมไพล์ 2.7 (มกราคม 2016) การผลักดันคอมไพล์ที่เรียบง่ายจะเพียงพอที่จะผลักดัน repo แม่ ... และทุก submodules ของมัน

ดูกระทำ d34141c , กระทำ f5c7cd9 (3 ธันวาคม 2015) กระทำ f5c7cd9 (3 ธันวาคม 2015) และกระทำ b33a15b (17 พฤศจิกายน 2015) โดยไมค์โครว์ (mikecrowe )
(รวมโดยJunio C Hamano - gitster-ในการกระทำ 5d35d72 , 21 ธันวาคม 2015)

push: เพิ่มrecurseSubmodulesตัวเลือกการกำหนดค่า

--recurse-submodulesพารามิเตอร์บรรทัดคำสั่งที่มีอยู่บางครั้ง แต่ก็ไม่เคยมีใครเทียบเท่าไฟล์ config

ตามสไตล์ของพารามิเตอร์ที่เกี่ยวข้องสำหรับgit fetchเรามาสร้างpush.recurseSubmodulesค่าเริ่มต้นสำหรับพารามิเตอร์นี้
นอกจากนี้ยังต้องการการเพิ่ม--recurse-submodules=noเพื่ออนุญาตให้การกำหนดค่าถูกแทนที่บนบรรทัดคำสั่งเมื่อจำเป็น

วิธีที่ง่ายที่สุดในการดำเนินการปรากฏขึ้นนี้จะเป็นที่จะทำให้การ pushใช้รหัสในการในลักษณะที่คล้ายกับsubmodule-configfetch

git configdoc ขณะนี้รวมถึง :

push.recurseSubmodules:

ตรวจสอบให้แน่ใจว่าโมดูลย่อยทั้งหมดที่ใช้โดยการแก้ไขที่จะพุชมีอยู่ในสาขาการติดตามระยะไกล

  • หากค่าเป็น ' check' Git จะตรวจสอบว่าโมดูลย่อยทั้งหมดที่มีการเปลี่ยนแปลงในการแก้ไขที่จะพุชนั้นพร้อมใช้งานบนรีโมตอย่างน้อยหนึ่งโมดูลของโมดูลย่อย หากไม่มีการคอมมิตใด ๆ การกดจะถูกยกเลิกและออกด้วยสถานะที่ไม่ใช่ศูนย์
  • หากค่าเป็น ' on-demand' โมดูลย่อยทั้งหมดที่เปลี่ยนแปลงในการแก้ไขที่จะพุชจะถูกพุช หากออนดีมานด์ไม่สามารถผลักดันการแก้ไขที่จำเป็นทั้งหมดได้ก็จะถูกยกเลิกและออกด้วยสถานะที่ไม่ใช่ศูนย์ -
  • หากค่าเป็น ' no' พฤติกรรมเริ่มต้นของการละเว้นโมดูลย่อยเมื่อการพุชจะยังคงอยู่

คุณสามารถแทนที่การกำหนดค่านี้ได้ในขณะที่พุชโดยระบุ " --recurse-submodules=check|on-demand|no"

ดังนั้น:

git config push.recurseSubmodules on-demand
git push

Git 2.12 (ไตรมาส 1 2017)

git push --dry-run --recurse-submodules=on-demand จะใช้งานได้จริง

ดูกระทำ 0301c82 , กระทำ 1aa7365 (17 พฤศจิกายน 2016) โดยแบรนดอนวิลเลียมส์ (mbrandonw )
(รวมโดยJunio C Hamano - gitster-ในการกระทำ 12cf113 , 16 ธันวาคม 2016)

push run with --dry-runไม่ได้เกิดขึ้นจริง (Git 2.11 ธันวาคม 2016 และต่ำกว่า / ก่อนหน้า) ทำการ dry-run เมื่อมีการกำหนดค่าการพุชให้พุชโมดูลย่อยตามความต้องการ
แทนที่จะผลักดันโมดูลย่อยทั้งหมดที่จำเป็นต้องผลักดันไปที่รีโมตในขณะที่การอัปเดตใด ๆ สำหรับซูเปอร์โปรเจ็กต์จะดำเนินการแบบแห้ง
นี่เป็นข้อบกพร่องและไม่ใช่พฤติกรรมที่ตั้งใจไว้สำหรับการวิ่งแบบแห้ง

สอนpushให้เคารพ--dry-runตัวเลือกเมื่อกำหนดค่าให้พุชโมดูลย่อย 'ตามความต้องการ' แบบวนซ้ำ
สิ่งนี้ทำได้โดยส่ง--dry-runแฟล็กไปยังกระบวนการย่อยซึ่งดำเนินการผลักดันโมดูลย่อยเมื่อดำเนินการแบบแห้ง


และยังคงอยู่ใน Git 2.12 ตอนนี้คุณ havea " --recurse-submodules=onlyตัวเลือก" ที่จะผลักดัน submodules ออกโดยไม่ต้องผลักดัน superproject

ดูกระทำ 225e8bf , กระทำ 6c656c3 , กระทำ 14c01bd (19 ธันวาคม 2016) โดยแบรนดอนวิลเลียมส์ (mbrandonw )
(รวมโดยJunio C Hamano - gitster-ในการกระทำ 792e22e , 31 มกราคม 2017)


ตอนนี้ใช้ได้แล้วใช่ไหม
CMCDragonkai

@CMCDragonkai ใช่มันคือคุณสามารถเห็นมันในgit-scm.com/docs/git-push ฉันได้แก้ไขคำตอบแล้ว
VonC

มีการกระทำซ้ำหรือไม่?
CMCDragonkai

1
คุณสามารถทำ 'git submodule foreach คอมมิต' ได้ตลอดเวลา
reflog

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