โครงสร้างของที่เก็บ Git


15

ขออภัยถ้านี่เป็นรายการซ้ำฉันมอง

เรากำลังจะย้ายไป Git ในการโค่นล้มฉันเคยมีโฟลเดอร์ \ trunk, \ branch และ \ tags

ด้วย Git การสลับไปมาระหว่างสาขาจะแทนที่เนื้อหาของไดเรกทอรีการทำงานดังนั้นฉันถูกต้องที่จะสมมติว่าวิธีที่เราใช้ในการทำงานนั้นไม่ได้ใช้กับ Git

ฉันเดาว่าฉันจะมีโฟลเดอร์ repo ที่อาจเป็น gitignore และ readme.txt จากนั้นโฟลเดอร์สำหรับโครงการที่ประกอบเป็น repo และนั่นก็คือ

คำตอบ:


15

คุณจะมี "ลำตัว" ตอนนี้เรียกว่า "หลัก" คุณจะมี "กิ่งไม้" ตอนนี้เรียกว่า "หัว" และคุณจะมี "แท็ก" ยังคงเรียกว่า "แท็ก" แต่พวกเขาจะไม่เป็นโฟลเดอร์พวกเขาจะเป็น " refs ", เลเบลเพื่อแก้ไขที่อยู่ในเนมสเปซแยกต่างหากภายในที่เก็บ

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

ในทางกลับกัน Git มีแผนผังไดเรกทอรีที่มีการแก้ไขซึ่งแต่ละรายการกำหนดว่าเป็นผู้ปกครอง แต่การแก้ไขแต่ละรายการสามารถมีผู้ปกครองหลายคน (รวม) และเด็กหลายคน (สาขา) ดังนั้นแทนที่จะมีไดเรกทอรีสำหรับสาขาคุณจะได้สร้างการแก้ไขอย่างอิสระ "refs" เป็นเพียงชื่อที่เกี่ยวข้องกับการแก้ไขล่าสุดสำหรับ "branch" ที่กำหนด

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

โปรดทราบว่าใน Git การแก้ไขไม่ได้อยู่ในสาขาใด ๆ พวกเขาเป็นเพียงและสาขามีพวกเขา แต่เมื่อสาขาถูกรวมเข้าด้วยกันหรือพิสูจน์ว่าเป็นตรอกซอกซอยคุณสามารถลบ "ref" ที่ชี้ไปและลืมมันไปเลย (ถ้าคุณทิ้งการทดลองเก่า ๆ พวกเขาจะถูกเก็บขยะด้วยgit gc) สิ่งนี้จะช่วยให้คุณหลีกเลี่ยงการล้นในการทดลองแบบเก่าไม่มีใครจำสิ่งที่พวกเขากำลังทำอยู่ได้อีกต่อไป


เย็น. ไม่จำเป็นต้องใช้แท็กสาขาและโฟลเดอร์ไร้สาระอื่น ๆ น่ารัก
ลุค Puplett

2
@LukePuplett: วิธีการโค่นล้มของการแตกแขนงค่อนข้างพิเศษ มันมาจาก Perforce และฉันเชื่อว่านี่เป็นระบบควบคุมเวอร์ชันอื่นเท่านั้นที่มี ความจริงที่ว่าการโค่นล้มไม่ได้ทำให้เห็นความแตกต่างอย่างชัดเจนสาขาที่มีความซับซ้อนอย่างมากในขั้นตอนวิธีการรวม มันให้ความยืดหยุ่นบางอย่าง แต่ความยืดหยุ่นนั้นไม่ได้รับการสนับสนุนจากการรวม 3 ทิศทางทำให้เกิดปัญหามุมที่เข้าใจยาก
Jan Hudec

แม้แต่ CVS (ซึ่งเป็นรุ่นก่อนทางจิตวิญญาณของ SVNs) ก็ไม่ได้ใช้วิธีการแบบ branch-and-tags-are-จริงๆ-ไดเรกทอรี ฉันไม่ได้บอกว่า CVS ทำงานได้ดี แต่อย่างน้อยพวกเขาก็มีแนวคิดที่ "เหมาะสม" แทนที่จะเป็นเพียงไดเรกทอรี
Joachim Sauer เมื่อ

@JoachimSauer: ผมไม่แน่ใจว่า CVS มีการโค่นล้มของจิตวิญญาณบรรพบุรุษ พวกเขากำหนดภารกิจเพื่อให้ "CVS ที่ดีกว่า" แต่พวกเขาใช้แนวคิดจาก Perforce เป็นหลัก
Jan Hudec

@ JanHudec: นั่นอาจจะเป็นเรื่องดีฉันไม่รู้เกี่ยวกับ Perforce มากนัก สิ่งที่ฉันหมายถึงคือภารกิจดังกล่าว: เป็นผู้สืบทอดที่ดีต่อ CVS
Joachim Sauer เมื่อ

3

แค่คิดว่า Git เป็นมุมมอง 3 มิติของข้อมูลเดียวกับที่คุณเห็นใน 2D ใน SVN - เช่นเดียวกับ SVN คุณแยกสาขาของคุณรูทและมันจะปรากฏเป็นสำเนาที่แสดงเป็นโฟลเดอร์ใหม่ในทรี ด้วย Git เมื่อคุณแยกมันจะปรากฏเป็นสำเนาที่แสดงเป็น "เลเยอร์" บนต้นไม้ที่มีอยู่ของคุณ เมื่อคุณรู้ว่ามันค่อนข้างง่ายที่จะกำหนดความแตกต่าง

ด้วย SVN คุณยังสามารถทำงานในลักษณะเดียวกับ Git - สลับระหว่างสาขาจะแทนที่มุมมองเดียวของ codebase ด้วยมุมมองแบบกิ่งซึ่งจะใช้ไม่ว่าคุณจะใช้สวิตช์ svn หรือการชำระเงิน Git

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

เช่นเดียวกับแท็ก - คุณสามารถติดป้ายกำกับการแก้ไขคอมไพล์หรือคุณสามารถสร้างสาขาสำหรับการเปิดตัว แท็ก SVN เหมือนกันกับกิ่งก้านมีเพียงแบบแผนเดียวเท่านั้นที่เรียกว่า 'แท็ก' คุณสามารถติดป้ายกำกับ (บันทึกหมายเลขการแก้ไข) ของ repo SVN เพื่อรับสแน็ปช็อตของการปล่อยได้เช่นกัน

ความแตกต่างระหว่าง git และ svn นั้นเกี่ยวข้องกับการเช็คอินและเช็คเอาต์มากขึ้นไม่ใช่กับพื้นฐานการควบคุมแหล่งที่มา มุมมองของรหัสอาจแตกต่างกัน (คุณจะไม่เห็นมุมมองเดียวของโครงสร้างรหัสที่รวมสาขาใน git และคุณสามารถแยกสาขาที่เก็บบางส่วนใน SVN แต่ท้ายที่สุดแล้วสิ่งเหล่านี้แตกต่างเล็กน้อย)

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