Làm cách nào để khôi phục tệp đã xóa trong Mercurial (nếu có)?


100

Tình cờ, bằng cách sử dụng GUI trái ngược với CLI, tôi đã xóa mọi tệp trong dự án Mercurial.

Tôi đã khôi phục với Revert ok và bị mất một số công việc, vì tôi có cỗ máy thời gian, tôi có thể dễ dàng lấy lại. Nhưng có cách nào để xóa / phục hồi các tệp như vậy không? Tra qua sách hướng dẫn và googled nhưng không thấy gì cả. Bất kỳ plugin nào?

Tôi có thể đang trả lời câu hỏi của riêng mình ở đây nhưng các tệp đã biến mất khỏi thư mục và không nằm trong thùng rác để khôi phục, vì vậy tôi giả sử Xóa là không thể thu hồi?

ps Tôi biết điều đó hg forgethoặc hg remove -Afsẽ xóa mà không xóa khỏi thư mục nhưng câu hỏi của tôi liên quan đến lỗi tôi đã thực hiện trái ngược với suy nghĩ tuyệt vời về hành động.


1
bạn sẽ có thể kiểm tra một bản sửa đổi cũ hơn và ổn (tất nhiên điều này chỉ hoạt động trong trường hợp bạn không viết lại lịch sử)
tback

vấn đề là tôi đã cam kết, thực hiện các chỉnh sửa, R (đã xóa). Vì vậy, sau trình tự đó, vâng, tôi đã có cam kết trước đó nên quay lại đó và vì tôi có bản sao lưu dưới dạng cỗ máy thời gian, tôi có thể nhận được những thay đổi cuối cùng từ đó thêm chúng vào và sau đó cam kết. Tuy nhiên, nếu tôi không có backuop, các thay đổi sẽ bị mất.
PurplePilot

1
Câu hỏi liên quan cho phép bạn tìm kiếm chỉ tên tập tin (nhanh): stackoverflow.com/questions/1013550/...
Michael Pryor

Câu trả lời:


152

Đầu tiên, sử dụng hg grepđể tìm tệp đã xóa mà bạn muốn khôi phục. Đầu ra của lệnh này sẽ hiển thị cho bạn bản sửa đổi cuối cùng mà tệp có mặt và đường dẫn đến tệp đã xóa. Thứ hai, chạy hg revert -r <revision number> <path to deleted file> Tập tin đã xóa bây giờ sẽ nằm trong bản sao làm việc của bạn, sẵn sàng được cam kết trở lại trong đầu.


5
làm việc tốt cho tôi, cảm ơn. đang tìm kiếm câu trả lời cho "làm cách nào để khôi phục tệp mà tôi đã cố tình xóa?"
nc.

từ nhật thực này có thể được thực hiện bằng cách nhấp chuột phải tập tin Chọn Team -> Hoàn nguyên
Emil

3
Một cách khác để tìm bản sửa đổi có chứa tệp làhg log -I '**file.ext'
mpen 20/02/15

2
Chỉ là FYI: Bạn muốn số sửa đổi của cam kết vẫn còn trong tệp, KHÔNG PHẢI là số đã xóa nó!
Lukas Knuth

8

Trích dẫn từ bình luận:

Tôi thiết lập một kho lưu trữ, cam kết tất cả, Đã xóa và sau đó cam kết lại

Nếu đúng như vậy thì bạn chỉ cần cập nhật thư mục làm việc lên bản sửa đổi trước:

$ hg update -C -r-2

Lưu ý số sửa đổi âm. Nếu các tệp bạn đã xóa không có trong bản sửa đổi trước đó, bạn có thể tìm thấy chúng bằng cách sử dụng:

$ hg log -v

5

Điều này đã làm việc cho tôi.

hg revert -r revision pathToTheFile

4

Đối với Mercurial 1.6 trở lên

Nếu bạn biết tên của tệp xóa, bạn có thể dễ dàng tìm thấy bản sửa đổi của nó với:

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

Điều này sẽ cung cấp cho bạn bản sửa đổi trong phù thủy một tệp có tên NAME.c (trong thư mục gốc) đã bị xóa.

Sau đó, bạn có thể hoàn nguyên tệp về bản sửa đổi trước đó bằng (giống như các câu trả lời khác):

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

