การย้าย repo SVN หลาย GB ไปยัง Git


13

ปัจจุบัน บริษัท ของฉันมี Visual Studio solation ใน repo SVN ที่จัดเป็นดังนี้:

SolutionFolder (~3.5 GB)
|-> SolutionName.sln
|-> .. Some source code folders... (~250 MB)
|-> ThirdParty (~3 GB)
|-> Tools
    | -> Tool1
    | -> Tool2

Tool1 และ Tool2 เป็นบิลด์อิสระ (มีโซลูชันของตัวเอง) แต่สร้างไฟล์ปฏิบัติการที่ใช้ในบิลด์หลัก โฟลเดอร์ ThirdParty มีการขึ้นต่อกันทั้งหมดของโครงการรวมถึงไฟล์. lib ขนาด 100+ MB ที่รวบรวมไว้ล่วงหน้าและไลบรารี่ขนาดใหญ่เช่นบูสต์

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

อะไรจะเป็นวิธีที่ดีที่สุดในการย้ายโครงสร้างโครงการนี้ไปคอมไพล์? สันนิษฐานว่าเป็นการดีที่สุดที่จะไม่รวม ThirdParty และเครื่องมือจาก repo หลัก แต่เราต้องการให้ ThirdParty ดาวน์โหลดได้ง่ายในขั้นตอนเดียวและเราชอบเวอร์ชัน (และเวอร์ชันไม่ตรงกันระหว่าง repo หลักและ ThirdParty / Tools จะไม่ดี)

ณ จุดนี้ฉันไม่ได้สนใจในการรักษาประวัติศาสตร์เพียงในการหาวิธีการจัดระเบียบโครงการดังกล่าว


ขนาดที่อยู่เหนือขนาดภายใน repos รวมถึงประวัติหรือขนาดของสำเนาการทำงานในท้องถิ่นหรือไม่
Doc Brown

1
@DocBrown เพียงสำเนาการทำงานในท้องถิ่นไม่รวมประวัติ
ikh

คำตอบ:


10

ใช้เครื่องมือที่เหมาะสมสำหรับงาน ใน Windows นั่นหมายถึง

ใช้ NuGet สำหรับการอ้างอิงบุคคลที่สาม

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

แน่นอนคุณสามารถใช้โซลูชันที่ใช้ git (repo อื่น, submodules และอื่น ๆ ) แต่นั่นเป็นเพียงการแฮ็ก การทำในสิ่งที่ถูกต้องจะชำระให้เร็วและทำให้คุณมีระบบพิสูจน์อนาคต

แก้ไขหลังจากความคิดเห็น: วิธีที่ดีที่สุดในการใช้ NuGet คือการตั้งค่าแหล่งที่มาของ NuGet ในพื้นที่ไม่ว่าจะเป็นบนไดรฟ์ที่ใช้ร่วมกันหรือเซิร์ฟเวอร์แบบเต็ม nuget การตั้งค่าไม่ควรใช้เวลามากกว่าสองสามนาที ด้วยวิธีนี้คุณสามารถรับประกันได้ว่าแพ็คเกจทั้งหมดที่คุณต้องการจะมีให้บริการเสมอไม่ว่าจะเกิดจากที่ใด


NuGet รองรับการสร้างบรรทัดคำสั่งหรือไม่? ฉันมักจะมองหางานสร้างแบบพกพาที่ฉันสามารถทำให้เจนกินส์สร้างและทดสอบให้ฉันได้ NuGet สนับสนุนเซิร์ฟเวอร์ CI เช่น Jenkins หรือไม่
uncletall

อีกหนึ่งความคิดคุณต้องใช้เวลานานแค่ไหนในการสนับสนุนผลิตภัณฑ์ของคุณ? หากคุณต้องการให้การสนับสนุนเป็นเวลานานฉันจะไม่นับรุ่นที่ถูกต้องของ libs บุคคลที่สามของคุณเพื่อให้สามารถใช้งานได้ใน NuGet คุณอาจประสบปัญหาใหญ่มากโดยใช้เครื่องมืออย่าง NuGet เพื่อให้ได้ชุดเครื่องมือของบุคคลที่สามที่ถูกต้องแม้ใน 2-3 ปีนับจากนี้
uncletall

3
@uncletall: ใช่ NuGet มีอินเตอร์เฟสบรรทัดคำสั่งที่สมบูรณ์ และความคิดคือการตั้งค่าพื้นที่เก็บข้อมูล NuGet ในพื้นที่ซึ่งอาจเป็นโฟลเดอร์บนเครือข่ายที่ใช้ร่วมกัน (เรียกว่า "ฟีด", docs.nuget.org/docs/creating-packages/ … )
Doc Brown

