ฉันมีสองโครงการ SVN ในการใช้งานจากที่อื่นที่เก็บ SVN ใช้SVN: ภายนอก
ฉันจะมีโครงสร้างเค้าโครงพื้นที่เก็บข้อมูลเดียวกันใน Git ได้อย่างไร
ฉันมีสองโครงการ SVN ในการใช้งานจากที่อื่นที่เก็บ SVN ใช้SVN: ภายนอก
ฉันจะมีโครงสร้างเค้าโครงพื้นที่เก็บข้อมูลเดียวกันใน Git ได้อย่างไร
คำตอบ:
Git มีสองวิธีที่คล้ายกัน แต่ไม่เทียบเท่ากับ svn: externals:
การรวมย่อยต้นไม้แทรกรหัสของโครงการภายนอกลงในไดเรกทอรีย่อยแยกต่างหากภายใน repo ของคุณ นี่เป็นกระบวนการโดยละเอียดในการตั้งค่าและจากนั้นจะง่ายมากสำหรับผู้ใช้รายอื่นเนื่องจากจะถูกรวมโดยอัตโนมัติเมื่อที่เก็บข้อมูลถูกเช็กเอาต์หรือลอกแบบ นี่อาจเป็นวิธีที่สะดวกในการรวมการพึ่งพาในโครงการของคุณ
ง่ายต่อการดึงการเปลี่ยนแปลงจากโครงการอื่น แต่ซับซ้อนเพื่อส่งการเปลี่ยนแปลงกลับมา และถ้าโครงการอื่นต้องรวมจากรหัสของคุณประวัติโครงการจะถูกรวมเข้าด้วยกันและทั้งสองโครงการจะกลายเป็นหนึ่งเดียวได้อย่างมีประสิทธิภาพ
ลิงค์ Git submodules (แบบกำหนดเอง ) ไปยังการคอมมิทเฉพาะในที่เก็บของโครงการอื่นเช่น svn: externals พร้อม-r
อาร์กิวเมนต์ โมดูลย่อยนั้นง่ายต่อการติดตั้ง แต่ผู้ใช้ทุกคนจะต้องจัดการกับ submodules ซึ่งไม่รวมอยู่ใน checkouts (หรือโคลน) โดยอัตโนมัติ
แม้ว่ามันจะง่ายต่อการส่งการเปลี่ยนแปลงกลับไปที่โครงการอื่น ๆ การทำเช่นนั้นอาจทำให้เกิดปัญหาหาก repo มีการเปลี่ยนแปลง ดังนั้นโดยทั่วไปจะไม่เหมาะสมที่จะส่งการเปลี่ยนแปลงกลับไปยังโครงการที่อยู่ภายใต้การพัฒนาที่ใช้งานอยู่
svn:externals
มันได้เสมอไปได้ที่จะระบุตัวเลขที่แน่นอนกับการแก้ไข ด้วย revision 1.5 ทำให้ไวยากรณ์ถูกเปลี่ยนเป็นรูปแบบที่ยืดหยุ่นมากขึ้น สิ่งที่เพิ่มเข้ามาคือที่อยู่ URL สัมพัทธ์
ดังที่ฉันกล่าวถึงใน " 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
?
--depth
แต่ไม่ได้แก้ปัญหาจริงๆ
ฉันเป็นผู้เขียนเครื่องมือ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 ในรูปแบบต่อไปนี้:
ในที่สุดคุณต้องอัปเดตที่เก็บตัวอย่างรากของคุณ:
# 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 คอมไพล์
gil
คุณควรใส่คำปฏิเสธที่ด้านบนของโพสต์บอกว่าคุณเป็นผู้เขียน