วิธีที่ถูกต้องในการกู้คืนไฟล์ที่ถูกลบจาก SVN คืออะไร?


119

ฉันลบไฟล์ออกจาก repo และตอนนี้ต้องการนำกลับมา สิ่งที่ดีที่สุดที่ฉันสามารถเข้าใจได้คือ:

  • อัปเดตการแก้ไขก่อนการลบ
  • คัดลอกไฟล์ที่อื่น
  • อัปเดตเป็นส่วนหัว
  • คัดลอกไฟล์กลับ
  • เพิ่มพวกเขา
  • ผูกมัด

นั่นเป็นเพียงกลิ่นที่ไม่ดีและมันจะสูญเสียประวัติทั้งหมดในการบูต ต้องมีวิธีที่ดีกว่านี้ในการทำเช่นนี้ ฉันได้ดูในThe SVN Book แล้วแต่ไม่พบอะไรเลยและตอนนี้กำลังมองหารายการแท็ก SVN


4
คำตอบของ tukushan คือคำตอบโดยตรงที่ถูกต้องสำหรับคำถามของคุณและควรได้รับการยอมรับหรือไม่?
James McCormack

@JamesMcCormack: ดู NB ในคำตอบของเขา
BCS

2
เคล็ดลับหากคุณลบไฟล์และยังไม่ได้ทำการเปลี่ยนแปลงเพียงคลิกขวาและอัปเดตก็จะกู้คืนไฟล์ได้
Hammad Khan

คำตอบ:


57

ใช้ svn merge:

svn merge -c -[rev num that deleted the file] http://<path to repository>

ดังนั้นตัวอย่าง:

svn merge -c -12345 https://svn.mysite.com/svn/repo/project/trunk
             ^ The negative is important

สำหรับ TortoiseSVN (ฉันคิดว่า ... )

  • คลิกขวาใน Explorer ไปที่ TortoiseSVN -> ผสาน ...
  • ตรวจสอบว่าได้เลือก "ผสานการแก้ไขช่วงต่างๆ" แล้วคลิกถัดไป
  • ในกล่องข้อความ "ช่วงการแก้ไขเพื่อรวม" ระบุการแก้ไขที่ลบไฟล์ออก
  • เลือกช่องทำเครื่องหมาย "Reverse merge" คลิก Next
  • คลิกผสาน

อย่างไรก็ตามนั่นยังไม่ผ่านการทดสอบอย่างสมบูรณ์


แก้ไขโดย OP : ใช้งานได้กับ TortoiseSVN เวอร์ชันของฉัน (แบบเก่าที่ไม่มีปุ่มถัดไป)

  • ไปที่โฟลเดอร์ที่ข้อมูลถูกคั่น
  • คลิกขวาใน Explorer ไปที่ TortoiseSVN -> ผสาน ...
  • ในส่วนจากให้ป้อนการแก้ไขที่ลบ
  • ในส่วนถึงให้ป้อนการแก้ไขก่อนการลบ
  • คลิก "ผสาน"
  • ผูกมัด

เคล็ดลับคือการผสานไปข้างหลัง ขอชื่นชม sean.bright ที่ชี้ให้ฉันไปในทิศทางที่ถูกต้อง!


แก้ไข:เรากำลังใช้เวอร์ชันที่แตกต่างกัน วิธีที่ฉันอธิบายใช้ได้อย่างสมบูรณ์กับ TortoiseSVN เวอร์ชันของฉัน

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


ฉันใช้ windows และไม่มี SVN เวอร์ชัน CLI คุณรู้วิธีการที่ ortoiseSVN ทำได้หรือไม่?
BCS

เต่ามี "ผสาน" บนเมนูคลิกขวา มันมีช่องให้กรอก rev. "Dry Run" ด้วยเพื่อดูว่าคุณตั้งค่าถูกต้องหรือไม่ และจำไว้ว่าผลลัพธ์จะไม่นับจนกว่าคุณจะยอมรับ คุณสามารถเปลี่ยนกลับได้หากทุกอย่างยุ่งเหยิง
gbarry

ฉันจะบอกว่า OP มีเต่ารุ่นเก่ากว่า อันใหม่กว่ามีไดอะล็อกการผสานที่แตกต่างกัน (ด้อยกว่า)
1800 ข้อมูล

