SVN: externals เทียบเท่าใน Git?


177

ฉันมีสองโครงการ SVN ในการใช้งานจากที่อื่นที่เก็บ SVN ใช้SVN: ภายนอก

ฉันจะมีโครงสร้างเค้าโครงพื้นที่เก็บข้อมูลเดียวกันใน Git ได้อย่างไร


คุณควรมีลักษณะเป็นsubmodules Git ควรอนุญาตเกือบสิ่งที่คุณกำลังมองหา
foxxtrot

7
ทุกคนมีคำตอบใหม่สำหรับเรื่องนี้ใน 4 ปีที่ผ่านมาหรือโลกใบนี้เหมือนกันหรือไม่?
DougW

4
@DougW ใช่ฉันมีคำตอบใหม่ด้านล่าง : git submoduleสามารถเลียนแบบได้svn:external(ตั้งแต่มีนาคม 2013)
VonC

สำหรับ Git รุ่นล่าสุดฉันขอแนะนำให้อ่านเกี่ยวกับGit submodulesในเอกสารทางการของ Git
Bulki S Maslom

คำตอบ:


134

Git มีสองวิธีที่คล้ายกัน แต่ไม่เทียบเท่ากับ svn: externals:

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

  • ลิงค์ Git submodules (แบบกำหนดเอง ) ไปยังการคอมมิทเฉพาะในที่เก็บของโครงการอื่นเช่น svn: externals พร้อม-rอาร์กิวเมนต์ โมดูลย่อยนั้นง่ายต่อการติดตั้ง แต่ผู้ใช้ทุกคนจะต้องจัดการกับ submodules ซึ่งไม่รวมอยู่ใน checkouts (หรือโคลน) โดยอัตโนมัติ
    แม้ว่ามันจะง่ายต่อการส่งการเปลี่ยนแปลงกลับไปที่โครงการอื่น ๆ การทำเช่นนั้นอาจทำให้เกิดปัญหาหาก repo มีการเปลี่ยนแปลง ดังนั้นโดยทั่วไปจะไม่เหมาะสมที่จะส่งการเปลี่ยนแปลงกลับไปยังโครงการที่อยู่ภายใต้การพัฒนาที่ใช้งานอยู่


17
FYI ตอนนี้เป็นไปได้ที่จะระบุการแก้ไขเฉพาะด้วย svn: externals ตอนนี้ (ตั้งแต่ 1.5 หรือ 1.6 ฉันเชื่อ?)
เนทพาร์สันส์

9
ในปีงบประมาณ, submodules git สามารถจัดการได้โดยอัตโนมัติและมุ่งมั่น git สร้างไฟล์. gitmodules ที่สามารถ / ควรถูกคอมมิตเหมือนกับไฟล์. gitignore ดู [ git-scm.com/book/en/Git-Tools-Submodules]สำหรับข้อมูลเพิ่มเติม
mikijov

5
@NateParsons svn:externalsมันได้เสมอไปได้ที่จะระบุตัวเลขที่แน่นอนกับการแก้ไข ด้วย revision 1.5 ทำให้ไวยากรณ์ถูกเปลี่ยนเป็นรูปแบบที่ยืดหยุ่นมากขึ้น สิ่งที่เพิ่มเข้ามาคือที่อยู่ URL สัมพัทธ์
David W.

@NateParsons แต่เป็นไปได้หรือไม่ที่จะตัดทอนการแก้ไขด้วย git submodules ... > _>
Trejkaz

ฉันคิดว่ามันเป็นไปไม่ได้ที่จะคอมไพล์ไฟล์ย่อยเช่นเดียวกับ svn: externals
user1911091

38

ดังที่ฉันกล่าวถึงใน " Git submodule new version update " คุณสามารถใช้คุณสมบัติภายนอก SVN เดียวกันกับ Git 1.8.2 submodules:

git config -f .gitmodules submodule.<path>.branch <branch>

นี่ก็เพียงพอแล้วสำหรับ submodule ที่จะติดตามสาขา (เช่นเดียวกับในล่าสุดกระทำของสาขาระยะไกลของrepo ต้นน้ำ submodule ) สิ่งที่คุณต้องทำคือ:

git submodule update --remote

ที่จะอัปเดต submodule

รายละเอียดเพิ่มเติมอยู่ใน " git submoduleการติดตามล่าสุด "

ในการแปลง submodule ที่มีอยู่ให้เป็นหนึ่งการติดตามสาขา : ดูขั้นตอนทั้งหมดใน " Git submodules: ระบุ branch / tag "


คุณสามารถชำระเงินบางส่วนเช่นเดียวกับsvn:externals?
nowox

@nowox ใช่คุณสามารถเช็คเอาต์แบบเบาบาง (git 1.7+ stackoverflow.com/a/2372044/6309 ) ที่เกี่ยวข้องกับ submodules ( stackoverflow.com/a/17693008/6309 )
VonC

