วิธีการเปลี่ยนการโค่นล้มทำงานสำเนา UUID?


13

ผมได้ปรับปรุงเมื่อเร็ว ๆ นี้ที่เก็บจากการโค่นล้มเก่า 1.2.3 รุ่น 1.6.0 ผ่านการถ่ายโอนข้อมูล svnadmin / โหลด ที่เก็บเก่าทั้งหมดใช้ UUID เดียวกัน (ที่เก็บถูกสร้างโดยใช้โดยการคัดลอกที่เก็บเท็มเพลต) ฉันได้เปลี่ยน UUID ในที่เก็บใหม่สองแห่งผ่านsvnadmin setuuidให้มีความโดดเด่น ฉันไม่สามารถย้ายสำเนาที่ทำงานที่มีอยู่ของที่เก็บเหล่านั้นเนื่องจาก UUID นั้นแตกต่างกัน ฉันรู้เกี่ยวกับการส่งออกสำเนาการทำงานและตรวจสอบจากพื้นที่เก็บข้อมูลใหม่ แต่ฉันสงสัยว่ามีวิธีการเพียงแค่เปลี่ยน UUID ของสำเนาการทำงานในสถานที่เช่นสิ่งที่svnadmin setuuidทำเพื่อที่เก็บ

คำตอบ:


3

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


17

คำตอบใหม่ตั้งแต่Subversion 1.7รูปแบบการคัดลอกที่ใช้งานได้ คุณต้องใช้sqlite3โปรแกรมอรรถประโยชน์บรรทัดคำสั่ง

ในไดเรกทอรีรากของสำเนาการทำงานของคุณขณะนี้มี.svn/โฟลเดอร์เดียวที่มีฐานข้อมูล SQLite คุณสามารถสืบค้นที่เก็บปัจจุบันที่UUIDรู้จักสำหรับสำเนาการทำงานของคุณด้วย:

$ sqlite3 .svn/wc.db 'select uuid from REPOSITORY where id=1'
b6dc3e6c-5320-4549-b231-c153d86d7525

ดังนั้นการเปลี่ยนแปลงUUIDสามารถทำได้ด้วย:

$ sqlite3 .svn/wc.db 'update REPOSITORY set uuid="1c0d1ec1-2326-0410-bef5-eb29cddfc032" where id=1'

แน่นอนให้สำรอง.svn/wc.dbไฟล์ไว้ก่อนที่จะเรียกใช้คิวรีอัพเดต แทบไม่มีโอกาสที่เอนทิตีที่เก็บของคุณมี id แตกต่างกันหรือมีหลายบรรทัดในตารางนั้น แต่คุณอาจตรวจสอบว่าคุณได้รับผลลัพธ์ที่ไม่คาดคิดหรือไม่


+1 ทำงานอย่างสมบูรณ์แบบด้วย repo ที่ย้ายที่เปลี่ยน UUID
Amro

8

นี่คือคำสั่งที่ใช้กลอุบายสำหรับ SVN 1.6 และต่ำกว่า:

find . -type f -name entries -exec sed -i 's/old-uuid/new-uuid/g' {} \;

แทนที่old-uuidและnew-uuidด้วยรหัสจริง


1
+ 1 ขอบคุณสำหรับการแก้ปัญหา สิ่งนี้ไม่ทำงานสำหรับไดเรกทอรีที่มีช่องว่าง "ค้นหา. -type f -name รายการ -exec sed -i 's / old-uuid / new-uuid / g' {} \;" ดูเหมือนว่าทำงานโดยไม่มีเครื่องหมายอัญประกาศ
Tommy

sry สำหรับ necroing เธรดนี้วิธีนี้ช่วยฉันหลายครั้ง .. สำหรับคนอื่นที่ลองใช้มัน, แค่ต้องการเพิ่มบันทึก ดูเหมือนว่าใน MACOX ดูเหมือนจะต้องการการใช้งานที่แตกต่างออกไปเล็กน้อยคุณจำเป็นต้องพูด sed -i "" 's/old-uuid/new-uuid/' และใช้งานได้ (เพียงแค่เครื่องหมายอัญประกาศคู่ว่างเปล่า) ( อ้างอิง )
Karthik T

2

คำตอบของ Yves Martin ใช้งานได้ดีมากสำหรับเรากับจำนวนสำเนาการทำงานกับ SVN 1.8 แต่เราได้พบกับกรณีที่มันไม่ทำงาน

ใช้คำสั่ง Yves โดยไม่มี "where id = 1" ทำงานในทุกกรณีสำหรับเรา:

$ sqlite3 .svn/wc.db 'update REPOSITORY set uuid="1c0d1ec1-2326-0410-bef5-eb29cddfc032"'

จากการตรวจสอบว่าทำไมจึงเกิดเหตุการณ์เช่นนี้ขึ้นฉันพบว่ามีการจัดเก็บ UUID หลายรายการเมื่อย้ายที่เก็บซึ่งตรงกันข้ามกับสัญชาตญาณของ Yves ที่ไม่ควรเกิดขึ้น

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

หนึ่งสามารถตรวจสอบรายชื่อของรากที่เก็บไว้และ UUIDs ในสำเนาการทำงานด้วยคำสั่งนี้:

$ sqlite3 .svn/wc.db 'select id,uuid,root from REPOSITORY'

ในที่สุดฉันจะทราบว่าฉันต้องใช้ชุดคำพูดที่แตกต่างกันสำหรับไฟล์บรรทัดคำสั่ง / แบทช์ Windows ดังนี้:

> sqlite3.exe .svn\wc.db "update REPOSITORY set uuid='1c0d1ec1-2326-0410-bef5-eb29cddfc032'"

ขอบคุณสำหรับรายละเอียดเมื่อมีการย้ายที่ทำงานฉันไม่ทราบถึงพฤติกรรมนี้
Yves Martin

1

ส่วน "การจัดการพื้นที่เก็บข้อมูล UUIDs " ใน svn red-bean book อาจมีคำตอบที่คุณต้องการ


ส่วนนั้นพูดถึง UUID ของที่เก็บข้อมูลไม่ทำงานคัดลอก UUID
เอียน

@Ioan: การอ้างอิงจากส่วนนั้น: สำหรับผู้ที่ใช้เวอร์ชั่นของ Subversion ที่เร็วกว่า 1.5 งานเหล่านี้มีความซับซ้อนกว่าเล็กน้อย คุณสามารถตั้งค่า UUID ของที่เก็บอย่างชัดเจนโดยการวางท่อการถ่ายโอนไฟล์ที่เก็บข้อมูลที่ดำเนินการตามข้อกำหนด UUID ใหม่ผ่านการโหลด svnadmin --force-uuid REPOS-PATH - นี่ไม่ใช่สิ่งที่คุณต้องการหรือไม่?
yasouser

1
อีกครั้งไม่ฉันไม่ได้พูดถึงUUID ของที่เก็บแต่ใช้งานได้คัดลอก UUIDs; สำเนาการทำงานเหมือนกับการชำระเงิน
อีวอน

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