วิธีการตั้งค่าโครงการคอมไพล์เพื่อใช้งาน repo submodule ภายนอก?


213

ฉันต้องการสร้าง repo ที่ดึงใน repo ระยะไกล

ตัวอย่างเช่นสมมติว่า jQuery เป็น submodule:

git://github.com/jquery/jquery.git

สิ่งที่จะเป็นกระบวนการในการสร้าง repo ด้วย jQuery เป็น submodule และเพิ่ม external ของฉันเองเป็น repo ระยะไกล

นอกจากนี้เมื่อมีการตั้งค่าถ้าฉันกด / ดึงที่รีโมทของฉันภายนอกจะยังคงอยู่หรือไม่


1
เมื่อคุณพูดว่า "pull in" คุณกำลังบอกว่าคุณต้องการให้ jQuery repo เป็น submodule ของ repo ของคุณเองหรือ
ezod

ใช่แน่นอนถ้ายังไม่ชัดเจน ฉันต้องการที่จะรู้ว่าฉันตั้งค่านี้เป็นภายนอกในขณะที่ผลักดันและดึงการเปลี่ยนแปลงในระยะไกลของตัวเอง
Tom

ดูการสอน Git Submoduleบนวิกิ git
เกร็กเบคอน

คำตอบ:


343
  1. คุณมีโครงการ - เรียกมันว่าMyWebAppที่มี repo github อยู่แล้ว
  2. คุณต้องการใช้ที่เก็บ jqueryในโครงการของคุณ
  3. คุณต้องการที่จะดึง repo jQuery ลงในโครงการของคุณเป็นsubmodule

Submodules นั้นง่ายต่อการอ้างอิงและใช้งาน สมมติว่าคุณมี MyWebApp ตั้งค่าเป็น repo จากปัญหา terminal คำสั่งเหล่านี้:

cd MyWebApp
git submodule add git://github.com/jquery/jquery.git externals/jquery

สิ่งนี้จะสร้างไดเรกทอรีชื่อexternals/jquery* และเชื่อมโยงไปยังที่เก็บ jquery github ตอนนี้เราแค่ต้องเริ่มต้น submodule และโคลนรหัส:

git submodule update --init --recursive

ตอนนี้คุณควรมีรหัสล่าสุดทั้งหมดในโคลน submodule หาก jquery repo เปลี่ยนแปลงและคุณต้องการดึงรหัสล่าสุดลงมาให้ออกsubmodule updateคำสั่งอีกครั้ง โปรดทราบ: โดยปกติฉันมีที่เก็บข้อมูลภายนอกจำนวนมากในโครงการของฉันดังนั้นฉันมักจะจัดกลุ่ม repos ภายใต้ไดเรกทอรี "externals"

หนังสือPro Gitออนไลน์มีข้อมูลที่ดีเกี่ยวกับ submodules (และ git โดยทั่วไป) นำเสนอในรูปแบบที่อ่านง่าย อีกวิธีหนึ่งคือgit help submoduleจะให้ข้อมูลที่ดี หรือดูที่บทช่วยสอน Git Submoduleบน git wiki

ฉันสังเกตเห็นรายการบล็อกนี้ซึ่งพูดถึงเกี่ยวกับ submodules และเปรียบเทียบกับ svn's subversion: กลไก externals: http://speirs.org/blog/2009/5/11/understanding-git-submodules.html

* ตามแนวทางปฏิบัติที่ดีที่สุดคุณควรวางซับไดเซ็ตไว้ในไดเรกทอรีของตัวเองเช่น Externals ถ้าคุณทำไม่ได้ไดเรกทอรีโปรเจ็กต์รูทของคุณจะกลายเป็นรกมากอย่างรวดเร็ว


4
คำอธิบายที่ดี! :) นอกจากนี้ "git help submodules" ช่วยถ้าคุณต้องการรายละเอียดเพิ่มเติมเล็กน้อย, internals, ฯลฯ
WhyNotHugo

2
ขอบคุณสิ่งที่ฉันต้องการ
MikeSchinkel

1
@Chevi มันขึ้นอยู่กับความต้องการของคุณ โดยทั่วไปการเพิ่มโครงการคอมไพล์เป็น submodule ให้กับโครงการของคุณเป็นทางออกที่ดีสำหรับโครงการที่เปลี่ยนแปลงบ่อยหรือยังอยู่ระหว่างการพัฒนา วิธีนี้ช่วยให้คุณมั่นใจได้ว่ารหัสบุคคลที่สามทั้งหมดในโครงการของคุณเป็นรุ่นล่าสุด สำหรับรหัสของบุคคลที่สามที่เป็นแบบคงที่ - รหัสที่เสถียรและเป็นผู้ใหญ่ซึ่งอาจจะไม่เปลี่ยนแปลงมากนักจากรุ่นสู่รุ่น - การใช้ submodule ไม่ได้ให้คุณค่ามากนัก
memmons

2
ขออภัยเมื่อเทียบกับภายนอก svn มันไม่ง่ายเลยนะ
Keil

2
@ Keil มันเป็นคำสั่งสองคำสั่งgit submodule addและgit submodule update... ฉันไม่แน่ใจว่ามันจะได้ง่ายขึ้นเท่าไหร่
memmons

24

สิ่งที่คุณต้องรู้ส่วนใหญ่ได้รับคำตอบแล้วดังนั้นฉันจะไม่ใส่ใจกับเรื่องนั้นอย่างไรก็ตามฉันพบข้อมูลเล็ก ๆ ที่มักจะหายไป

อย่างที่คุณทราบ "git pull" จะไม่อัปเดต submodules และ "git submodules update" จะไม่ดาวน์โหลด HEAD ล่าสุดของ submodules เหล่านั้นเช่นกัน

หากต้องการอัปเดต submodules ทั้งหมดของคุณไปสู่การแก้ไขอัปสตรีมล่าสุดคุณสามารถใช้

git submodule foreach git pull

หากคุณมักจะเปลี่ยนแปลง submodules ของคุณและมีจำนวนมากแล้ว "ge foreach" จะกลายเป็นสิ่งมีค่า



0

ฉันคิดว่าคำตอบ @Hugo อาจเป็นสิ่งที่คุณต้องการและทำงานได้ดี ดังนั้นฉันได้พบวิธีที่ง่ายขึ้น

git submodule update --remote

นั่นคือทั้งหมดที่

ดังนั้นขั้นตอนการทำงานที่สมบูรณ์อาจเป็น:

git clone project-with-submodules
git submodule init
git config -l
git submodule update --remote
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.