Bagaimana cara yang benar untuk memulihkan file yang dihapus dari SVN?

119

Saya menghapus file dari repo dan sekarang ingin mengembalikannya. Yang terbaik yang bisa saya pikirkan adalah:

  • perbarui ke revisi sebelum menghapus
  • salin file di tempat lain
  • update ke head
  • salin file kembali
  • tambahkan mereka
  • melakukan

Itu hanya baunya tidak enak dan kehilangan semua sejarah untuk boot. Pasti ada cara yang lebih baik untuk melakukan ini. Saya telah melihat di Buku SVN tetapi tidak menemukan apa pun dan sekarang sedang melihat daftar tag SVN.

BCS
sumber
4
Tentunya jawaban tukushan adalah jawaban langsung yang benar atas pertanyaan Anda, dan harus diterima?
James McCormack
@JamesMcCormack: lihat NB di jawabannya.
BCS
2
Sebuah tip, jika Anda menghapus file dan belum melakukan perubahan, cukup klik kanan dan perbarui akan memulihkannya.
Hammad Khan

Jawaban:

57

Gunakan svn merge:

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

Jadi contohnya:

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

Untuk TortoiseSVN (Saya pikir ...)

  • Klik kanan di Explorer, pergi ke TortoiseSVN -> Gabung ...
  • Pastikan "Gabungkan berbagai revisi" dipilih, klik Berikutnya
  • Dalam kotak teks "Rentang revisi untuk digabungkan", tentukan revisi yang menghapus file
  • Centang kotak "Reverse merge", klik Next
  • Klik Gabung

Itu sama sekali belum teruji.


Diedit oleh OP : Ini berfungsi pada versi TortoiseSVN saya (jenis lama tanpa tombol berikutnya)

  • Buka folder tempat item dihapus
  • Klik kanan di Explorer, pergi ke TortoiseSVN -> Gabung ...
  • di bagian Dari masukkan revisi yang melakukan penghapusan
  • di bagian Ke masukkan revisi sebelum menghapus.
  • Klik "gabungkan"
  • melakukan

Triknya adalah menggabungkan mundur . Kudos to sean.bright karena telah mengarahkan saya ke arah yang benar!


Sunting: Kami menggunakan versi yang berbeda. Metode yang saya jelaskan bekerja sempurna dengan versi TortoiseSVN saya.

Yang juga perlu diperhatikan adalah bahwa jika ada beberapa perubahan dalam komit, Anda membalikkan penggabungan, Anda akan ingin mengembalikan perubahan lain itu setelah penggabungan selesai sebelum Anda berkomitmen. Jika tidak, perubahan ekstra tersebut juga akan dibatalkan.

Sean Bright
sumber
Saya menggunakan Windows dan tidak memiliki SVN versi CLI. apakah Anda tahu cara membuat ortoiseSVN melakukan itu?
BCS
Tortoise memiliki "merge" pada menu klik kanan. Ini memiliki kotak untuk diisi untuk rev. Juga "Lari Kering" untuk melihat apakah Anda sudah mengaturnya dengan benar. Dan ingat, hasilnya tidak dihitung sampai Anda melakukannya. Anda dapat mengembalikannya jika semuanya rusak.
gbarry
Saya akan mengatakan OP memiliki versi Tortoise yang lebih lama. Yang lebih baru memiliki dialog penggabungan yang berbeda (inferior)
1800 INFORMATION
Saya belum melihat sistem penggabungan APAPUN yang tidak payah. Teks, file, direktori, dokumen Word, yuck. Saya pikir ini bukan masalah yang bisa dipecahkan. Hal-hal OTOH bisa menyedot lebih atau kurang. :)
BCS
1
Jika Anda mengembalikan beberapa file dan kemudian mengembalikan salah satu yang dikembalikan adalah yang tidak dikembalikan. Aduh! Saya pikir saya baru saja menyakiti sesuatu.
BCS
176

Masalah dengan melakukan penggabungan svn seperti yang disarankan oleh Sean Bright adalah memperkenalkan kembali perubahan lain yang dibuat dalam revisi yang sama seperti penghapusan. Salinan svn adalah operasi yang lebih bertarget yang hanya akan mempengaruhi file yang dihapus.

Menggunakan Tortoise SVN Anda bisa menghidupkan kembali file yang telah dihapus dari direktori copy pekerjaan Anda dan dari revisi SVN nanti, melalui salinan svn sebagai berikut:

  • Jelajahi folder copy pekerjaan yang sebelumnya berisi file tersebut.
  • Klik kanan pada folder di Explorer, pergi ke TortoiseSVN -> Tampilkan log.
  • Klik kanan pada nomor revisi sebelum revisi yang menghapus file dan pilih "Jelajahi repositori".
  • Klik kanan pada file yang dihapus dan pilih "Salin ke copy pekerjaan ..." dan simpan.

File yang dihapus sekarang akan berada di folder copy pekerjaan. Untuk menambahkannya kembali ke SVN, klik kanan pada file yang dipulihkan dan pilih SVN Commit.

NB: Metode ini akan mempertahankan riwayat sebelumnya dari file yang dipulihkan, namun untuk melihat riwayat sebelumnya dalam log TortoiseSVN Anda perlu memastikan "Berhenti saat menyalin / mengganti nama" tidak dicentang dalam dialog Pesan log.

