ฉันจะเชื่อมโยงการพึ่งพาใน repo คอมไพล์ได้อย่างไร


149

ในสคริปต์ของฉันฉันมักจะใช้ห้องสมุด (ของฉันหรือของคนอื่น) ที่มี repos ของตัวเอง ฉันไม่ต้องการทำซ้ำสิ่งที่อยู่ใน repo ของฉันและติดอยู่กับการอัพเดททุกครั้งที่มีเวอร์ชันใหม่ออกมา อย่างไรก็ตามเมื่อมีคนโคลน repo มันควรจะทำงานในพื้นที่และไม่มีการเชื่อมโยงที่ขาด

ความคิดใด ๆ เกี่ยวกับสิ่งที่ฉันสามารถทำได้?

คำตอบ:


212

คุณสามารถทำได้ด้วย submodules ในคอมไพล์ ในที่เก็บของคุณให้ทำ:

git submodule add path_to_repo path_where_you_want_it

ดังนั้นหากที่เก็บของห้องสมุดมี URL git://github.com/example/some_lib.gitและคุณต้องการมันlib/some_libในโครงการของคุณคุณจะต้องป้อน:

git submodule add git://github.com/example/some_lib.git lib/some_lib

โปรดทราบว่าสิ่งนี้จะต้องทำจากไดเรกทอรีระดับบนสุดในที่เก็บของคุณ ดังนั้นอย่าcdเข้าไปในไดเรกทอรีที่คุณใส่ไว้ก่อน

หลังจากที่คุณเพิ่ม submodule หรือเมื่อใดก็ตามที่ใครบางคนทำการเช็คเอาต์ที่เก็บข้อมูลใหม่ของคุณคุณจะต้องทำสิ่งต่อไปนี้

git submodule init
git submodule update

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

เมื่อคุณต้องการอัปเดตเป็นไลบรารี่รุ่นที่ใหม่กว่าให้cdเข้าไปใน submodule และ pull:

cd lib/some_lib
git pull

จากนั้นเมื่อคุณทำgit statusคุณควรเห็นlib/somelibรายการในส่วนที่แก้ไข เพิ่มไฟล์นั้นยอมรับและคุณมีข้อมูลล่าสุด เมื่อผู้ทำงานร่วมกันดึงที่มอบให้กับที่เก็บของพวกเขาพวกเขาจะเห็นการlib/somelibแก้ไขจนกว่าพวกเขาจะทำงานgit submodule updateอีกครั้ง


2
ขอบคุณสำหรับคำตอบของคุณโหวตขึ้น! (และอาจจะยอมรับในวันพรุ่งนี้) มีวิธีเพิ่มไฟล์เดียวจาก repo อื่น ๆ เป็นการอ้างอิงหรือไม่ หรือจะต้องเป็นทั้งโฟลเดอร์?
Lea Verou

2
หากคุณต้องการติดตามว่าเป็น submodule (และทำให้สามารถดึงการอัปเดตได้อย่างง่ายดาย) คุณจะต้องดึงในพื้นที่เก็บข้อมูลทั้งหมด ไม่เหมือน VCS อื่น ๆ มากมาย git ต้องการเพียงแค่จัดการกับพื้นที่เก็บข้อมูลระดับบนสุดเท่านั้น
Emily

7
อ่านสิ่งนี้เพื่อทราบว่า submodule นั้นดีสำหรับอะไรและวิธีการแก้ไขปัญหาที่อาจเกิดขึ้น และการอภิปรายเกี่ยวกับเรื่องนี้
minghua

1
สมมติว่าคุณนำเข้าเป็น submodule repo อื่นที่คุณเป็นเจ้าของ คุณสามารถทำการเปลี่ยนแปลง repo ดั้งเดิมผ่านการเปลี่ยนแปลงภายในเครื่องของคุณใน submodule ได้หรือไม่? ให้บอกว่าคุณพบข้อผิดพลาดและจำเป็นต้องอัปเดตต้นฉบับหรือไม่
andrevenancio

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