Bagaimana cara membuang perubahan lokal di checkout SVN?

197

Saya ingin mengirimkan diff untuk ditinjau, untuk Proyek Sumber Terbuka.

Saya mendapat kode menggunakan SVN (dari terminal, Ubuntu). Dan saya melakukan pengeditan kecil dalam beberapa file. Sekarang hanya ada satu perubahan yang ingin saya kirim. Sisa dari perubahan yang saya buat, adalah untuk debugging, dan tidak lagi diperlukan.

Saya telah menghasilkan diff menggunakan svn di > ~/os/firstdiff.diff

Jadi pertanyaan saya, Bagaimana cara membuang perubahan lokal saya?

Apakah ada cara SVN untuk melakukannya? Jika tidak, saya harus pergi ke setiap file dan menghapus semua suntingan saya. Lalu saya akan menghasilkan diff baru, dan mengirimkannya.

Vinayak Garg
sumber

Jawaban:

253

Cukup gunakan svn revertperintah, misalnya:

svn revert some_file.php

Itu (seperti setiap perintah svn lainnya) didokumentasikan dengan baik di sumber daya svnbook atau halaman manual, atau bahkan dengan svn helpperintah.

Cédric Julien
sumber
2
Kecuali bahwa Vinayak mungkin ingin menyimpan perubahan lokalnya yang tidak menarik untuk dirinya sendiri.
Basile Starynkevitch
2
@BasileStarynkevitch: Saya sudah membaca pertanyaan lagi, dan sepertinya perubahan lain tidak diperlukan: "" "Sisa dari perubahan yang saya buat, pada dasarnya untuk debugging, dan tidak lagi diperlukan." "" :)
Cédric Julien
1
Ya ... tapi dia ingin membuat mereka lebih jauh untuk dirinya sendiri ... (Pertanyaannya mungkin dipahami dua arah).
Basile Starynkevitch
193

Anda harus mengembalikan semua perubahan menggunakan perintah svn revert :

  • Kembalikan perubahan ke file: svn revert foo.c
  • Kembalikan seluruh direktori file: svn revert --recursive .
Alberto Spelta
sumber
1
referensi ke svn 1.1 agak lama, meskipun faktanya itu adalah tautan pertama yang diberikan oleh google ;)
Cédric Julien
rupanya beberapa karakter dalam nama file Anda dapat diabaikan. misalnya [email protected]. svn kembalikan [email protected]. svn mengatakan Dilewati 'Ikon'.
topwik
1
Ini jawaban terbaik. Itu harus diperiksa.
rickfoosusa
12
The svn revert --recursive .membantu saya banyak .
Paul Vargas
Ini harus menjadi jawaban yang diterima, karena --recursiveparameter mengembalikan setiap perubahan lokal dan ini adalah pertanyaannya.
arueckauer
15

Untuk membuang perubahan lokal dalam satu file tertentu:

$ svn revert example_directory/example_file.txt

Untuk membuang perubahan lokal dalam satu folder tertentu:

$ svn revert -R example_directory/
batigolix
sumber
7

Sederhana svn revertsudah cukup untuk poster aslinya. Namun, sederhana svn reverttidak akan dilakukan dalam kasus yang lebih umum di mana Anda

  1. memiliki kedua pengeditan yang ingin Anda bagikan dan pengeditan yang tidak ingin Anda bagikan dalam file yang sama ,
  2. memiliki perubahan lokal yang Anda masih tertarik untuk menjaga demi keuntungan pribadi Anda sendiri .

