Mengapa saya tidak dapat mengedit pesan komit SVN?

12

Saya menggunakan SVN. Terkadang saya kehilangan sesuatu ketika saya menulis pesan komit. Tapi begitu sudah dilakukan, tidak bisa dikembalikan, dan bahkan saya tidak bisa mengedit pesan. Mengapa mereka tidak memasukkan fungsi edit di dalamnya?

Sanghyun Lee
sumber
7
Mengingatkan saya pada kisah Dave.cpp di thedailtywtf
Falcon
1
Cukup gunakan git , memungkinkan untuk menggabungkan komit, mengedit pesan, dan melakukan apa pun yang Anda suka dengan riwayat Anda.
SK-logic
Atau jika Anda tidak bisa, maka gunakan git-svndan tidak ada yang akan menjadi lebih bijak.
Matthew Scharley
@ Matthew: bagaimana dengan git-svn memungkinkan Anda untuk mengubah riwayat dalam repo svn sunting-penonaktifan yang dinonaktifkan?
gbjbaanb
2
@ gbjbaanb: Tidak akan, jika Anda sudah mendorong ke server SVN. Tetapi jika Anda hanya melakukan secara lokal, Anda masih dapat mengubah pesan komit sebelum mendorongnya ke repo langsung.
Matthew Scharley

Jawaban:

15

Menurut FAQ SVN, Anda bisa jika administrator repositori telah mengaktifkannya atau jika Anda memiliki akses administratif lokal ke repositori .

Namun, melakukan ini mungkin ide yang buruk. Anda, pada dasarnya, mengubah sejarah. Salah satu poin dari kontrol versi adalah untuk menjaga riwayat dan jejak audit untuk proyek. Mengizinkan perubahan sewenang-wenang pada sejarah mengalahkan jejak audit. Sebagai gantinya, saya akan merekomendasikan Anda melakukan komit yang lebih kecil, menulis pesan komit yang ringkas namun eksplisit, dan meningkatkan alur kerja pribadi Anda untuk mencegah kesalahan ini.

Thomas Owens
sumber
4
@ Matius Bahkan dalam git, mengubah sejarah pada titik mana pun, menurut pendapat saya, adalah ide yang mengerikan. Sejarah seharusnya berfungsi sebagai jejak audit dan tidak boleh diubah oleh siapa pun pada titik apa pun karena alasan apa pun.
Thomas Owens
2
Jadi memiliki jejak audit untuk pesan komit, karena biasanya tujuan mengubah pesan komit adalah untuk membuatnya lebih mudah untuk mengikuti sejarah proyek.
Peter Taylor
2
Misalkan saya menemukan bahwa pesan komit yang saya masukkan sebulan lalu menyesatkan, membingungkan, dan benar-benar salah . Haruskah saya menambahkan notasi koreksi yang akan dilihat oleh semua orang yang melihat pesan yang salah? (Saya setuju bahwa pesan asli harus dengan mudah tersedia tanpa dimodifikasi dan perubahan itu sendiri harus dilacak dan dicatat waktu. Tetapi saya tidak setuju bahwa ini merupakan "perubahan sejarah".)
David Schwartz
2
Informasi yang salah tidak dapat diterima, oleh karena itu orang tidak boleh diizinkan untuk mengoreksi atau mengklarifikasi informasi tersebut, karena itu akan menyembunyikan kesalahan mereka. Wow. Cuma wow.
David Schwartz
3
Anda jujur ​​mulai terlihat seperti parodi diri. "Itu harus benar, oleh karena itu tidak boleh diperbaiki."
David Schwartz
5

Pada dasarnya Anda harus memiliki hak admin (langsung atau tidak langsung) ke repositori untuk melakukan ini. Anda dapat mengkonfigurasi repositori untuk memungkinkan semua pengguna melakukan ini, atau Anda dapat memodifikasi pesan log langsung di server.

Periksa FAQ SVN di sini.

Pesan log disimpan dalam repositori sebagai properti yang dilampirkan pada setiap revisi. Secara default, properti pesan log (svn: log) tidak dapat diedit setelah dilakukan. Itu karena perubahan pada properti revisi (yang svn: log adalah salah satunya) menyebabkan nilai properti sebelumnya secara permanen dibuang, dan Subversion berusaha mencegah Anda melakukan hal ini secara tidak sengaja. Namun, ada beberapa cara untuk membuat Subversion mengubah properti revisi.

