Komitmen Parsial dengan Subversion

104

Mengingat kasus saya membuat dua perubahan independen dalam satu file: mis. menambahkan metode baru dan mengubah metode lain.

Saya sering tidak ingin melakukan kedua perubahan sebagai satu komitmen, tetapi sebagai dua komitmen independen.

Pada repositori git saya akan menggunakan Interaktif Mode dari git-add (1) untuk membagi sepotong menjadi lebih kecil:

 git add --patch

Apa cara termudah untuk melakukan ini dengan Subversion? (Bahkan mungkin menggunakan plug-in Eclipse)

Pembaruan:
Dalam Hal Tentang Git , Ryan menyebutnya: "Masalah Salinan Pekerjaan yang Kusut."

Benedikt Waldvogel
sumber
Apakah Anda mencari solusi secara khusus pada baris perintah? Banyak dari respon di bawah ini menyebutkan TortoiseSVN 'pulihkan setelah komit', yang merupakan fitur khusus Tortoise - jadi berbasis GUI dan Windows.
florisla

Jawaban:

35

Dengan git-svn Anda dapat membuat repositori GIT lokal dari repositori SVN jarak jauh, bekerja dengannya menggunakan set fitur GIT lengkap (termasuk komit parsial) dan kemudian mendorong semuanya kembali ke repositori SVN.

git-svn (1)

jkramer.dll
sumber
25
Ada ironi khusus dalam solusi ini.
tuxayo
65

Tortoise SVN 1.8 sekarang mendukung ini dengan fitur "Pulihkan setelah komit". Ini memungkinkan Anda untuk mengedit file, dengan semua pengeditan dibatalkan setelah komit

Sesuai dokumentasi:

Untuk mengkomit hanya bagian file yang berhubungan dengan satu masalah tertentu:

  1. dalam dialog komit, klik kanan pada file, pilih "pulihkan setelah komit"
  2. edit file di misalnya TortoiseMerge: batalkan perubahan yang belum Anda ingin komit
  3. simpan file
  4. komit file tersebut
Casebash
sumber
Saya bertanya-tanya bagaimana ini bekerja. Saya memeriksa catatan rilis SVN 1.8 , tetapi saya tidak tahu fitur mana yang menjadi dasar "Pulihkan setelah komit".
DavidS
3
@DavidS Ini bukan fitur SVN. Ini adalah fitur TortoiseSVN.
florisla
FYI, SVN 1.8 adalah EOL dari April 2018 dengan rilis 1,10
Greg K
Kami juga dapat menemukannya di dokumentasinya di sini: tortoisesvn.net/docs/release/TortoiseSVN_en/…
Guillaume Husta
42

Saya telah melakukan ini menggunakan TortoiseSVN .

Utilitas gabungan bawaan memungkinkan Anda menampilkan perbedaan antara versi repositori dan copy pekerjaan Anda.

Gunakan fungsi buat cadangan dari utilitas diff

  1. Pergi untuk mengkomit file Anda seolah-olah Anda akan mengkomit semua perubahan Anda.
  2. Di jendela komit, klik dua kali file untuk menampilkan perbedaan.
  3. Dalam pengaturan diff, klik opsi untuk membuat cadangan file asli .
  4. Klik kanan perubahan yang tidak Anda inginkan, dan gunakan pilih gunakan blok teks lain .
  5. Simpan perbedaan tepat satu kali . Cadangan akan ditimpa setiap kali Anda menyimpan. Inilah mengapa Anda hanya ingin menabung sekali.
  6. Lakukan perubahan.
  7. Timpa yang asli dengan file .bak yang telah dibuat (yang akan memiliki semua perubahan asli Anda).
  8. Komit file Anda.

Anda sekarang harus memiliki semua perubahan Anda yang dikomit, menggunakan dua komit terpisah.