Saran @ ErichBSchulz tentang penggunaan git add -psangat masuk akal dan jauh lebih umum berlaku dalam kasus seperti itu. Jawabannya hanya kurang detail. Dengan asumsi direktori Anda saat ini adalah direktori yang ingin Anda buat tambalan yang dapat dibagi, Anda dapat melakukan sesuatu seperti ini:

  1. Periksa versi asli dari subversi ke direktori lain (pilih nama direktori yang tidak ada, di sini menggunakan subdirektori TMP/).

    $ url=$(svn info . | awk '/^URL/ {print $2}')
    $ svn checkout "$url" TMP
    
  2. Menggunakan checkout svn yang asli sebagai basis, init repositori git, mengabaikan direktori .svn; komit semua yang ada di svn menuju repositori git sementara Anda

    $ cd TMP                                                     
    $ git init && echo ".svn/" > .gitignore
    $ git add -A && git commit
    $ cd ..
    
  3. Salin data meta repositori git yang baru disiapkan ke direktori kerja asli Anda; karena direktori checkout subversi murni tidak diperlukan, Anda dapat menyingkirkannya. Direktori kerja Anda sekarang adalah repositori git dan subversi:

    $ mv TMP/.git .
    $ rm -rf TMP/
    
  4. Anda sekarang dapat menggunakan yang kuat dan nyaman git add -puntuk secara interaktif memilih apa yang ingin Anda bagikan, dan mengkomitnya ke repositori git Anda. Jika Anda perlu menambahkan file ke komit, lakukan juga git add <file-to-add>sebelumnyagit commit

    $ git add -p                            
    <interactively select (and edit) the chunks you want to share>
    $ git add ${the_list_of_files_not_in_yet_in_svn_you_want_to_add}
    $ git commit
    
  5. Menggunakan komit, siapkan tambalan yang ingin Anda bagikan. Untuk tujuan ini, Anda juga dapat menggunakan git diff HEAD^..HEAD, atau git format-patch(yang terakhir dapat digunakan untuk langsung menyiapkan email yang akan dikirim berisi tambalan atau banyak tambalan):

    $ git show -p HEAD > my-mighty-patch.patch
    

Untuk menghilangkan data git meta, lakukan saja rm -rf .git/. Jika Anda berencana untuk terus meretas dengan direktori kerja asli, Anda dapat terus menggunakan gituntuk mengelola perubahan lokal Anda. Dalam hal ini Anda mungkin akan mendapat manfaat dari investasi belajar cara menggunakan git svn.

Catatan: Jika Anda terbiasa dengan githal ini agak sepele untuk berimprovisasi. Kalau tidak, ini terlihat mungkin agak berantakan. Anda dapat menggeneralisasi pendekatan dengan menulis skrip dari langkah-langkah ini untuk mengimplementasikan "komit interaktif" atau "kreasi tambalan interaktif" untuk svn yang dapat digunakan tanpa pemahaman git.

FooF
sumber
3
Terima kasih banyak untuk anonim -1 tanpa penjelasan apa pun. Bagaimanapun, saya mengambil waktu untuk meningkatkan jawaban dengan mengklarifikasi kapan pendekatan ini masuk akal.
FooF
2
Terima kasih banyak untuk perluasan. +1 dari saya! Jangan khawatir. Kerumunan yang tangguh.
ErichBSchulz
1
Terima kasih untuk acungan jempolnya, @ErichBSchulz! Perlahan kita membuat dunia menjadi tempat yang lebih baik untuk hidup meskipun ada banyak musuh !!! ;-)
FooF
4

Anda bisa menggunakannya

 svn diff important/file1.c important/file2.c > $HOME/os/firstdiff.diff

Saat menerbitkan diff Anda, jangan lupa untuk memberi tahu revisi yang dengannya Anda berbeda.

Seperti orang lain menjawab, Anda juga bisa menggunakannya svn revertdengan hati-hati. Itu tergantung apakah Anda ingin menyimpan perubahan lokal untuk pekerjaan Anda di masa depan atau tidak ...

Basile Starynkevitch
sumber
+1 Ini adalah solusi terbaik untuk masalah ini, tetapi dalam hal ini saya benar-benar ingin menyingkirkan semua perubahan saya. Tentu saja, saya tidak ingin revertperubahan saya sepanjang waktu. Jadi saya akan menggunakan cara Anda di masa depan.
Vinayak Garg
3

Pergi ke root repositori itu dan jalankan perintah berikut

svn revert --depth=infinity .
Bunty
sumber
1
svn revert -R .mungkin lebih pendek
jesjimher
1

Anda dapat menggunakan perintah commit pada file yang ingin Anda masukkan, dan menggunakan svn revert command untuk membuang perubahan lokal yang tersisa

jlemos
sumber