svn: แทนที่ trunk ด้วย branch


155

วิธีที่ดีที่สุดในการทำให้หนึ่งในสาขาของพื้นที่เก็บข้อมูลการโค่นล้มเป็นลำตัวใหม่คืออะไร?

มีการเขียนซ้ำครั้งใหญ่สำหรับระบบทั้งหมด: สิ่งต่าง ๆ ถูกย้ายไปมาใหม่เขียนใหม่แทนที่นำออกเปลี่ยนชื่อ ฯลฯ รหัสที่เขียนใหม่นั้นได้รับการทดสอบแล้วและพร้อมที่จะแทนที่ลำต้นเก่า

โดยทั่วไปการฉีดยาเก่า (Trunk 5) จะถูกติดแท็กและจะสิ้นสุดที่นี่ สาขาที่เขียนใหม่ (สาขา 6) จะกลายเป็นฉีดใหม่ (Trunk 7):

Trunk (1) -> Trunk (2) -> Trunk (5) -> × + -> Trunk ใหม่ (7)
  \ \ |
  ส้อมรวม ???
    \ \ |
     + -> สาขา (3) -> สาขา (4) -> สาขา (6) - +

การเปลี่ยนแปลงอย่างต่อเนื่องทั้งหมดจาก 'Trunk' เก่าถูกรวมไว้ใน 'Rewritten Branch' แล้ว

ฉันจะทำสิ่งนี้ได้อย่างไร

คำตอบ:


118

ใช้svn moveเพื่อย้ายเนื้อหาของ trunk เก่าที่อื่นและเปลี่ยนชื่อสาขาเป็น trunk หลังจากนั้น

โปรดทราบว่าการคัดลอกและย้ายใน svn ทำงานเหมือนกับการทำงานของไฟล์ คุณสามารถใช้สิ่งเหล่านี้เพื่อย้าย / คัดลอกสิ่งต่าง ๆ ในที่เก็บของคุณและการเปลี่ยนแปลงเหล่านี้ก็เป็นเวอร์ชั่นเช่นกัน คิดว่า "ย้าย" เป็น "คัดลอก + ลบ"

[แก้ไข] Nilbus svn moveเพียงแจ้งผมว่าคุณจะได้รับความขัดแย้งผสานเมื่อคุณใช้

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


1
หากคุณทำสิ่งนี้ทุกคนที่มีการเปลี่ยนแปลงในสำเนาทำงานในลำต้นเดิมจะมีความขัดแย้งแม้ว่าการเปลี่ยนแปลงของพวกเขาควรจะรวม นี่เป็นเพราะไฟล์ถูกลบและเพิ่มใหม่ - พวกเขาจะถือว่าเป็นวัตถุแยกต่างหากที่มีประวัติแยกต่างหาก
Edward Anderson

@nilbus: คุณลองหรือยัง IIRC, SVN แสดงว่าไฟล์ถูกลบและอ่านแล้ว แต่ภายในจะทราบว่าไฟล์ถูกย้ายแล้ว
Aaron Digulla

ใช่. ฉันเช็คเอาท์สองชุด ในสำเนาแรกฉันย้าย dir A เป็น A2 และ dir B เป็น A จากนั้นย้าย A ไป B แล้ว A2 เป็น A (เปลี่ยนชื่อและเปลี่ยนชื่อกลับ) ในการชำระเงินครั้งที่สองฉันทำการเปลี่ยนแปลงไฟล์และพยายาม svn ปรับปรุง มันขัดแย้งเพราะไฟล์ที่ฉันเปลี่ยน "ถูกลบ" ภายในจะไม่บันทึกสำเนาไฟล์ซ้ำกัน แต่การลบที่คุณเห็นมีผลกระทบต่อคุณจริงๆเมื่อเกิดข้อขัดแย้ง
Edward Anderson

12
@ nilbus: ณ จุดนี้ฉันต้องการจะพูด Linus Torvalds: "สโลแกนของการโค่นล้มในขณะนั้นคือ" CVS ทำถูกต้อง "หรืออะไรทำนองนั้นและถ้าคุณเริ่มด้วยสโลแกนแบบนั้นไม่มีที่ไหนที่คุณสามารถทำได้ ไปไม่มีทางที่จะทำ CVS ได้ "
Aaron Digulla

3
อ๋อ ฉันจะเห็นด้วย เพื่อแก้ปัญหานี้ฉันลองตรวจสอบ repo ด้วย svn-git และใช้ git เพื่อทำการ rebase สาขาไปยังต้นแบบ
Edward Anderson

66

ฉันเห็นด้วยกับการใช้คำสั่งย้าย svn เพื่อบรรลุเป้าหมายนี้