ใช่ฉันคิดว่าแน่นอนว่าคุณใช้กระจกในเครื่อง ฉันจะอัปเดตคำตอบ
Wilbert

2
@ มันค่อนข้างง่ายและตรงไปตรงมาเพื่อสร้างแพ็คเกจ nuget สำหรับการอ้างอิงภายนอก ฉันต้องการประมาณครึ่งวันในการจัดแพคเกจการอ้างอิง 9 กับ 50 ที่กำลังไม่เคยทำมาก่อน
Wilbert

5

คุณสามารถใช้submodulesสำหรับเครื่องมือ ด้วยวิธีนี้คุณสามารถเก็บไว้ในไดเรกทอรีย่อยอย่างที่คุณทำตอนนี้และใช้ repo แยกต่างหากสำหรับการกำหนดเวอร์ชัน นั่นก็หมายความว่าคุณสามารถโคลน (ชำระเงิน) เครื่องมือและพัฒนาแยกต่างหากและโครงการอื่น ๆ อาจพึ่งพา repos เหล่านั้น - และในเวอร์ชันที่เฉพาะเจาะจงและน่าเชื่อถือเช่นกัน

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


4

เอนทิตีที่คุณเปลี่ยนเป็นที่เก็บคอมไพล์จำเป็นต้องเป็นเอนทิตีที่คุณใช้เวอร์ชันและสาขา หากSolutionFolder/Tools/Tool1สอดคล้องกับสิ่งหนึ่งนั่นคือระดับของเอนทิตี เพราะนี่คือคอมไพล์นับถือทั้งรัฐของต้นไม้ไดเรกทอรีที่จะเป็นนิติบุคคลที่ versionable ในขณะที่มี SVN มันเป็นไปได้ (แม้ว่าจะไม่ได้เป็นความคิดที่ดี) จะมีtrunk, branchesและtagsที่ใดก็ได้ภายในต้นไม้

สิ่งประดิษฐ์ที่ได้มาไม่ควรเก็บไว้ในที่เก็บและไม่ควรมีห้องสมุดภายนอก มีวิธีที่ดีกว่าในการจัดการกับสิ่งเหล่านั้น (หากคุณกำลังทำงานกับ Java ให้พิจารณาใช้ที่เก็บ Maven ส่วนตัวซึ่งค่อนข้างง่ายต่อการใช้งานและรวมเข้ากับสิ่งอื่น ๆ อีกมากมาย)

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


ตัวเลือกสำหรับการจัดการไลบรารีภายนอกมีอะไรบ้าง เราทำงานกับ Visual Studio ด้วย C ++ และ C # ดังนั้น Maven จึงดูไม่เข้าท่า ปัญหาหลักของที่นี่คือการมีThirdPartyโฟลเดอร์ใน repo นั้นสะดวกสบายมากและมันก็ยากที่จะหาทางเลือกที่ดี
ik

2
@ikh: ในสภาพแวดล้อม Visual Studio โดยทั่วไปแล้วคุณจะใช้ Nuget สำหรับสิ่งนี้docs.nuget.orgซึ่งรวมอยู่ใน VS 2012 และรุ่นที่ใหม่กว่าแล้ว
Doc Brown

2

บอกตามตรงฉันจะไม่เปลี่ยนแปลงอะไรในการตั้งค่าของคุณ มันเป็นสิ่งที่เรากำลังทำอยู่ตอนนี้ ฉันกำลังเล่นกับการตั้งค่าพื้นที่เก็บข้อมูล git แยกต่างหากเพื่อจัดการ lib บุคคลที่สามที่เราใช้ แต่ฉันไม่คิดว่ามันจะหนักกับต้นทุนในการพกพา ตอนนี้นักพัฒนาซอฟต์แวร์ทุกคนสามารถชำระเงินและเริ่มต้นได้โดยไม่ต้องทำตามขั้นตอนการตั้งค่าด้วยตนเอง และฉันสร้างใด ๆ เซิร์ฟเวอร์ / ทาสสามารถสร้างโครงการ เว้นแต่คุณจะมี repos หลายตัวที่ใช้เครื่องมือ thridparty ร่วมกันฉันจะติดกับการตั้งค่าปัจจุบันของคุณ