Thay vào đó, bạn có thể sử dụng mẫu tên tệp để thích ứng với những gì bạn biết, chẳng hạn như bạn có thể sử dụng **/NAME.cđể tìm kiếm trong tất cả các thư mục. Bạn có thể đọc về nó trong File Name Patters . Và sử dụng liên kết này để biết về các thông số kỹ thuật của revset mới .


1

Một bổ sung cho câu trả lời được chấp nhận - điều này nhanh hơn nếu bạn muốn hoàn tác tất cả các thao tác xóa trong một cam kết. Tôi đã xóa một thư mục lớn với vài trăm tệp trong đó và đã thực hiện hg addremove, điều đó hoàn toàn không phải là ý định của tôi, vì vậy tôi phải hoàn tác tất cả các lần xóa đó.

Sử dụng Tìm tệp đã xóa trong lịch sử kho lưu trữ Mercurial, một cách nhanh chóng? + xargs + tr, hoàn nguyên tất cả các lần xóa phiên bản -3 về phiên bản từ phiên bản -4:

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

Lưu ý rằng điều này sẽ không thành công nếu bất kỳ tệp nào của bạn có khoảng trắng trong tên; http://hgbook.red-bean.com/read/customizing-the-output-of-mercurial.html hiện không có bất kỳ mẫu nào {file_dels}được chia theo \n.


0

Bạn có thể hoàn tác cam kết cuối cùng trên một repo với hg rollback. Chỉ có một mức khôi phục có sẵn, vì vậy nếu bạn đã xóa với nhiều hơn một lần cam kết, điều này sẽ không hoàn tác hoàn toàn thay đổi của bạn. Điều này chỉ hoạt động trên kho lưu trữ cục bộ của bạn, vì vậy nếu bạn đã đẩy, bạn sẽ không thể hoàn tác nó trong kho lưu trữ từ xa.


1
Không, điều này không hoạt động. Tôi đang sử dụng máy Mac với Mercurial Distributed SCM (phiên bản 1.4.1 + 20091201). Tôi đã thiết lập một kho lưu trữ, cam kết tất cả, Đã xóa và sau đó cam kết lại nhưng điều này chỉ mang lại danh sách các tệp được đánh dấu là R (đã xóa) nhưng không thực sự đưa các tệp trở lại. Nếu tôi đánh dấu các tệp là R (đã xóa) và Rollback trước khi cam kết thì cũng không có gì xảy ra.
PurplePilot

Sau khi bạn hoàn tất quá trình khôi phục hg, repo của bạn sẽ được khôi phục lại, nhưng thư mục làm việc hiện tại của bạn sẽ vẫn có các thay đổi của bạn. Chỉ cần yêu cầu hg thực hiện cập nhật sạch sẽ cho bản sửa đổi quay lại, bây giờ là mẹo: hg up -C.
ataylor

1
hg rollbacksẽ không khôi phục tệp đã xóa vì việc xóa tệp không phải là một phần của giao dịch cam kết.
mrucci

4
Đúng rồi. Nếu bạn đang muốn xem các chỉnh sửa không được cam kết trước khi xóa, chúng sẽ bị mất.
ataylor

0

Bạn có thể xóa các bản sửa đổi đã cam kết bằng hg striplệnh, được cung cấp bởi phần mở rộng mq (Mercurial Queues). Điều này sẽ trả lại cho bạn các tệp của bạn.

Hãy sao lưu trước khi thử, vì nó sẽ làm thay đổi cơ sở dữ liệu của các bộ thay đổi của Mercurial.


0

Phương pháp dưới đây là đơn giản và ngu ngốc đến mức nó không thể sai. Nếu bạn đã xóa hoặc đổi tên nhiều tệp, nó sẽ không sao.

hg clone mydirectory mydirectory1

và bây giờ bạn bắt đầu mc (hoặc Far Manager) và so sánh những gì nó đã được với những gì nó đã trở thành.

khi hoàn tất, chỉ cần xóa mydirectory1.


0

Những điều sau đây đã làm việc cho tôi.

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

(Tùy chọn, để hoàn nguyên tất cả các tệp)

hg revert -r <Revision Number> --all
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.