ลบคุณสมบัติ svn: mergeinfo ที่ไม่จำเป็นออก


136

เมื่อฉันรวมสิ่งต่าง ๆ ในที่เก็บของฉันการโค่นล้มต้องการเพิ่ม / เปลี่ยนsvn:mergeinfoคุณสมบัติมากมายให้กับไฟล์ที่ไม่เกี่ยวข้องกับสิ่งที่ฉันต้องการผสานทั้งหมด

มีการถามคำถามเกี่ยวกับพฤติกรรมนี้ก่อนหน้านี้ที่ Stack Overflow:

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

ดังนั้นตอนนี้คำถามของฉัน: ฉันจะลบคุณสมบัติที่ไม่จำเป็นออกไปได้อย่างไร ฉันใช้ TortoiseSVN แต่ฉันลังเลที่จะตรวจสอบ / แก้ไขไฟล์หลายร้อยไฟล์ด้วยตนเอง มีวิธีที่ง่ายกว่าในการลบsvn:mergeinfoคุณสมบัติที่ไม่จำเป็นเหล่านั้นออกไหม

PS ฉันไม่ต้องการรหัส C ++ SVN API

คำตอบ:


142

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

จากรากของโครงการทำ:

svn propdel svn:mergeinfo -R
svn revert .
svn ci -m "Removed mergeinfo"

57
หรืออย่าทำบนรูทเดอร์ "svn propdel -R svn: mergeinfo ./*"
JeremyWeir

3
"svn propdel -R svn: mergeinfo ./* ./.^^. เหมือนกัน" ถ้าคุณมี "dot" / * ix ไฟล์ที่ซ่อนอยู่คงไม่ใช่ปัญหาสำหรับผู้ใช้ Windows ต่อคำถาม
ปีเตอร์

3
การยับยั้งความเร็วเอาต์พุต: "svn propdel svn: mergeinfo -R> nul" (หรือ> / dev / null โดยใช้ Linux)
bebbo

2
@JeremyWeir คุณหมายถึงอะไรโดย "แค่ไม่ทำมันใน root dir"? จากที่ไหน คุณมีจำนวนโหวตมากในความคิดเห็นนั้น แต่ฉันไม่เห็นทางเลือกอื่น
TT

3
@TT ฉันคิดว่าความคิดคือเพียงไปที่ dir ที่มีข้อมูลรวมทั้งหมดยุ่งและทำจากที่นั่นดังนั้นคุณไม่ต้องเปลี่ยนไดเรกทอรีราก คุณไม่ต้องการยุ่งกับ mergeinfo ของรูท
JeremyWeir

15

นี่เป็นวิธีการลบทรีย่อย svn: คุณสมบัติ mergeinfo ทั้งหมด รันภายในรูทของที่เก็บของคุณ:

svn propget svn:mergeinfo --depth=infinity 
    | grep -v "^/"
    | grep -v "^\."   
    | cut -d- -f1 
    | xargs svn propdel svn:mergeinfo

ทั้งหมดในบรรทัดเดียวสำหรับการคัดลอก / วางง่าย:

svn propget svn:mergeinfo --depth=infinity | grep -v "^/" | grep -v "^\." | cut -d- -f1 | xargs svn propdel svn:mergeinfo

หากต้องการดูตัวอย่างว่าไฟล์นี้จะมีผลอะไรก่อนที่จะเรียกใช้ให้เปลี่ยน "propdel" ล่าสุดเป็น "propget" หรือลบไพพ์ xargs สุดท้ายโดยสิ้นเชิง


2
ทำงานร่วมกับเครื่องหมายขีดคั่นในไฟล์: svn propget -R svn: mergeinfo | grep -v "^ /" | grep -v "^ \." | ตัด "-d" -f1 | xargs svn propdel svn: mergeinfo
Squirrel

12

ตามที่กล่าวไว้ในหัวข้อนี้ :

  • mergeinfo ว่างเปล่าส่วนใหญ่ ("ว่างเปล่า") อาจเกิดจากการคัดลอกการทำงานไปยังการคัดลอก / ย้ายการทำงานที่รายการที่มาไม่มี mergeinfo ที่ชัดเจน การใช้ propdel อาจเป็นวิธีแก้ปัญหาเว้นแต่ว่าคุณกำลังใช้ 1.6 SVN: ตั้งแต่ 1.5.5 สำเนา WC-to-WC เหล่านี้จะไม่สร้าง mergeinfo ว่างบนปลายทางอีกต่อไป
  • การดำเนินการปรับโครงสร้าง svn move (เปลี่ยนชื่อ) ก่อนหน้านี้ยังสามารถเผยแพร่ mergeinfo แทนการปล่อยไว้ที่ไดเร็กทอรีรูท
  • มีปัญหาหน่วยความจำที่อาจเกิดขึ้นติดตามโดยกรณี 3393ซึ่งจะได้รับการแก้ไขในรุ่น 1.6.2 ที่จะมาถึงและกลับพอร์ตใน 1.5

6