สิ่งที่ฉันเล่นด้วยคือการตั้งค่าเครื่องมือของบุคคลที่สามใน repo แยกต่างหาก จากนั้นฉันมีสคริปต์แบตช์ง่าย ๆ หนึ่งตัวอ่านไฟล์ข้อความที่มีการอ้างอิง sha1 และตรวจสอบรุ่นที่ถูกต้อง สิ่งนี้จะทำให้ฉันมีรุ่นที่สามที่แตกต่างกันสำหรับโครงการที่แตกต่างกัน ฉันได้รับแนวคิดนี้จากเครื่องมือสร้าง Facebook Buck แต่ในที่สุดนักพัฒนาหลายคนไม่ชอบใช้เครื่องมือบรรทัดคำสั่ง (ร้านค้า MS VC ที่นี่) ดังนั้นฉันจึงเลิกคิด

เหตุผลหนึ่งที่สำคัญว่าทำไมไม่ดาวน์โหลด libs บุคคลที่สามของคุณเมื่อคุณต้องการ (ใช้ NuGet) คือถ้าคุณต้องการสนับสนุนผลิตภัณฑ์ของคุณเป็นเวลานาน ในอุตสาหกรรมของฉันเราจำเป็นต้องให้การอัปเดตสำหรับเวอร์ชันเก่าที่อาศัย libs ของบุคคลที่สามเก่า เราไม่ต้องการใช้เวลามากมายในการแยกแยะว่า libs ใดที่เราสามารถอัพเกรดได้หรือไม่และเพียงแค่ใช้ libs ตามที่ใช้ในเวอร์ชันนั้น ทีนี้ลองนึกว่าคุณใช้ NuGet แล้วอ๊ะ ... เวอร์ชันล่าสุดของ lib ที่คุณต้องการคือ 3.98 แต่คุณต้อง 2.04 ..... วิธีอธิบายเจ้านายของคุณว่าคุณต้องใช้เวลา 2 เดือนในการอัพเกรดเวอร์ชั่นเก่าเพื่อให้สามารถใช้งานได้ ใช้ libs ล่าสุดเมื่อเขาคาดหวังว่าจะมีการเปลี่ยนแปลงเล็กน้อย!


3
แม้ว่าฉันจะให้ +1 แก่คุณเนื่องจาก "ปล่อยให้ทุกอย่างเหมือนเดิม" เป็นวิธีแก้ปัญหาอย่างจริงจังฉันคิดว่า "repos หลายรายการ" อาจไม่ใช่ปัญหาเดียว DVCS เช่น Git กระตุ้นให้มีสาขาในท้องถิ่นหลายแห่งและในแต่ละสาขาจะมีสำเนาของทุกอย่างในท้องถิ่น ดังนั้นสิ่งนี้อาจนำไปสู่การมีห้องสมุดบุคคลที่สามที่ใหญ่เหมือนกัน (โดยทั่วไปคือรุ่นเดียวกัน!) หลายครั้งเป็นสำเนาในเครื่อง นี่อาจเป็นไปได้ในบางสถานการณ์ในที่อื่น ๆ ฉันสามารถจินตนาการได้ว่าสิ่งนี้จะมีผลกระทบด้านลบต่อประสิทธิภาพของการแตกแขนงและการผสาน
Doc Brown

เท่าที่ฉันรู้สาขาคือการดำเนินการที่ถูกมากใน Git ที่จะสร้างตัวชี้และใช้พื้นที่เกือบเป็นศูนย์
uncletall


กิ่งก้านสาขาต่างก็ฟรีใน Git ฉันเพิ่งตรวจสอบ. git / refs / heads และทุกสาขาเป็นไฟล์ข้อความ 1KB, .git / logs / refs / head มีบันทึกที่ใหญ่ที่สุดคือ 11KB สำหรับต้นแบบ .. โครงสร้างโครงการปกติของฉันอยู่ที่ประมาณ 500MB ในรหัส libs บุคคลที่สามและเครื่องมืออื่น ๆ ฉันมีความสุขมากที่ได้รับผลประโยชน์ 1KB สำหรับการสร้างสาขา
uncletall

1
@MichaelT: การแตกแขนงตัวเองนั้นฟรีแน่นอน แต่ฉันกำลังพูดถึงสถานการณ์ที่คุณมีสำเนาการทำงานของสาขาต่างๆ หลายตัวบนเวิร์กสเตชันท้องถิ่นของคุณพร้อมกัน และถ้าคุณตรวจสอบความคิดเห็นด้านล่างคำถามเดิม OP ได้อ้างถึงเครื่องมือ 3GB ของบุคคลที่สามเป็นขนาดของสำเนาการทำงาน
Doc Brown
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.