ฉันรู้ว่าคนอื่นที่นี่คิดว่ามันผิดปกติ แต่ฉันชอบที่จะทำแบบนี้ <FeatureBranchName>-Mergedเมื่อฉันมีสาขาคุณลักษณะและผมพร้อมที่จะผสานกับลำต้นที่ยังได้รับการแก้ไขอย่างมีนัยสำคัญที่ผมจะผสานไปยังสาขาใหม่มักจะตั้งชื่อ จากนั้นฉันแก้ไขข้อขัดแย้งและทดสอบรหัสที่ผสาน เมื่อเสร็จแล้วฉันจะย้ายลำตัวไปยังโฟลเดอร์แท็กดังนั้นฉันจะไม่สูญเสียอะไรเลย สุดท้ายฉันก็ย้าย<FeatureBranchName>-Mergedไปที่ท้ายรถ

นอกจากนี้ฉันต้องการหลีกเลี่ยงสำเนาทำงานเมื่อทำการย้ายนี่คือตัวอย่างของคำสั่ง:

svn move https://SVNUrl/svn/Repo/trunk https://SVNUrl/svn/Repo/tags/AnyName

svn move https://SVNUrl/svn/Repo/branches/BranchName-Merged https://SVNUrl/svn/Repo/trunk

หมายเหตุ: ฉันใช้ 1.5


1
นั่นอาจไม่ใช่วิธีปฏิบัติที่ดีที่สุด แต่แน่นอนว่ามีประสิทธิภาพมากที่สุดเมื่อคุณมีลำต้นที่เก่าแก่มากและทุกคนทำงานในสาขาราวกับว่าเป็นลำต้น มันแก้ไขปัญหาของฉัน!
Alex Perrin

12

ฉันเพิ่งดูปัญหานี้เมื่อไม่นานมานี้และวิธีแก้ปัญหาที่ฉันมีความสุขมากกับการแสดง

svn ผสาน --ignore-ancestry trunk-url branch-url

บนสำเนาการทำงานของลำตัวของฉัน

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


1
โพสต์ svn 1.5 คุณควรจะทำการผสานที่เก็บประวัติไว้
NSherwin

9

แนะนำให้คุณทำการเปลี่ยนแปลงเหล่านี้ผ่านเครื่องมือที่เก็บเบราว์เซอร์

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


เชื่อมโยงไปยังคู่ค้าจะมีประโยชน์ (เพียงสำหรับ convenience- บันทึกการค้นหาของ Google :))
ไบรอันเมตรล่า

3
ขอโทษ การสะกดทำให้ดูเหมือนว่าฉันหมายถึงเครื่องมือเฉพาะ (แก้ไข) ที่จริงแล้วเครื่องมือ SVN GUI ส่วนใหญ่ควรมีคุณสมบัติที่เก็บเบราว์เซอร์ FYI: ฉันใช้เต่าtortoisesvn.tigris.org
Chris Nava

4

