Bagaimana cara menghapus file dari kontrol versi tanpa menghapusnya?

132

Jika saya menjalankan svn rm file, file dihapus dari copy pekerjaan lokal.

Apa yang saya lakukan sekarang adalah:

$ cp file file2
$ svn rm file
$ svn ci
$ mv file2 file

Bagaimana saya menghindari svn juga menghapus file lokal saat menggunakan svn rm?

Juanjo Conti
sumber

Jawaban:

277

Anda menginginkan --keep-localopsi baris perintah. Ini menghapus file dari kontrol versi tanpa menghapusnya dari sistem file Anda.

$ svn rm --keep-local my_important_file

Catatan: The --keep-localhanya mempengaruhi svn rmsalinan Anda. Pengguna lain mungkin memiliki salinan lokal mereka sendiri dari file yang dihapus kecuali ada konflik antara salinan lokal mereka dan repositori karena perubahan yang mereka buat. Ini mungkin bukan hasil yang diinginkan. Lihat komentar di bawah.

Andres Jaan Tack
sumber
4
Tidakkah itu masih menghapusnya dari sistem orang lain begitu mereka memperbarui?
Nyerguds
1
@Nyerguds Itu benar, karena svn rm sedang menghapus file dari repositori. Jika Anda ingin menghapus file dari repo, TETAPI simpan secara lokal di mesin Anda maka Anda akan menggunakan bendera di atas.
Greg Hilston
6
@GregHilston Seperti yang saya katakan, itu tidak benar-benar membantu dalam proyek multi-programmer yang sebenarnya. Seharusnya ada cara unversion file di mana-mana. Kasus yang paling umum di sini adalah file pengaturan lokal yang dilakukan secara tidak sengaja (sangat umum di proyek Java), tetapi unversioning mereka seharusnya tidak menghapus file pengaturan pengguna lain.
Nyerguds
5
@GregHilston "proyek multi-programmer aktual" agak tersirat dalam "sistem orang lain". Masalahnya adalah ini: orang lain memperbarui, dan mengubah pengaturannya. Ini biasanya tidak terlalu bermasalah, tetapi cukup menjengkelkan ingin menyelesaikannya. Tetapi pada saat itu, ketika mereka telah menimpa pengaturan dan sekarang mendapatkan svn "rm" saat pembaruan, itu sebenarnya menghapus file pengaturan lokal yang berpotensi vital dari sistem mereka, sementara itu seharusnya tidak berversi sehingga dapat dikonfigurasikan ke lokal pengaturan lagi.
Nyerguds
4
Reload file yang lebih lama dari repositori menandainya sebagai dari versi yang lebih lama, artinya pembaruan hanya akan menghapusnya lagi. Tidak ada cara bersih untuk melakukan ini yang tidak memerlukan intervensi manual pada semua mesin dalam proyek.
Nyerguds
13

Menghapus file dari SVN tanpa menghapusnya secara lokal tidak menjadi masalah umum. Salah satu contoh yang menonjol adalah file .classpath dalam proyek Eclipse. Menempatkan file konfigurasi ini di bawah SVN luar biasa selama semua mesin yang digunakan dalam proyek memiliki instalasi Eclipse dan Java yang sama. Setelah kondisi ini dilanggar, komitmen mulai merusak proyek Eclipse lainnya. Ini adalah titik yang harus dihapus file dari SVN tanpa menghapus ist di mana pun.

svn rm --keep-local .classpath

melakukan pekerjaan dengan sempurna pada satu mesin dan pada saat itu.

Masalahnya adalah mesin lain mungkin kehilangan file itu (saat pembaruan) atau menghidupkannya kembali (saat komit). Kelemahan SVN adalah tidak menangani --keep-localdalam repositori atau menyebarkannya ke copy pekerjaan lainnya. Oleh karena itu pada semua mesin lain perintah di atas harus dijalankan - terbaik sebelum komit atau pembaruan.

Ini, tentu saja, akan bekerja 90%, paling banter. Penghapusan dan re-versi akan terjadi secara tiba-tiba. Solusi saya adalah memiliki setiap mesin, saya punya akses langsung atau tidak langsung, lakukan

svn rm --keep-local .classpath
copy .classpath .classpath-nameOfTheMachine
svn add .classpath-nameOfTheMachine

Ini sangat jelek sehingga sulit disebut "solusi". Namun demikian selalu memungkinkan perbaikan cepat dari kecelakaan selanjutnya.

Albrecht Weinert
sumber
-3

Saya tidak punya jawaban untuk pertanyaan yang tepat ini, tapi saya punya jawaban untuk pertanyaan terkait, yaitu bagaimana menghapus semua file (yaitu bukan yang spesifik) dalam direktori dari kontrol versi tanpa menghapusnya secara lokal. Solusi ini berasal dari implementasi Scientific Linux.

ls -a .svn

harus memperlihatkan direktori svn yang menyimpan data kontrol. Secara sederhana:

rm -r .svn

akan menyingkirkan direktori ini. Kemudian ketikkan:

svn status

akan menghasilkan 'peringatan: direktori ini bukan kesalahan copy pekerjaan', karena tidak lagi di bawah kontrol versi.

Saya harap ini membantu.

cjames
sumber
Pertanyaan terkait? Menghapus file dan menghapus seluruh copy pekerjaan adalah hal yang sama sekali berbeda IMHO.
Melebius