ทำไมฉันถึงได้รับข้อขัดแย้งของต้นไม้ในการโค่นล้ม?


353

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

ฉันไม่คิดว่าสิ่งเหล่านี้ถูกตั้งค่าสถานะอย่างถูกต้อง


คุณสามารถให้สูตรทำซ้ำปัญหานี้โดยเริ่มจากพื้นที่เก็บข้อมูลว่างเปล่าได้ไหม
Wim Coenen

ฉันจะพยายามหาเวลาวันนี้เพื่อสร้าง repo ใหม่และทดสอบสิ่งนี้และรับผลลัพธ์เดียวกันและโพสต์กลับ ขอบคุณ
เกร็ก

คำตอบ:


399

ฉันพบวิธีแก้ปัญหาการอ่านลิงก์ที่ Gary ให้ไว้ (และฉันแนะนำให้ทำตามวิธีนี้)

การสรุปเพื่อแก้ไขข้อขัดแย้งแผนผังการยอมรับไดเร็กทอรีการทำงานของคุณด้วย SVN ไคลเอ็นต์ 1.6.x คุณสามารถใช้:

svn resolve --accept working -R .

ที่.เป็นไดเรกทอรีในความขัดแย้ง

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

ด้วยวิธีนี้เราแนะนำให้ SVN แก้ไขข้อขัดแย้ง ( --resolve) ยอมรับสำเนาการทำงานภายในแซนด์บ็อกซ์ของคุณ ( --accept working) ซ้ำ ( -R) เริ่มจากไดเรกทอรีปัจจุบัน ( .)

ใน TortoiseSVN การเลือก "แก้ไข" เมื่อคลิกขวาจะช่วยแก้ไขปัญหานี้ได้จริง


32
ด้วยวิธีนี้คุณแนะนำให้ svn เพื่อแก้ไขข้อขัดแย้ง (- แก้ไข), ยอมรับสำเนาการทำงานภายในแซนด์บ็อกซ์ของคุณ (- ยอมรับการทำงาน), เรียกซ้ำ (-R), เริ่มจากไดเรกทอรีปัจจุบัน (.) HTH
gicappa

22
ใน TortoiseSvn การเลือก "แก้ไข" เมื่อคลิกขวาจะช่วยแก้ไขปัญหานี้ได้จริง
understack

40
สิ่งนี้ไม่เพียงแค่ยอมรับสำเนาการทำงานหรือไม่? ฉันหมายความว่าฉันรู้สึกเหมือนฉันไม่สามารถบอกได้ว่าปัญหาอยู่ที่ไหนกับความขัดแย้งเหล่านี้ แต่ถ้าฉันเพิ่งแก้ไขและยอมรับการทำงานมันจะไม่เพียงลบงานของคนอื่น?
Parris

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

5
@TWiStErRob ฉันขอยืนยันว่าอาการนี้บ่งบอกถึงปัญหาที่มีอยู่ใน SVN เป็นเครื่องมือควบคุมเวอร์ชัน ส่วนตัววิธีการ git'หลีกเลี่ยงปัญหานี้ในอนาคตจะมีการใช้งาน เนื่องจากเป็นไปได้ว่าไม่ใช่ตัวเลือกที่ใช้งานได้จริงสำหรับผู้ถามดังนั้นการรับมือกับสถานการณ์เนื่องจากคำตอบนี้เป็นคำตอบที่ดีที่สุด
Jess Telford

59

การโค่นล้ม 1.6 เพิ่ม Tree Conflicts เพื่อปกปิดความขัดแย้งในระดับไดเรกทอรี ตัวอย่างที่ดีคือเมื่อคุณลบไฟล์ในเครื่องการอัปเดตจะทำให้ข้อความเปลี่ยนไปในไฟล์นั้น อีกอย่างคือเมื่อคุณมีการโค่นล้มการเปลี่ยนชื่อไฟล์ที่คุณกำลังแก้ไขเนื่องจากเป็นการกระทำเพิ่ม / ลบ

CollabNet ของการโค่นล้มบล็อกมีบทความดีดีบนต้นไม้ความขัดแย้ง


9
ตัวอย่างเหล่านี้คุณไม่เกี่ยวข้องกับสถานการณ์ของฉัน บางทีคำอธิบายของฉันไม่ชัดเจน?
Greg

33

จากประสบการณ์ของฉัน SVN สร้างความขัดแย้งแบบทรีเมื่อใดก็ตามที่ฉันลบโฟลเดอร์ ดูเหมือนจะไม่มีเหตุผล