Paku
sumber
1
Bagaimana tepatnya Anda melakukan ini? Saya tertarik mempelajari teknik itu.
Lasse V. Karlsen
Akan sangat rapi jika ini akan secara otomatis menimpa file .bak setelah komit.
BCS
Saya tidak menemukan langkah-3: Opsi cadangan, menggunakan Tortoise SVN 1.8.1
sudhAnsu63
4
Lupakan. Menemukan tautan yang sesuai untuk 1.8 tortoisesvn.net/tsvn_1.8_releasenotes.html Untuk melakukan hanya bagian file yang terkait dengan satu masalah tertentu: di dialog komit, klik kanan pada file, pilih "pulihkan setelah komit" edit file di misalnya TortoiseMerge: batalkan perubahan yang tidak ingin Anda komit, simpan file komit file
sudhAnsu63
Sayangnya, ini tampaknya tidak tersedia di Tortoise versi 1.8.5, juga tidak "pulihkan setelah komit".
kajaco
24

Coba gunakan, svn diff > out.patchlalu salin out.patchfile ke out.patch.adddanout.patch.modify

Hanya ketika Anda memiliki file patch yang berfungsi, kembalikan file asli menggunakan svn revert out.c.

Edit file patch dengan tangan sehingga file tersebut hanya berisi hunks untuk ditambahkan atau dimodifikasi. Terapkan ke file asli menggunakan patchperintah, uji apakah penambahan berhasil, lalu svn commitpenambahan.

Cuci bilas ulangi untuk out.patch.modifytambalan.

Jika perubahan terpisah dalam file seperti yang dinyatakan pertanyaan awal Anda - menambahkan metode baru, mengubah metode yang ada - ini akan berhasil

Ini adalah solusi yang sangat membosankan - meskipun saya tidak yakin Anda harus memiliki alasan untuk memisahkan komitmen Anda.

Anda juga bisa memeriksa beberapa copy pekerjaan dari sumber yang sama untuk menerapkan pekerjaan Anda terhadap:

svn co http://location/repository methodAdd

svn co http://location/repository methodModify

Pastikan svn updan uji untuk memastikan semuanya baik-baik saja.

Chris
sumber
11

Ini dimungkinkan menggunakan TortoiseSvn (Windows) sejak v1.8.

4.4.1. Dialog Komit

Jika copy pekerjaan Anda sudah yang terbaru dan tidak ada konflik, Anda siap untuk mengkomit perubahan Anda. Pilih file dan / atau folder apa pun yang ingin Anda komit, lalu TortoiseSVN → Komit ....

<snip>

4.4.3. Lakukan hanya sebagian dari file

Terkadang Anda hanya ingin mengkomit sebagian dari perubahan yang Anda buat ke file. Situasi seperti itu biasanya terjadi ketika Anda sedang mengerjakan sesuatu tetapi kemudian perbaikan mendesak perlu dilakukan, dan perbaikan itu kebetulan ada di file yang sama yang sedang Anda kerjakan.

klik kanan pada file tersebut dan gunakan Menu Konteks → Pulihkan setelah komit. Ini akan membuat salinan file apa adanya. Kemudian Anda bisa mengedit file, misalnya di TortoiseMerge dan membatalkan semua perubahan yang tidak ingin Anda komit. Setelah menyimpan perubahan tersebut, Anda dapat memasukkan file tersebut.

Setelah komit selesai, salinan file dipulihkan secara otomatis, dan Anda memiliki file dengan semua modifikasi Anda yang tidak dikembalikan.

Di Linux, saya akan mencoba http://webstaff.itn.liu.se/~karlu20/div/blog/2013-05-31_SVNP PartialCommit.php. Belum mencobanya sendiri.

parvus.dll
sumber
8

Saya biasa melakukan ini:

  • Di editor saya (saya menggunakan vim), edit file sehingga hanya satu perubahan yang muncul
  • Simpan file (tapi jangan keluar dari editor)
  • Komit file yang diubah ke svn
  • Tekan "batalkan" di editor beberapa kali agar rangkaian perubahan kedua muncul kembali
  • Simpan kembali file tersebut
  • Lakukan rangkaian perubahan kedua.