Cara pertama adalah bagi administrator repositori untuk mengaktifkan revisi properti revisi. Ini dilakukan dengan membuat kait yang disebut "pre-revprop-change" (lihat bagian ini di buku Subversion untuk detail lebih lanjut tentang cara melakukan ini). Hook "pre-revprop-change" memiliki akses ke pesan log lama sebelum diubah, sehingga dapat melestarikannya dengan cara tertentu (misalnya, dengan mengirim email). Setelah modifikasi properti revisi diaktifkan, Anda dapat mengubah pesan log revisi dengan meneruskan sakelar --revprop ke svn propedit atau svn propset, seperti salah satu dari ini:

$svn propedit -r N --revprop svn:log URL 
$svn propset -r N --revprop svn:log "new log message" URL 

di mana N adalah nomor revisi yang pesan lognya ingin Anda ubah, dan URL adalah lokasi repositori. Jika Anda menjalankan perintah ini dari dalam copy yang berfungsi, Anda dapat meninggalkan URL.

Cara kedua mengubah pesan log adalah dengan menggunakan setv svnadmin. Ini harus dilakukan dengan merujuk ke lokasi repositori pada sistem file. Anda tidak dapat mengubah repositori jarak jauh menggunakan perintah ini.

$ svnadmin setlog REPOS_PATH -r N FILE

di mana REPOS_PATH adalah lokasi repositori, N adalah nomor revisi yang pesan lognya ingin Anda ubah, dan FILE adalah file yang berisi pesan log baru. Jika hook "pre-revprop-change" tidak ada di tempat (atau Anda ingin mem-bypass skrip kait untuk beberapa alasan), Anda juga dapat menggunakan opsi --bypass-hooks. Namun, jika Anda memutuskan untuk menggunakan opsi ini, berhati-hatilah. Anda mungkin melewati hal-hal seperti pemberitahuan email tentang perubahan, atau sistem cadangan yang melacak properti revisi.

Jawaban dari Kamil Kisiel dalam menanggapi pertanyaan serupa tentang Stack Overflow .

Abimaran Kugathasan
sumber
Saat Anda menyalin tempel jawaban dari stackoverflow, Anda setidaknya harus menandainya sebagai kutipan dan memberikan kredit kepada OP (Kamil Kisiel dalam kasus ini). Tautan ke yang asli: stackoverflow.com/questions/304383/... Harap edit jawaban Anda atau saya akan menurunkan suara Anda.
Falcon
4

Karena ini adalah sistem kontrol versi terpusat - Segera setelah Anda melakukan perubahan (dan pesan komit Anda terikat oleh komit), setiap orang yang telah membaca akses ke repositori dapat melihat informasi itu. Adalah ide yang buruk untuk mengubah informasi setelah disebarluaskan , karena orang akhirnya memiliki pendapat yang berbeda tentang "kenyataan".

Sistem kontrol versi terdistribusi seperti Git mengatasi masalah ini dengan memastikan bahwa tindakan membuat informasi tersedia untuk orang lain adalah atomik dan tanpa informasi tambahan seperti pesan komit. Tetapi prinsip yang sama berlaku di sini: Anda tidak disarankan untuk mengubah hal-hal secara lokal yang telah Anda sediakan bagi orang lain.

l0b0
sumber
Mereka dapat mengizinkan beberapa versi pesan komit ...
Alex Feinman
1
@ l0b0 bukankah lebih buruk secara obyektif untuk terus menyebarkan informasi yang salah, menyesatkan, atau rawan kerusakan? Penyimpanan catatan tidak membutuhkan data buruk.
user179700
1
@ user179700: Anda benar. Ada asumsi desain yang cacat secara mendasar di semua VCSes yang pernah saya lihat: Komit memiliki satu pesan komit, yang tidak dapat diubah. Seperti yang dikatakan Alex, kita harus "mengizinkan beberapa versi dari pesan commit".
l0b0
@ l0b0 Saya menemukan pertanyaan ini menarik semakin saya menganggapnya. Reaksi pertama saya adalah sepanjang baris, hanya menulis lebih hati-hati. Praktek saat ini tampaknya melumpuhkan prosesnya. Saya juga bertanya-tanya apakah ada sistem lain yang menerapkan praktik yang lebih kuat. Waktu untuk pertanyaan lain. +1
user179700
@ user179700: Saat ini saya berharap dapat menulis skrip yang memungkinkan Anda untuk mengubah pesan komit, tetapi hanya dengan menambahkan string tambahan (cap waktu). Itu memungkinkan Anda memperbaiki kesalahan sambil mempertahankan jejak audit.
Tynam