เนื่องจากฉันไม่มั่นใจกับsvn:merge-infoการลบคุณสมบัติblind ฉันได้ใช้เครื่องมือเพื่อวิเคราะห์สถานการณ์ปัจจุบันบนสำเนาที่ใช้งานได้และลบการแก้ไขผสานมากที่สุดเท่าที่จะทำได้จากคุณสมบัติการผสานข้อมูลที่ไม่ใช่รูท หลังจากการตรวจสอบและควบคุมโดยมนุษย์เพิ่มเติมการเปลี่ยนแปลงในสำเนาการทำงานสามารถกระทำได้

นี่คือ: svn-clean-mergeinfo

อย่าลังเลที่จะรายงานปัญหาใด ๆ เกี่ยวกับการใช้งานเพื่อปรับปรุงให้ดีขึ้น

การโค่นล้ม 1.10 แนะนำเครื่องมือใหม่สำหรับงานนั้นโดยเฉพาะ: svn-mergeinfo-normalizer


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

ฉันยอมรับว่ามันไม่สมบูรณ์แบบ ... นั่นคือเหตุผลที่ "ยังต้องมีการตรวจสอบและควบคุมของมนุษย์" ในกรณีของคุณหากคุณระบุการแก้ไขที่ไม่เกี่ยวข้องในคุณสมบัติการผสานข้อมูลคุณสามารถลบการแก้ไขเหล่านี้หรือคุณสมบัติ svn: merge-info ทั้งหมดในไฟล์นั้นก่อนที่จะส่งข้อมูล โปรดใช้ GitHub เพื่อขอการปรับปรุง
Yves Martin

4

ฉันรู้ว่าไม่นานมานี้ แต่ฉันพบปัญหาที่คล้ายกัน ฉันใช้ TortoiseSVN 1.6.7 มันเพิ่งเกิดขึ้นว่าทรัพย์สินอยู่ในรากของสำเนาการทำงานของฉัน เมื่อฉันดูคุณสมบัติบนรูทแล้วคลิกเอาออกบน svn: mergeinfo มันถามฉันว่าต้องการลบซ้ำหรือไม่ นี่เป็นการกำจัด svn ของฉันทั้งหมด: mergeinfo cockups


ฉันอยู่ในสถานการณ์เดียวกัน ทำงานให้ฉัน ขอบคุณ!
andrewd18

2

หากคุณแน่ใจว่าต้องการลบคุณสมบัติ mergeinfo จำนวนมากคุณสามารถใช้สคริปต์ BASH ต่อไปนี้

FILES=`svn status |grep "^ M      " |sed s/" M      "// |tr '\n', ' '`
svn revert $FILES

จะได้รับรายการของไฟล์ที่ถูกเปลี่ยนแปลงกรองเป็นเพียงการเปลี่ยนแปลงเท่านั้น mergeinfo แยกทุกอย่างยกเว้นเส้นทางไฟล์จริงแปลงเส้นทางแบบหนึ่งต่อบรรทัดเป็นรายการที่คั่นด้วยช่องว่างและการโทรกลับรายการนั้น


2
Thanx แต่อย่างที่คุณอาจจะรู้จักกันจากฉันกล่าวขวัญ TortoiseSVN ฉันเป็นผู้ใช้ Windows และไม่ได้ใช้เปลือกทุบตี :-)
LeonZandman

สิ่งเดียวกันควรเป็นไปได้ใน DOS แม้ว่าอาจจะไม่กระชับ
Chase Seibert

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

2
เป็นรถที่ค่อนข้าง - มีชื่อไฟล์ที่มีช่องว่างในชื่อของมันหรือไม่? ด้วยชื่อตัวละครแบบกลม? ข่าวร้ายทั้งสองกรณี วิธีที่ได้รับการอนุมัติ / สนับสนุนเพื่อวิเคราะห์เอาต์พุตจากสถานะ svn กำลังใช้--xmlแฟล็กและตัวแยกวิเคราะห์ XML สิ่งอื่นใดสามารถเปลี่ยนแปลงได้ระหว่างเวอร์ชั่นต่าง ๆ เนื่องจากไม่รับประกันความเข้ากันได้กับรูปแบบเอาต์พุตต้นฉบับเดิม
Charles Duffy

2

แทนที่จะเพียงแค่ลบคุณสมบัติ mergeinfo แบบสุ่ม ๆ มันยังเป็นไปได้ที่จะทำการผสาน "ที่หายไป" ให้เสร็จสิ้น

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

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

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


1

หากต้องการเปลี่ยนแปลงโครงสร้างไดเรกทอรีสิ่งนี้จะเป็น (ไม่ใช่ DOS 'ค้นหา' เท่านั้น):

find . -path "*/.svn" -prune -or -exec svn propdel svn:mergeinfo '{}' \;

ใช้ไคลเอนต์ 1.6.12 เชื่อมต่อกับเซิร์ฟเวอร์ 1.5 ฉันมีปัญหาที่คล้ายกัน; มีเป็นไดเรกทอรีย่อยในโครงการที่ต้องการ SVN ของตัวเอง: mergeinfo แต่มี 121 รายการดังกล่าว (รวมทั้ง 5 ด้านล่างไดเรกทอรี ./var ด้วย "SVN: ไม่สนใจ *") ดูเหมือนว่าค่อนข้างไม่เหมาะสม ดังนั้นจะเป็นการดีถ้ามีสคริปต์ (เช่น Python) ซึ่งสามารถลบข้อมูลการผสานที่ไม่จำเป็นและบอกความแตกต่างอื่น ๆ ...

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