Ini adalah pendekatan sederhana yang mengasumsikan satu set perubahan cukup mudah untuk dibatalkan. Untuk situasi yang lebih kompleks, saya akan menyerah dan melakukan kedua perubahan tersebut tanpa mengkhawatirkannya.

Sekarang saya menggunakan git, ini adalah sesuatu yang saya harap tidak akan pernah saya lakukan lagi!

Greg Hewgill
sumber
4

Saya menggunakan repo darcs lokal, atau hanya menggabungkan perubahan secara bertahap. Dengan penggabungan (opendiff membuka FileMerge, program penggabungan yang disertakan dengan Xcode; ganti dengan alat penggabung favorit Anda):

cp file file.new
svn revert file
opendiff file.new file -merge file

menggabungkan perubahan terkait, menyimpan gabungan, keluar dari program gabungan

svn ci -m 'first hunk' file
mv file.new file
svn ci -m 'second hunk' file

jika ada lebih dari satu bagian yang tidak terkait dalam file tersebut, bilas dan ulangi (tetapi mengapa Anda menunggu begitu lama sebelum melakukannya ?!)

Selain itu, jika Anda mengetahui git, Anda dapat menggunakan git-svn untuk memelihara repo git lokal dan menyinkronkan komit Anda ke server master svn; bekerja dengan baik dalam pengalaman saya yang terbatas.

Aeon
sumber
9
Re: "Mengapa menunggu begitu lama?" Anda melakukan refactor besar sepanjang hari dan bos memberikan sedikit perbaikan-sekarang-sekarang sebelum makan siang.
BCS
4

Coba VisualSVN untuk Visual Studio . The 6.1 Rilis terbaru memperkenalkan fitur QuickCommit. Anda dapat melakukan sebagian perubahan yang dipilih dalam file menggunakan perintah menu konteks Seleksi Komit ini dan Seleksi Komit baru di editor Visual Studio.

masukkan deskripsi gambar di sini

bahrep
sumber
2
  1. Buka semua file yang ingin Anda bagi di editor-of-choice
  2. Menggunakan set alat yang berbeda (di Win, gunakan saran Spike (versi lama)) mundur dari set kedua
  3. Melakukan
  4. kembali ke editor pilihan Anda dan simpan semua file

Ini sedikit lebih berisiko daripada saran lengkap Spike, tetapi bisa lebih mudah dilakukan. Juga pastikan Anda mencobanya pada hal lain terlebih dahulu karena beberapa editor akan menolak untuk menyimpan file yang telah berubah dari bawah mereka kecuali Anda memuat ulang file itu (kehilangan semua perubahan Anda)

BCS
sumber
0

Saya pikir opsi yang lebih mudah daripada menghasilkan file diff, mengembalikan, dll, akan memiliki dua salinan repositori yang diperiksa, dan menggunakan alat visual diff seperti DeltaWalker untuk menyalin bongkahan dari satu ke yang lain.

Salinan pertama akan menjadi salah satu yang benar-benar Anda kerjakan, dan yang kedua hanya untuk tujuan ini. Setelah Anda membuat banyak perubahan pada yang pertama, Anda dapat menyalin satu bagian ke yang kedua, mengkomitnya, menyalin bagian lain, mengkomitnya, dll.

Ian Dunn
sumber
0
  1. Salin semua file yang dimodifikasi yang bersangkutan ke salinan cadangan.
  2. Buat patch status kerja menggunakan svn diff.
  3. Kembalikan file menggunakan svn revert.
  4. Terapkan kembali bagian dari tambalan yang ingin Anda komit, baik menggunakan patchalat, atau dengan pengeditan manual, atau apa pun.
  5. Jalankan diffsetelah itu untuk membandingkan copy pekerjaan Anda dengan cadangan Anda untuk memastikan Anda menerapkan bagian tambalan dengan benar.
  6. Bangun dan uji.
  7. Melakukan.
  8. Salin salinan cadangan Anda kembali ke repositori check-out.
  9. Ulangi pada 2. (bukan pada 1.!) Sampai selesai.
michaeljt
sumber