น่าเสียดายที่คำตอบที่เกี่ยวข้องกับการชำระเงินแบบกระจัดกระจายไม่เคยมีตัวอย่างใด :( ฉันจะพยายามเขียนตัวอย่างแบบสรุปสาระสำคัญสำหรับเรื่องนี้ ...
nowox

ยังมีปัญหากับสิ่งนี้ คุณยังต้องได้รับประวัติทั้งหมดของที่เก็บซึ่งคุณต้องการเพียงส่วนเล็ก ๆ ในกรณีของฉันคือ 100kB มากกว่า 2GB ฉันสามารถใช้งานได้แน่นอน--depthแต่ไม่ได้แก้ปัญหาจริงๆ
nowox

@nowox วิธีที่ดีที่สุดคือถามคำถามใหม่ที่อธิบายว่ากรณีการใช้งานของคุณคืออะไร: ฉันไม่รู้ว่า repo 2GB ของคุณเป็น submodule หรือ repo หลักที่มี submodule และสิ่งที่คุณต้องแยกออกมา
VonC

3

ฉันเป็นผู้เขียนเครื่องมือgil (ลิงก์ git)

ฉันมีวิธีแก้ไขปัญหาอื่นสำหรับเครื่องมือ - gil (ลิงก์ git)

ช่วยให้สามารถอธิบายและจัดการการพึ่งพาที่เก็บคอมไพล์ที่ซับซ้อน

นอกจากนี้ยังให้บริการโซลูชั่นที่จะเป็นปัญหาการพึ่งพา submodules recursive คอมไพล์

พิจารณาว่าคุณมีการพึ่งพาโครงการต่อไปนี้: ตัวอย่างกราฟการพึ่งพาที่เก็บข้อมูล git

จากนั้นคุณสามารถกำหนด.gitlinksไฟล์ด้วยคำอธิบายที่เกี่ยวข้องกับที่เก็บ:

# Projects
CppBenchmark CppBenchmark https://github.com/chronoxor/CppBenchmark.git master
CppCommon CppCommon https://github.com/chronoxor/CppCommon.git master
CppLogging CppLogging https://github.com/chronoxor/CppLogging.git master

# Modules
Catch2 modules/Catch2 https://github.com/catchorg/Catch2.git master
cpp-optparse modules/cpp-optparse https://github.com/weisslj/cpp-optparse.git master
fmt modules/fmt https://github.com/fmtlib/fmt.git master
HdrHistogram modules/HdrHistogram https://github.com/HdrHistogram/HdrHistogram_c.git master
zlib modules/zlib https://github.com/madler/zlib.git master

# Scripts
build scripts/build https://github.com/chronoxor/CppBuildScripts.git master
cmake scripts/cmake https://github.com/chronoxor/CppCMakeScripts.git master

แต่ละบรรทัดอธิบายลิงก์ git ในรูปแบบต่อไปนี้:

  1. ชื่อเฉพาะของที่เก็บ
  2. เส้นทางสัมพัทธ์ของที่เก็บ (เริ่มจากเส้นทางของไฟล์. gitlinks)
  3. พื้นที่เก็บข้อมูล Git ซึ่งจะใช้ในคำสั่ง git clone สาขาที่เก็บเพื่อชำระเงิน
  4. บรรทัดว่างหรือบรรทัดที่ขึ้นต้นด้วย # จะไม่ถูกแยกวิเคราะห์ (ถือว่าเป็นความคิดเห็น)

ในที่สุดคุณต้องอัปเดตที่เก็บตัวอย่างรากของคุณ:

# Clone and link all git links dependencies from .gitlinks file
gil clone
gil link

# The same result with a single command
gil update

ผลที่ตามมาคุณจะโคลนโครงการที่จำเป็นทั้งหมดและเชื่อมโยงกับแต่ละอื่น ๆ ในวิธีที่เหมาะสม

หากคุณต้องการยอมรับการเปลี่ยนแปลงทั้งหมดในที่เก็บบางแห่งด้วยการเปลี่ยนแปลงทั้งหมดในที่เก็บลิงก์รองคุณสามารถทำได้ด้วยคำสั่งเดียว:

gil commit -a -m "Some big update"

คำสั่ง pull และ push ทำงานในลักษณะเดียวกัน:

gil pull
gil push

เครื่องมือ Gil (ลิงก์ git) รองรับคำสั่งต่อไปนี้:

usage: gil command arguments
Supported commands:
    help - show this help
    context - command will show the current git link context of the current directory
    clone - clone all repositories that are missed in the current context
    link - link all repositories that are missed in the current context
    update - clone and link in a single operation
    pull - pull all repositories in the current directory
    push - push all repositories in the current directory
    commit - commit all repositories in the current directory

เพิ่มเติมเกี่ยวกับปัญหาการพึ่งพา submodules recursive คอมไพล์


1
gilคุณควรใส่คำปฏิเสธที่ด้านบนของโพสต์บอกว่าคุณเป็นผู้เขียน
Daniel Kamil Kozar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.