ฉันจะกู้คืนไฟล์ที่ถูกลบใน Mercurial ได้อย่างไร (ถ้าเป็นเช่นนั้น)?


101

โดยบังเอิญด้วยการใช้ GUI ซึ่งต่างจาก CLI ฉันจึงลบทุกไฟล์ในโครงการ Mercurial

ฉันกู้คืนด้วยการ Revert ตกลงและสูญเสียงานบางอย่างซึ่งเนื่องจากฉันมีไทม์แมชชีนฉันจึงสามารถกลับมาได้ แต่มีวิธียกเลิกการลบ / ยกเลิกการลบไฟล์ดังกล่าวหรือไม่? ลากผ่านคู่มือและ googled แต่ไม่เห็นอะไรเลย ปลั๊กอินใด ๆ

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

ps ฉันรู้ว่าhg forgetหรือhg remove -Afจะลบโดยไม่ลบออกจากไดเร็กทอรี แต่คำถามของฉันเกี่ยวข้องกับข้อผิดพลาดที่ฉันทำเมื่อเทียบกับการคิดที่ดีในการดำเนินการ


1
คุณควรจะสามารถชำระเงินการแก้ไขที่เก่ากว่าได้และไม่เป็นไร (แน่นอนว่าจะใช้ได้เฉพาะในกรณีที่คุณไม่ได้เขียนประวัติ
ซ้ำ

ปัญหาคือฉันได้ตกลงทำการแก้ไข R (emoved) หลังจากลำดับนั้นใช่ฉันได้รับการกระทำก่อนหน้านี้จึงกลับไปที่สิ่งนั้นและเนื่องจากฉันมีการสำรองข้อมูลในรูปแบบของไทม์แมชชีนฉันจึงสามารถรับการเปลี่ยนแปลงล่าสุดจากนั้นเพิ่มเข้าไปแล้วจึงคอมมิต อย่างไรก็ตามหากฉันไม่มี backuop การเปลี่ยนแปลงก็จะหายไป
PurplePilot

1
คำถามที่เกี่ยวข้องซึ่งช่วยให้คุณค้นหาเพียงชื่อไฟล์ (อย่างรวดเร็ว): stackoverflow.com/questions/1013550/…
Michael Pryor

คำตอบ:


153

ขั้นแรกใช้hg grepเพื่อค้นหาไฟล์ที่ถูกลบที่คุณต้องการกู้คืน ผลลัพธ์ของคำสั่งนี้จะแสดงให้คุณเห็นการแก้ไขล่าสุดที่มีไฟล์อยู่และพา ธ ไปยังไฟล์ที่ถูกลบ ประการที่สองเรียกใช้hg revert -r <revision number> <path to deleted file> ไฟล์ที่ถูกลบจะอยู่ในสำเนาการทำงานของคุณพร้อมที่จะกลับเข้ามาในหัว


5
ทำงานได้ดีสำหรับฉันขอบคุณ กำลังมองหาคำตอบว่า "ฉันจะกู้คืนไฟล์ที่ถูกลบโดยเจตนาได้อย่างไร"
nc.

จาก eclipse สามารถทำได้โดยคลิกขวาที่ไฟล์ Select Team -> Revert
Emil

3
อีกวิธีหนึ่งในการค้นหาการแก้ไขที่มีไฟล์คือhg log -I '**file.ext'
mpen

2
แค่ FYI: คุณต้องการหมายเลขการแก้ไขของการคอมมิตที่ยังคงมีไฟล์ไม่ใช่ไฟล์ที่ลบออก!
Lukas Knuth

8

อ้างจากความคิดเห็น:

ฉันตั้งค่าที่เก็บคอมมิตทั้งหมดลบแล้วคอมมิตอีกครั้ง

หากเป็นกรณีนี้คุณเพียงแค่ต้องอัปเดตไดเร็กทอรีการทำงานเป็นการแก้ไขก่อนหน้านี้:

$ hg update -C -r-2

สังเกตหมายเลขการแก้ไขเชิงลบ หากไฟล์ที่คุณลบไม่ได้อยู่ในการแก้ไขก่อนหน้านี้คุณสามารถค้นหาได้โดยใช้:

$ hg log -v


4

สำหรับ Mercurial 1.6 ขึ้นไป

หากคุณทราบชื่อของไฟล์ลบคุณสามารถค้นหาการแก้ไขได้อย่างง่ายดายด้วย:

hg log -r "removes('NAME.c')"

สิ่งนี้จะทำให้คุณได้รับการแก้ไขในแม่มดไฟล์ชื่อ NAME.c (ในรูท) จะถูกลบ

จากนั้นคุณสามารถเปลี่ยนไฟล์กลับเป็นการแก้ไขก่อนหน้าด้วย (เช่นคำตอบอื่น ๆ ):

hg revert -r <revision number> <path to deleted file>

คุณสามารถใช้รูปแบบชื่อไฟล์แทนเพื่อปรับให้เข้ากับสิ่งที่คุณรู้ได้เช่นคุณสามารถใช้**/NAME.cเพื่อค้นหาในไดเรกทอรีทั้งหมด คุณสามารถอ่านเกี่ยวกับมันในไฟล์ชื่อ Patters และใช้การเชื่อมโยงนี้จะรู้เกี่ยวกับใหม่ข้อกำหนด revset


1

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

ใช้ค้นหาไฟล์ที่ถูกลบในประวัติที่เก็บ Mercurial อย่างรวดเร็ว? + xargs + tr เปลี่ยนกลับการแก้ไข -3 การลบทั้งหมดเป็นเวอร์ชันจากการแก้ไข -4:

hg log -r -3 --template "{rev}: {file_dels}\n" | tr ' ' '\n' | xargs hg revert -r -4 

โปรดทราบว่าการดำเนินการนี้จะล้มเหลวหากไฟล์ใด ๆ ของคุณมีช่องว่างในชื่อ http://hgbook.red-bean.com/read/customizing-the-output-of-mercurial.htmlดูเหมือนว่าจะไม่มีเทมเพลตใด ๆ ที่{file_dels}ถูกแบ่งออก\nในขณะนี้


0

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


1
ไม่สิ่งนี้ใช้ไม่ได้ ฉันใช้ Mac กับ Mercurial Distributed SCM (เวอร์ชัน 1.4.1 + 20091201) ฉันตั้งค่าที่เก็บผูกมัดทั้งหมดลบแล้วคอมมิตอีกครั้ง แต่จะนำกลับมาเฉพาะรายการไฟล์ที่ทำเครื่องหมายเป็น R (emoved) แต่ไม่ได้นำไฟล์กลับมา หากฉันทำเครื่องหมายไฟล์เป็น R (emoved) และ Rollback ก่อนที่จะกระทำก็จะไม่มีอะไรเกิดขึ้น
PurplePilot

หลังจากที่คุณทำการย้อนกลับ hg เสร็จแล้ว repo ของคุณจะถูกย้อนกลับ แต่ไดเร็กทอรีการทำงานปัจจุบันของคุณจะยังคงมีการเปลี่ยนแปลงของคุณ เพียงบอกให้ hg ทำการอัปเดตทั้งหมดสำหรับการแก้ไขย้อนกลับตอนนี้อยู่ที่คำแนะนำ: hg up -C
ataylor

1
hg rollbackจะไม่กู้คืนไฟล์ที่ถูกลบเนื่องจากการลบไฟล์ไม่ได้เป็นส่วนหนึ่งของธุรกรรมการคอมมิต
mrucci

4
ถูกตัอง. หากคุณต้องการแก้ไขที่ไม่ได้กระทำก่อนที่จะลบออกการแก้ไขนั้นจะสูญหายไป
ataylor

0

คุณสามารถลบการแก้ไขที่คอมมิตได้โดยใช้hg stripคำสั่งซึ่งจัดเตรียมโดยส่วนขยาย mq (Mercurial Queues) สิ่งนี้ควรให้ไฟล์ของคุณกลับคืนมา

ทำการสำรองข้อมูลก่อนที่จะลองใช้งานเนื่องจากจะทำให้ฐานข้อมูลของ Mercurial เปลี่ยนชุดการเปลี่ยนแปลง


0

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

hg clone mydirectory mydirectory1

และตอนนี้คุณเริ่ม mc (หรือ Far Manager) และเปรียบเทียบว่ามันคืออะไรกับสิ่งที่มันกลายเป็น

mydirectory1เมื่อมันทำเพียงลบ


0

สิ่งต่อไปนี้ใช้ได้ผลสำหรับฉัน

hg revert -r <Revision Number> <File Name>

(ไม่บังคับเพื่อเปลี่ยนกลับไฟล์ทั้งหมด)

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