ฉันเป็นคนเดียวที่ทำงานกับรหัสของฉัน -> ลบไดเรกทอรี -> กระทำ -> ความขัดแย้ง!

ฉันไม่สามารถรอที่จะเปลี่ยนไปGit

ฉันควรชี้แจง - ผมใช้Subclipse นั่นอาจเป็นปัญหา! อีกครั้งฉันรอไม่ไหวที่จะเปลี่ยน ...


2
ปัญหาเดียวกันจากไคลเอนต์บรรทัดคำสั่ง SVN ดังนั้นจึงไม่ใช่ Eclipse
dolmen

3
ฉันมีปัญหาเดียวกันกับ NetBeans และ SVN ลบไดเรกทอรี -> ความขัดแย้ง
Gruber

2
ปัญหาเดียวกันที่นี่ ... น่ารำคาญมาก ... ต้องย้อนกลับอัปเดตลบและ
คอม

1
ฉันค้นพบกลวิธีที่ยอดเยี่ยมกับ IntelliJ Idea เมื่อฉันได้รับความขัดแย้งของต้นไม้ ฉันเก็บการเปลี่ยนแปลงทั้งหมดของฉัน (ซึ่งเหมือนกับการสร้างแพทช์การเปลี่ยนแปลงของฉันจากนั้นย้อนกลับ) จากนั้นฉันจะอัปเดต svn เพื่อรับการเปลี่ยนแปลงล่าสุดจากการโค่นล้ม หลังจากนั้นฉันยกเลิกการเก็บชั้นวางการเปลี่ยนแปลงของฉัน (เช่นเดียวกับการใช้แพทช์) และวิโอล่า!
ehrhardt

1
ฉันดูเหมือนจะมีปัญหาเดียวกันโดยใช้ไคลเอ็นต์ svn 1.7.9 บน Ubuntu 12.04.4 LTS กับ Assembla repos
siliconrockstar

28

ฉันไม่ทราบว่าสิ่งนี้เกิดขึ้นกับคุณหรือไม่ แต่บางครั้งฉันเลือกไดเรกทอรีที่ไม่ถูกต้องเพื่อรวมและฉันได้รับข้อผิดพลาดนี้แม้ว่าไฟล์ทั้งหมดจะปรากฏอย่างสมบูรณ์

ตัวอย่าง:

ผสาน / svn / โครงการ / สาขา / บางสาขา / แหล่งที่มา / svn / โครงการ / ลำตัว ---> ความขัดแย้งของต้นไม้

ผสาน / svn / โครงการ / สาขา / บางสาขาไปยัง / svn / โครงการ / trunk ---> ตกลง

นี่อาจเป็นข้อผิดพลาดที่โง่ แต่ก็ไม่ชัดเจนเสมอไปเพราะคุณคิดว่ามันเป็นอะไรที่ซับซ้อนกว่านี้


17

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

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

วิธีที่จะหลีกเลี่ยงสิ่งนี้คือทำการผสานพิเศษการรวมตัวใหม่ คุณสามารถทำได้โดยใช้--reintegrateสวิตช์

คุณสามารถอ่านเกี่ยวกับสิ่งนี้ได้ในเอกสาร: http://svnbook.red-bean.com/en/1.7/svn.branchmerge.basicmerging.html#svn.branchemerge.basicmerging.reintegrate

เมื่อรวมสาขาของคุณกลับไปที่ลำต้นอย่างไรก็ตามคณิตศาสตร์พื้นฐานนั้นแตกต่างกันมาก สาขาคุณลักษณะของคุณตอนนี้เป็นการผิดพลาดของทั้งการเปลี่ยนแปลงลำตัวที่ซ้ำซ้อนและการเปลี่ยนแปลงสาขาส่วนตัวดังนั้นจึงไม่มีการแก้ไขที่ต่อเนื่องกันเพื่อคัดลอก ด้วยการระบุตัวเลือก - รวมตัวอีกครั้งคุณกำลังขอให้การโค่นล้มเพื่อทำซ้ำการเปลี่ยนแปลงเหล่านั้นอย่างระมัดระวังเฉพาะสำหรับสาขาของคุณ (และอันที่จริงแล้วมันทำสิ่งนี้โดยการเปรียบเทียบทรีล่าสุดกับทรีสาขาล่าสุด: ความแตกต่างที่เกิดขึ้นคือการเปลี่ยนแปลงสาขาของคุณ!)