หากคุณต้องการทำให้สาขาเป็น trunk ใหม่ (เช่น) กำจัดการเปลี่ยนแปลงทั้งหมดใน trunk ที่สร้างขึ้นตั้งแต่ Branch ถูกสร้างขึ้นคุณสามารถทำได้ 1. สร้างสาขาของ trunk (เพื่อวัตถุประสงค์ในการสำรองข้อมูล) 2. "ย้อนกลับการเปลี่ยนแปลง "บนลำตัว (เลือกการแก้ไขทั้งหมดหลังจากสาขาถูกสร้างขึ้น 3 ผสานสาขากลับไปที่ลำต้น

ประวัติควรเป็นแบบนี้

ขอแสดงความนับถือ Roger


3

@Aaron Digulla และ @kementeus สามารถใช้งานได้ สำหรับที่เก็บ Subversion 1.4 การดำเนินการคัดลอก / ย้ายสามารถทำการโอนย้ายในอนาคตไปยังโครงสร้างที่เก็บอื่นหรือแยกที่เก็บได้ยาก

ฉันเชื่อว่าการปรับปรุง 1.5 รวมถึงการแก้ปัญหาการย้าย / การคัดลอกที่ดีกว่าดังนั้นจึงอาจไม่มีปัญหาสำหรับที่เก็บ 1.5

สำหรับที่เก็บ 1.4 ฉันขอแนะนำให้ใช้svnadmin dumpและsvndumpfilterดำเนินการเคลื่อนไหวของลำตัวที่มีอยู่ที่อื่นจากนั้นย้ายสาขาไปยังลำต้นด้วยกลไกเดียวกัน โหลด dumpfiles สองไฟล์ลงในที่เก็บข้อมูลทดสอบตรวจสอบแล้วย้ายไปยังการผลิต

แน่นอนสำรองที่เก็บข้อมูลที่มีอยู่ของคุณก่อนที่จะเริ่ม

สิ่งนี้รักษาประวัติโดยไม่ต้องบันทึกการย้าย / คัดลอกอย่างชัดเจนและทำให้องค์กรใหม่ในอนาคตรักษาประวัติง่ายขึ้น


แก้ไข: ตามที่ร้องขอเอกสารประกอบของพฤติกรรม 1.4 จากหนังสือ 1.4 Red-Bean, ประวัติการกรองที่เก็บ

นอกจากนี้เส้นทางที่คัดลอกจะทำให้คุณมีปัญหา การโค่นล้มสนับสนุนการดำเนินการคัดลอกในพื้นที่เก็บข้อมูลที่สร้างเส้นทางใหม่โดยการคัดลอกบางเส้นทางที่มีอยู่แล้ว เป็นไปได้ว่าในบางช่วงอายุการใช้งานของที่เก็บของคุณคุณอาจคัดลอกไฟล์หรือไดเรกทอรีจากบางตำแหน่งที่svndumpfilterไม่รวมไปยังตำแหน่งที่รวมอยู่ด้วย เพื่อที่จะทำให้ข้อมูลดัมพ์เป็นแบบพอเพียงsvndumpfilterต้องยังคงแสดงการเพิ่มพา ธ ใหม่ - รวมถึงเนื้อหาของไฟล์ใด ๆ ที่สร้างขึ้นโดยการคัดลอก - และไม่ได้แสดงถึงการเพิ่มว่าเป็นสำเนาจากแหล่งที่ไม่มีในสตรีมข้อมูลดัมพ์ที่กรองแล้วของคุณ แต่เนื่องจากรูปแบบดัมพ์ที่เก็บ Subversion แสดงเฉพาะสิ่งที่เปลี่ยนแปลงในแต่ละการแก้ไขเนื้อหาของสำเนาต้นฉบับอาจไม่พร้อมใช้งาน หากคุณสงสัยว่าคุณมีสำเนาของการเรียงลำดับนี้ในที่เก็บของคุณคุณอาจต้องการคิดใหม่ชุดเส้นทางรวม / ไม่รวมบางทีเส้นทางที่ทำหน้าที่เป็นแหล่งที่มาของการดำเนินการคัดลอกปัญหาของคุณด้วย

นี้ใช้กับการโยกย้าย / reorganizations svndumpfilterใช้ มีหลายครั้งที่งานพิเศษเล็ก ๆ น้อย ๆ ในขณะนี้สามารถบันทึกงานพิเศษจำนวนมากได้ในภายหลังและด้วยการทำให้การใช้งานง่ายsvndumpfilterสำหรับการโยกย้าย / การปรับโครงสร้างองค์กรในอนาคตลดความเสี่ยงด้วยต้นทุนที่ค่อนข้างต่ำ


ทำไม "svn move" ถึงไม่เพียงพอ? คำแนะนำของคุณดูเหมือนจะบีบแมลงวันด้วยค้อนขนาดใหญ่
Rob Williams

ฉันถูกกัดโดยพฤติกรรม 1.4 นี้ - ถ้าที่เก็บ SVN มีการย้าย (เปลี่ยนชื่อ) ของไดเรกทอรีหรือสาขา / แท็กใช้ svndumpfilter เพื่อช่วยจัดระเบียบใหม่ / ย้ายที่เก็บไปยังโครงสร้างใหม่อาจล้มเหลวเพราะมันไม่จัดการประวัติ ดี. มันเป็นเอกสารฉันจะขุดอ้างอิง ถ้าคุณชอบ
Ken Gentle

คุณสามารถเพิ่มการอ้างอิงถึงพฤติกรรมนี้ได้หรือไม่?
Jacco

2

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

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


ขอบคุณสำหรับข้อมูลอย่างเป็นทางการเพื่อให้ฉันสามารถรวมสาขากับลำต้นโดยผู้อนุมัติอย่างเป็นทางการ คำหลักคือreintegrate
Junyo

-3

มันเป็นรูปแบบแปลก ๆ / ผิดปกติจริงๆใน SVN แม้ว่าฉันคิดว่ามันไกลจากการเป็น "แนวปฏิบัติที่ดี" อยู่ดี แต่ฉันคิดว่าคุณสามารถทำสิ่งต่อไปนี้ได้:

  • ชำระเงิน sourcetree ทั้งหมด (svn co therootsourcetree)
  • ลบลำต้น (ลำต้น svn rm)
  • คัดลอกสาขาไปยังลำต้น (svn cp branch / thebranch / trunk)
  • ลบสาขา (svn rm branch / thebranch)
  • ยอมรับการเปลี่ยนแปลง

โชคดี


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