Bagaimana saya bisa memulihkan file yang dihapus di Mercurial (jika ada)?


100

Secara tidak sengaja, dengan menggunakan GUI sebagai lawan CLI, saya menghapus setiap file dalam proyek Mercurial.

Saya pulih dengan Kembalikan ok dan kehilangan beberapa pekerjaan, yang karena saya memiliki mesin waktu saya dapat dengan mudah kembali. Tetapi apakah ada cara untuk menghapus / membatalkan penghapusan file semacam itu? Tersandung melalui manual dan googled tapi tidak bisa melihat apa-apa. Ada plugin?

Saya mungkin menjawab pertanyaan saya sendiri di sini tetapi file telah hilang dari direktori dan tidak ada di sampah untuk dipulihkan, jadi saya berasumsi bahwa Hapus tidak dapat dibatalkan?

ps Saya tahu itu hg forgetatau hg remove -Afakan menghapus tanpa menghapus dari direktori tetapi pertanyaan saya berkaitan dengan kesalahan yang saya buat sebagai lawan dari pemikiran keren tindakan melalui.


1
Anda harus dapat membayar revisi lama dan baik-baik saja (tentu saja ini hanya berfungsi jika Anda tidak menulis ulang riwayat)
tback

Masalahnya adalah saya telah melakukan, melakukan pengeditan, R (dihapus). Jadi setelah urutan itu ya, saya telah mendapatkan komit sebelumnya jadi kembali ke itu dan karena saya memiliki cadangan dalam bentuk mesin waktu saya bisa mendapatkan perubahan terakhir dari kemudian menambahkannya dan kemudian melakukan. Namun jika saya tidak memiliki backuop, perubahan itu akan hilang.
PurplePilot

1
Pertanyaan terkait yang memungkinkan Anda mencari hanya nama file (cepat): stackoverflow.com/questions/1013550/…
Michael Pryor

Jawaban:


152

Pertama, gunakan hg grepuntuk menemukan file terhapus yang ingin Anda pulihkan. Output dari perintah ini akan menunjukkan kepada Anda revisi terakhir yang file tersebut ada, dan jalur ke file yang dihapus. Kedua, jalankan hg revert -r <revision number> <path to deleted file> File yang dihapus sekarang akan ada dalam copy pekerjaan Anda, siap untuk dikomit kembali.


5
bekerja dengan baik untuk saya, terima kasih. sedang mencari jawaban untuk "bagaimana cara memulihkan file yang sengaja saya hapus?"
nc.

dari eclipse ini bisa dilakukan dengan cara klik kanan file Select Team -> Revert
Emil

3
Cara lain untuk menemukan revisi yang berisi file tersebut adalahhg log -I '**file.ext'
mpen

2
Hanya FYI: Anda menginginkan nomor revisi dari komit yang masih memiliki file, BUKAN yang menghapusnya!
Lukas Knuth

8

Kutipan dari komentar:

Saya menyiapkan repositori, berkomitmen semua, Dihapus, dan kemudian berkomitmen lagi

Jika demikian, maka Anda hanya perlu memperbarui direktori kerja ke revisi sebelumnya:

$ hg update -C -r-2

Catat angka revisi negatif. Jika file yang Anda hapus tidak ada dalam revisi sebelumnya, Anda dapat menemukannya dengan menggunakan:

$ hg log -v

5

Nah ini berhasil untuk saya.

hg revert -r revision pathToTheFile

4

Untuk Mercurial 1.6 ke atas

Jika Anda mengetahui nama file hapus, Anda dapat menemukan revisinya dengan mudah dengan:

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

Ini akan memberi Anda revisi di witch file bernama NAME.c (di root) dihapus.

Kemudian Anda dapat mengembalikan file ke revisi sebelumnya dengan (seperti jawaban lain):

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

Anda dapat menggunakan pola nama file untuk menyesuaikan dengan apa yang Anda ketahui, misalnya Anda dapat menggunakan **/NAME.cuntuk mencari di semua direktori. Anda dapat membacanya di File Name Patters . Dan gunakan tautan ini untuk mengetahui tentang spesifikasi revset baru .


1

Tambahan untuk jawaban yang diterima - ini lebih cepat jika Anda ingin mengurungkan semua penghapusan dalam sebuah commit. Saya menghapus folder besar dengan beberapa ratus file di dalamnya dan melakukannya hg addremove, yang sama sekali bukan maksud saya, jadi harus membatalkan semua penghapusan tersebut.

Menggunakan Temukan file yang dihapus dalam sejarah repositori Mercurial, cepat? + xargs + tr, kembalikan semua revisi -3 penghapusan ke versi dari revisi -4:

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

Perhatikan bahwa ini akan gagal jika ada file Anda yang memiliki spasi pada namanya; http://hgbook.red-bean.com/read/customizing-the-output-of-mercurial.html tampaknya tidak memiliki template apa pun yang saat {file_dels}ini dipisahkan \n.


0

Anda dapat membatalkan komit terakhir pada repo dengan hg rollback. Hanya ada satu tingkat rollback yang tersedia, jadi jika Anda melakukan penghapusan dengan lebih dari satu commit, ini tidak akan sepenuhnya membatalkan perubahan Anda. Ini hanya berfungsi di repositori lokal Anda, jadi jika Anda telah mendorong Anda tidak akan dapat membatalkannya di repo jarak jauh.


1
Tidak, ini tidak berhasil. Saya menggunakan Mac dengan Mercurial Distributed SCM (versi 1.4.1 + 20091201). Saya menyiapkan repositori, melakukan semua, Dihapus, dan kemudian berkomitmen lagi tetapi ini hanya mengembalikan daftar file yang ditandai sebagai R (dihapus) tetapi tidak benar-benar mengembalikan file. Jika saya menandai file sebagai R (dihapus) dan Rollback sebelum melakukan juga tidak ada yang terjadi.
PurplePilot

Setelah Anda melakukan hg rollback, repo Anda akan dibatalkan, tetapi direktori kerja Anda saat ini masih memiliki perubahan. Beri tahu saja hg untuk melakukan pembaruan bersih ke revisi yang dibatalkan, sekarang di tip: hg up -C.
ataylor

1
hg rollbacktidak akan memulihkan file yang dihapus karena penghapusan file bukan bagian dari transaksi komit.
mrucci

4
Betul sekali. Jika Anda ingin mendapatkan hasil edit yang tidak dilakukan sebelum penghapusan, mereka hilang.
ataylor

0

Anda dapat menghapus revisi yang dilakukan menggunakan hg stripperintah, yang disediakan oleh ekstensi mq (Mercurial Queues). Ini akan mengembalikan file Anda.

Buat cadangan sebelum mencobanya, karena itu akan mengubah database perubahan Mercurial.


0

Metode di bawah ini sangat mudah dan sangat bodoh sehingga tidak bisa salah. Jika Anda telah menghapus atau mengganti nama banyak file, itu akan baik-baik saja.

hg clone mydirectory mydirectory1

dan sekarang Anda memulai mc (atau Far Manager) dan membandingkan apa itu vs apa jadinya.

setelah selesai, hapus saja mydirectory1.


0

Yang berikut berhasil untuk saya.

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

(Opsional, untuk mengembalikan semua file)

hg revert -r <Revision Number> --all
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.