หลังจากรวมสาขาใหม่แล้วขอแนะนำให้นำออกอย่างมากมิฉะนั้นคุณจะได้รับ treeconflicts ทุกครั้งที่คุณรวมไปในทิศทางอื่น: จากลำต้นไปยังสาขาของคุณ (ด้วยเหตุผลเดียวกันกับที่อธิบายไว้ก่อนหน้านี้)

มีวิธีแก้ไขปัญหานี้เช่นกัน แต่ฉันไม่เคยลองเลย คุณสามารถอ่านได้ในโพสต์นี้: การรวมตัวใหม่สาขาการโค่นล้มใน v1.6


1
ลดลงเนื่องจาก--reintegrateตัวเลือกเลิกใช้แล้วในการโค่นล้ม 1.8 การเริ่มต้นด้วย SVN 1.8 การรวมเช่นนี้เป็นไปโดยอัตโนมัติ!
2559


ฉันคิดว่าการเพิ่มข้อมูลรุ่น SVN ลงในคำตอบจะเป็นไปตามลำดับ
Peter Mortensen

1
1.8 ที่นี่และมันจะไม่ทำงานหากไม่มีโซลูชันนี้
ฤดูหนาว

เพิ่มขึ้นเพราะนี่ตอบคำถามว่าทำไมสิ่งนี้ถึงเกิดขึ้น
Joshua Breeden

7

สิ่งนี้อาจเกิดจากการไม่ใช้ไคลเอนต์เวอร์ชันเดียวกันทั่ว

การใช้ไคลเอ็นต์เวอร์ชัน 1.5 และไคลเอ็นต์เวอร์ชัน 1.6 ไปยังที่เก็บเดียวกันสามารถสร้างปัญหาประเภทนี้ได้ (ฉันเพิ่งกัดตัวเอง)


4

หากคุณพบข้อขัดแย้งของทรีซึ่งไม่สมเหตุสมผลเนื่องจากคุณไม่ได้แก้ไข / ลบ / มาที่ใดก็ได้ใกล้กับไฟล์มีโอกาสดีที่จะมีข้อผิดพลาดในคำสั่งผสาน

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

สิ่งนี้สามารถเกิดขึ้นได้บนที่เก็บ 1.4 แห่งอย่างน้อยฉันไม่แน่ใจว่า mergetracking ที่แนะนำใน 1.5 ช่วยได้หรือไม่


2

จนกระทั่งวันนี้เป็นเวลาอย่างน้อย 3 เดือนที่ผ่านมาฉันพบความขัดแย้งของต้นไม้นับร้อยเป็นประจำเมื่อพยายามผสานสาขากลับเข้าไปในลำต้น (ใช้TortoiseSVN 1.11 ) ไม่ว่าจะถูกรีบูตหรือไม่ก็ตาม BTW ฉันใช้ TortoiseSVN มาตั้งแต่ v1 ในปี 2004 และฉันเคยรวมสาขาอีกครั้งตลอดเวลา มีบางอย่างเกิดขึ้นเร็ว ๆ นี้ที่ฉันคิดว่า?

ดังนั้นวันนี้ฉันจึงทำการทดลองง่ายๆและพบสิ่งที่สร้างความขัดแย้งที่บ้าคลั่งเหล่านี้:

  1. ฉันหักงวง @ 393;
  2. ฉันแก้ไขไฟล์หลายสิบไฟล์แบบสุ่มรวมถึงการสร้างไฟล์ใหม่
  3. ฉันมุ่งมั่น ตอนนี้ @ 395 (เพื่อนร่วมงานแยกออกที่ 394 เพื่อแสดงสิ่งของของเขาเอง)
  4. จากนั้นฉันพยายามที่จะรวมสาขากลับเข้าไปในลำต้นทดสอบเท่านั้น ทำตามคำแนะนำของ TortoiseSVN ในตัวช่วยสร้าง: "เพื่อรวมการแก้ไขทั้งหมด (รวมไปถึง), ปล่อยให้กล่องนั้นว่างเปล่า" เพื่อให้บรรลุสิ่งนี้ฉันคลิกขวาที่โฟลเดอร์ trunk และเลือก "TortoiseSVN> ผสานจาก / path / to / branch" และฉันปล่อยช่วง rev ว่างเปล่าตามที่แนะนำในกล่องโต้ตอบ

การสนทนา: (ดูเอกสารแนบ)