tekumara
sumber
26
Ini juga dapat dilakukan secara langsung di server, berguna jika file atau folder yang dihapus cukup besar: svn cp -r 1993 http://example.com/svn/trunk/path@1993 http://example.com/svn/trunk/path
Craig
Ini cara yang benar untuk melakukannya. Baru saja mencoba dengan TortoiseSVN 1.8.1 dan berfungsi seperti yang disarankan.
Dr. Gianluigi Zane Zanettini
Sempurna!! Sederhana dan efektif. Terima kasih atas solusinya
Hunter
Metode ini mempermudah saya untuk memulihkan file menjadi cabang anak yang telah dihapus dari cabang induknya. Mungkin ada cara untuk melakukannya merge, tapi saya tidak memahaminya.
arr_sea
"Tepat sebelum" di langkah 3 itu penting. Pada langkah 4, Tortoise terus mengeluh bahwa file tersebut sudah ada, meskipun saya telah menghapusnya menggunakan penghapusan Windows. Saya harus memperbarui copy pekerjaan saya terlebih dahulu. (Kolega saya telah menghapus beberapa file menggunakan penghapusan Tortoise, dan kemudian melakukan perubahan.) TortoiseSVN 1.8.1.
leqid
16

Gunakan fungsionalitas salin Tortoise SVN untuk mengembalikan perubahan yang dilakukan:

  1. Klik kanan folder induk yang berisi file / folder yang dihapus
  2. Pilih "tampilkan log"
  3. Pilih dan klik kanan pada versi sebelum perubahan / penghapusan dilakukan
  4. Pilih "telusuri repositori"
  5. Pilih file / folder yang perlu dipulihkan dan klik kanan
  6. Pilih "salin ke" yang akan menyalin file / folder ke revisi head

Semoga membantu

Mukul Joshi
sumber
13

Saya sepertinya selalu menggunakan svn copy sebagai operasi server jadi tidak yakin apakah itu bekerja dengan dua jalur kerja.

Berikut adalah contoh memulihkan file yang terhapus ke dalam copy pekerjaan lokal proyek:

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

Saat berada di dalam direktori proyek. Ini berfungsi juga untuk memulihkan seluruh direktori.

NullPoiиteя
sumber
2
+1 Salinan @ bekerja. Salinan -r tampaknya tidak berfungsi untuk menggunakan CollabNet svn 1.6.17 pada Mac OSX.
Abu
2
Juga revisi yang digunakan harus merupakan revisi tepat sebelum penghapusan.
Gray
6

Jika Anda menggunakan Tortoise SVN, Anda seharusnya bisa mengembalikan perubahan dari revisi itu ke copy pekerjaan Anda (secara efektif melakukan penggabungan terbalik), lalu lakukan komit lain untuk menambahkan kembali file. Langkah-langkah yang harus diikuti adalah:

  1. Jelajahi folder dalam copy pekerjaan tempat Anda menghapus file.
  2. Pergi ke repo-browser.
  3. Telusuri ke revisi di mana Anda menghapus file.
  4. Di daftar perubahan, temukan file yang Anda hapus.
  5. Klik kanan pada file tersebut dan buka "Kembalikan perubahan dari revisi ini".
  6. Ini akan mengembalikan file ke copy pekerjaan Anda, menyimpan sejarah.
  7. Komit file untuk menambahkannya kembali ke repositori Anda.
davogones
sumber
Oke dalam hal ini, pertanyaannya adalah bagaimana melakukan apa yang baru saja Anda jelaskan. (Jawaban: gunakan merge mundur)
BCS
1
Saya berbicara tentang bagaimana melakukannya di Tortoise SVN. Saya akan menambahkan lebih banyak detail.
davogones
5

Cara termudah agar saya dapat memulihkan file dan tidak kehilangan riwayat revisi adalah menggunakan salinan SVN , contoh penggabungan di atas bagi saya tampak seperti cara yang lebih kompleks untuk mencapai hal yang sama. Mengapa ada kebutuhan untuk menggabungkan saat Anda hanya ingin memulihkan revisi?

Saya menggunakan yang berikut dalam contoh ini dan itu bekerja dengan cukup baik.

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

Saya sepertinya selalu menggunakan svn copysebagai operasi server jadi tidak yakin apakah itu bekerja dengan dua jalur kerja.

Daniel Honig
sumber
3
SVN COPY adalah pendekatan yang direkomendasikan. Sintaksnya sangat sederhana: svn copy [SVN URL] @ [REVISION # WHERE FILE EXISTS] [LOCAL PATH TO RESTORE TO] dari visualsvn.com/support/svnbook/branchmerge/basicmerging . Baru saja menggunakan ini sendiri.
amit
Ini paling masuk akal bagi saya, saya juga menggunakan pendekatan ini
Dmitry Pashkevich
4

Dengan Tortoise SVN :

Jika Anda belum melakukan perubahan, Anda dapat melakukan pengembalian pada folder induk tempat Anda menghapus file atau direktori.

Jika Anda telah melakukan file yang dihapus, maka Anda dapat menggunakan browser repositori, ubah ke revisi di mana file masih ada dan kemudian gunakan perintah Salin ke ... dari menu konteks. Masukkan jalur ke copy pekerjaan Anda sebagai target dan file yang dihapus akan disalin dari repositori ke copy pekerjaan Anda.

VonC
sumber
bagus. Saya akan mencobanya lain kali.
BCS
1

Anda seharusnya bisa memeriksa satu file yang ingin Anda pulihkan. Cobalah sesuatu seperti di svn co svn://your_repos/path/to/file/you/want/to/restore@revmana revrevisi terakhir di mana file tersebut ada.

Saya harus melakukan ini beberapa saat yang lalu dan jika saya ingat dengan benar, menggunakan -ropsi untuk svntidak berhasil; Saya harus menggunakan :revsintaks. (Meskipun saya mungkin mengingatnya mundur ...)

David Z
sumber
Bukan itu yang saya inginkan. Saya ingin menambal file kembali ke repo dan memberi tahu SVN bahwa itu adalah file yang sama.
BCS