ฉันยังไม่เห็นระบบผสานใด ๆ ที่ไม่ดูด ข้อความไฟล์ dirs เอกสาร Word yuck ฉันคิดว่ามันไม่ใช่ปัญหาที่แก้ไขได้ สิ่ง OTOH สามารถดูดได้มากหรือน้อย :)
BCS

1
หากคุณย้อนกลับไฟล์หลายไฟล์แล้วเปลี่ยนกลับไฟล์ใดไฟล์หนึ่งเป็นการยกเลิกการเปลี่ยนกลับ อุ๊ย! ฉันเจ็บแค่บางอย่าง
BCS

176

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

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

  • เรียกดูโฟลเดอร์สำเนาที่ใช้งานได้ซึ่งมีไฟล์ก่อนหน้านี้
  • คลิกขวาที่โฟลเดอร์ใน Explorer ไปที่ TortoiseSVN -> แสดงบันทึก
  • คลิกขวาที่หมายเลขการแก้ไขก่อนการแก้ไขที่ลบไฟล์และเลือก "เรียกดูที่เก็บ"
  • คลิกขวาที่ไฟล์ที่ถูกลบแล้วเลือก "Copy to working copy ... " แล้วบันทึก

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

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


26
นอกจากนี้ยังสามารถดำเนินการได้โดยตรงบนเซิร์ฟเวอร์ซึ่งมีประโยชน์หากไฟล์หรือโฟลเดอร์ที่ถูกลบมีขนาดค่อนข้างใหญ่: svn cp -r 1993 http://example.com/svn/trunk/path@1993 http://example.com/svn/trunk/path
Craig

นี่เป็นวิธีที่เหมาะสมที่จะทำ เพิ่งลองกับ TortoiseSVN 1.8.1 และได้ผลตามคำแนะนำ
Dr.Gianluigi Zane Zanettini

ที่สมบูรณ์แบบ !! ง่ายและมีประสิทธิภาพ ขอบคุณสำหรับการแก้ปัญหา
Hunter

วิธีนี้ทำให้ง่ายขึ้นมากสำหรับฉันในการกู้คืนไฟล์ในสาขาย่อยซึ่งถูกลบออกจากสาขาแม่ บางทีอาจมีวิธีทำด้วยmergeแต่ฉันคิดไม่ออก
arr_sea

"เพียงแค่ก่อน" ในขั้นตอนที่ 3 เป็นสิ่งสำคัญ ในขั้นตอนที่ 4 Tortoise ยังคงบ่นว่ามีไฟล์อยู่แล้วแม้ว่าฉันจะลบไปแล้วโดยใช้การลบ Windows ก็ตาม ฉันต้องอัปเดตสำเนาการทำงานของฉันก่อน (เพื่อนร่วมงานของฉันได้ลบไฟล์หลายไฟล์โดยใช้ Tortoise delete จากนั้นจึงทำการเปลี่ยนแปลง) TortoiseSVN 1.8.1
leqid

27

เพื่อความสมบูรณ์นี่คือสิ่งที่คุณจะพบในหนังสือ svn คุณรู้หรือไม่ว่าต้องค้นหาอะไร นี่คือสิ่งที่คุณได้ค้นพบแล้ว:

การยกเลิกการเปลี่ยนแปลง

การคืนค่ารายการที่ถูกลบ

สิ่งเดียวกันจากเวอร์ชันล่าสุด (และรายละเอียด) ของหนังสือ:

การยกเลิกการเปลี่ยนแปลง

การคืนค่ารายการที่ถูกลบ


3
เพียงแค่แสดงให้เห็นปัญหาส่วนใหญ่คือการรู้ว่าจะหาอะไร
BCS

16

ใช้ฟังก์ชันการคัดลอก Tortoise SVN เพื่อยกเลิกการเปลี่ยนแปลงที่ยืนยัน:

  1. คลิกขวาที่โฟลเดอร์หลักที่มีไฟล์ / โฟลเดอร์ที่ถูกลบ
  2. เลือก "บันทึกการแสดง"
  3. เลือกและคลิกขวาที่เวอร์ชันก่อนที่จะทำการเปลี่ยนแปลง / ลบ
  4. เลือก "เรียกดูที่เก็บ"
  5. เลือกไฟล์ / โฟลเดอร์ที่ต้องการกู้คืนและคลิกขวา
  6. เลือก "คัดลอกไปที่" ซึ่งจะคัดลอกไฟล์ / โฟลเดอร์ไปยังการแก้ไขส่วนหัว