การแก้ไขทั้งหมด ... ของอะไร ฉันรู้น้อยว่าลูกค้าต้องอ้างถึง " การแก้ไขทั้งหมดของเป้าหมาย! (ลำตัว)" ในขณะที่กระบวนการคืนสู่สาขานั้นฉันเห็นการกล่าวถึง "การรวมการแก้ไข 1-HEAD"! พระเจ้าช่วย. ปีศาจแย่คุณกำลังจะตายที่นี่ สาขานั้นเกิดที่ 393 คุณไม่สามารถอ่านสูติบัตรของมันเพื่อเห็นแก่พระเจ้าได้ไหม?นี่คือสาเหตุที่ความขัดแย้งเกิดขึ้นมากมาย: SVN-cli กำลังเกิดเรื่องสนุกสนานจากการแก้ไข 1

ความละเอียด:

  1. ตรงกันข้ามกับสิ่งที่แนะนำโดยตัวช่วยสร้างระบุช่วงที่ครอบคลุมการแก้ไขทั้งหมดของ ... ชีวิตของสาขา! ดังนั้น394-HEAD ;
  2. ตอนนี้ทำการทดสอบผสานอีกครั้งแล้วรับซิการ์ ( ดูเอกสารแนบที่สอง)

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


1

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

ฉันได้รับการแก้ไขปัญหาโดยการย้ายไฟล์กลับกระทำและแล้วการรวมสาขาของฉัน จากนั้นฉันก็ย้ายไฟล์กลับมาหลังจากนั้น :) นั่นดูเหมือนจะทำเคล็ดลับ


1

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

svn delete --force ./SUB_DIR_NAME

จากนั้นคัดลอกอีกครั้งจากไดเรกทอรีรากอื่นในสำเนาการทำงานที่มี:

svn copy ROOT_DIR_NAME/SUB_DIR_NAME

จากนั้นทำ

svn cleanup

และ

svn add *

คุณอาจได้รับคำเตือนด้วยสิ่งสุดท้าย แต่เพียงเพิกเฉยและสุดท้าย

svn ci .

0

ฉันมีปัญหาเดียวกันนี้และมันแก้ไขได้โดยการทำผสานการใช้คำแนะนำเหล่านี้ โดยทั่วไปจะใช้ "การผสาน 2-URL" ของ SVN เพื่ออัปเดตtrunkเป็นสถานะปัจจุบันของสาขาของคุณโดยไม่ต้องใส่ใจมากเกี่ยวกับประวัติและความขัดแย้งของต้นไม้ บันทึกฉันจากการแก้ไขข้อขัดแย้งต้นไม้ 114 รายการด้วยตนเอง

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


5
ประวัติศาสตร์คือเหตุผลที่เราใช้ VCS ... หรือฉันขาดอะไรไป?
TWiStErRob

0

สถานการณ์ที่บางครั้งฉันพบ:

สมมติว่าคุณมีลำตัวซึ่งคุณสร้างสาขาย่อย หลังจากการเปลี่ยนแปลงบางอย่างบนลำต้น (โดยเฉพาะการสร้างไดเรกทอรี "some-dir") คุณสร้างฟีเจอร์ / แก้ไขสาขาที่คุณต้องการรวมในสาขาการวางจำหน่ายในภายหลังเช่นกัน (เนื่องจากการเปลี่ยนแปลงมีขนาดเล็กพอและฟีเจอร์ / แก้ไขเป็นสิ่งสำคัญสำหรับรีลีส) .

trunk -- ... -- create "some-dir" -- ...
     \                                  \-feature/fix branch
      \- release branch

หากคุณพยายามรวมฟีเจอร์ / แก้ไขสาขาลงในสาขารีลีสโดยตรงคุณจะได้รับข้อขัดแย้งต้นไม้ (แม้ว่าไดเรกทอรีไม่มีอยู่ในฟีเจอร์ / แก้ไขสาขา):

svn status
!     C some-dir
      >   local missing or deleted or moved away, incoming file edit upon merge

ดังนั้นคุณต้องรวมการคอมมิทที่ทำไว้บนลำตัวก่อนที่จะสร้างฟีเจอร์ / แก้ไขสาขาซึ่งสร้างไดเรกทอรี "some-dir" ก่อนที่จะรวมฟีเจอร์ / แก้ไขสาขา

ฉันมักจะลืมไปว่ามันไม่จำเป็นต้องมีคอมไพล์

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