หวังว่าจะช่วยได้


13

ฉันมักจะใช้ svn copy เป็นการทำงานของเซิร์ฟเวอร์ดังนั้นจึงไม่แน่ใจว่ามันใช้ได้กับสองเส้นทางการทำงานหรือไม่

นี่คือตัวอย่างของการกู้คืนไฟล์ที่ถูกลบไปยังสำเนาการทำงานในเครื่องของโครงการ:

svn copy https://repos/project/modules/module.js@3502 modules/module.js

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


2
+1 สำเนา @ ทำงาน ดูเหมือนว่าสำเนา -r จะใช้งานไม่ได้กับการใช้ CollabNet svn 1.6.17 ภายใต้ Mac OSX
สีเทา

2
นอกจากนี้การแก้ไขที่ใช้ควรเป็นการแก้ไขก่อนการลบ
สีเทา

6

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

  1. เรียกดูโฟลเดอร์ในสำเนาการทำงานที่คุณลบไฟล์
  2. ไปที่ repo-browser
  3. เรียกดูการแก้ไขที่คุณลบไฟล์
  4. ในรายการการเปลี่ยนแปลงค้นหาไฟล์ที่คุณลบ
  5. คลิกขวาที่ไฟล์และไปที่ "ยกเลิกการเปลี่ยนแปลงจากการแก้ไขนี้"
  6. การดำเนินการนี้จะกู้คืนไฟล์เป็นสำเนาการทำงานของคุณเก็บประวัติ
  7. คอมมิตไฟล์เพื่อเพิ่มกลับเข้าไปในที่เก็บของคุณ

ตกลงในกรณีนี้คำถามคือทำอย่างไรที่คุณเพิ่งอธิบายไป (คำตอบ: ใช้การผสานย้อนกลับ)
BCS

1
ฉันกำลังพูดถึงวิธีการทำใน Tortoise SVN ฉันจะเพิ่มรายละเอียด
davogones

5

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

ฉันใช้สิ่งต่อไปนี้ในอินสแตนซ์นี้และใช้ได้ดีทีเดียว

svn copy -m 'restoring file' -r <rev_number_file_to_restore> http://from/file.cs http://pathTo/file.cs

ดูเหมือนว่าฉันจะใช้svn copyเป็นการทำงานของเซิร์ฟเวอร์เสมอดังนั้นจึงไม่แน่ใจว่ามันใช้ได้กับสองเส้นทางการทำงานหรือไม่


3
SVN COPY เป็นแนวทางที่แนะนำ ไวยากรณ์ง่ายมาก: สำเนา SVN [SVN URL] @ [REVISION # ที่ไฟล์ EXISTS] [เส้นทางภายในเพื่อเรียกคืน TO] จากvisualsvn.com/support/svnbook/branchmerge/basicmerging เพิ่งใช้ตัวนี้เอง
Amit

สิ่งนี้เหมาะสมกับฉันมากที่สุดฉันก็ใช้วิธีนี้เช่นกัน
Dmitry Pashkevich

4

ด้วยTortoise SVN :

หากคุณยังไม่ได้ทำการเปลี่ยนแปลงคุณสามารถเปลี่ยนกลับไปยังโฟลเดอร์หลักที่คุณลบไฟล์หรือไดเรกทอรีได้

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


ดี คราวหน้าจะลองดู
BCS

1

คุณควรจะสามารถตรวจสอบไฟล์เดียวที่คุณต้องการกู้คืน ลองของเช่นsvn co svn://your_repos/path/to/file/you/want/to/restore@revที่ไหนrevเป็นการแก้ไขก่อนที่ไฟล์ที่มีอยู่

ฉันต้องทำแบบนี้เมื่อไม่นานมานี้และถ้าฉันจำไม่ผิดใช้-rตัวเลือกเพื่อsvnไม่ทำงาน ฉันต้องใช้:revไวยากรณ์ (แม้ว่าฉันอาจจะจำมันไปแล้วก็ตาม ... )


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