Bagaimana cara mengedit pesan log yang sudah dilakukan di Subversion?

550

Apakah ada cara untuk mengedit pesan log dari revisi tertentu di Subversion? Saya tidak sengaja menulis nama file yang salah dalam pesan komit saya yang dapat membingungkan nantinya.

Saya telah melihat Bagaimana cara mengedit pesan komit yang salah di Git? , tetapi solusi untuk pertanyaan itu tampaknya tidak serupa untuk Subversion (menurut svn help commit).

Jeremy Ruten
sumber
26
Saya akan menjawab pertanyaan ini, tetapi kemudian saya menyadari bahwa saya sudah melakukannya 4 bulan yang lalu :)
oksayt
6
Jika ini kode, buat saja komentar dan komit kembali dengan komentar yang sesuai. Jika Anda setuju dengan komentar Anda yang mencerminkan kesalahan, itu jauh lebih mudah dan lebih cepat. Jika tidak solusi oleh Kamil Kisiel jelas cara yang tepat untuk melakukannya.
marty
Ada pre-revprop-changeskrip luar biasa yang memungkinkan pengguna yang berkomitmen untuk memodifikasi log mereka hingga 3 jam setelah komit. Ini adalah kompromi yang sangat baik antara fleksibilitas / log akurat, dan memelihara kesetiaan repositori: wandisco.com/svnforum/threads/...
JWA
jika Anda tidak dapat mengubah file tetapi masih ingin menambahkan pesan komit baru maka Anda dapat melakukannyasvn propset dummyproperty 1 yourfile; svn commit yourfile -m yourmessage
mulllhausen

Jawaban:

457

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 mengubah pesan log langsung di server.

Lihat ini bagian dari Subversion FAQ (penekanan):

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 modifikasi 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 hook 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.

Kamil Kisiel
sumber
15
Pada 3 Februari 2010, URL-nya adalah subversion.apache.org/faq.html#change-log-msg
GreenMatt
1
Berikut ini adalah implementasi dasar untuk opsi svnadmin svn-change-commit
albfan
2
Terima kasih! Masih bermanfaat 6,5 tahun setelah jawabannya. :-)
Michael
Metode propedit kurang lebih berfungsi; Namun, saya tidak bisa mendapatkan perubahan log untuk tercermin di browser repo. Saya hanya bisa melihat baris perintah login svn yang diperbarui di Windows. Saya harus menyegarkan cache log sebagai langkah terakhir: stackoverflow.com/questions/25750249/…
user_007
89

Ketika Anda menjalankan perintah ini,

svn propedit svn:log --revprop -r NNN 

dan kalau-kalau Anda melihat pesan ini:

Permintaan DAV gagal; mungkin saja kait repositori-perubahan repositori gagal atau tidak ada

Itu karena Subversion tidak memungkinkan Anda untuk memodifikasi pesan log karena mereka tidak berversi dan akan hilang secara permanen.

SVN yang di-host-unix

Pergi ke direktori hooks di server Subversion Anda (ganti ~ / svn / reponame dengan direktori repositori Anda)

cd ~/svn/reponame/hooks

Hapus ekstensi

mv pre-revprop-change.tmpl pre-revprop-change

Jadikan itu dapat dieksekusi (tidak dapat melakukan chmod + x!)

chmod 755 pre-revprop-change

Sumber

SVN yang dihosting Windows

File template di direktori hook tidak dapat digunakan karena tidak spesifik-Unix. Anda perlu menyalin file batch Windows pre-revprop-change.batke direktori hooks, misalnya yang disediakan di sini .

Alex S.
sumber
1
Mengapa Anda menulis di tanda kurung " tidak dapat melakukan chmod + x!"?
Rasul
1
Saya telah membuat skrip kecil yang mengimplementasikan ide yang sama di sini blog.mmonem.com/enable-changing-svn-log
mmonem
SVN_EDITOR, VISUAL atau EDITOR perlu diset sebelum menggunakan svn propedit
Gerd
48

Berikut adalah variasi praktis yang tidak saya lihat disebutkan dalam faq. Anda dapat mengembalikan pesan saat ini untuk diedit dengan menentukan editor teks.

svn propedit svn:log --revprop -r N --editor-cmd vim
mcqwerty
sumber
17
Itu mengharuskan kait telah dibuat - yang membutuhkan hak admin. svn: Repository has not been enabled to accept revision propchanges; ask the administrator to create a pre-revprop-change hook
Matt
Berikut ini adalah skrip untuk mengaktifkan log: blog.mmonem.com/enable-changing-svn-log
mmonem
37
svnadmin setlog /path/to/repository -r revision_number --bypass-hooks message_file.txt
nickf
sumber
Saya menggunakan Google Code, jadi saya rasa saya tidak bisa melakukannya dengan cara ini, tapi terima kasih.
Jeremy Ruten
4
ini bekerja untuk saya karena metode propedit gagal dengan "Repositori belum diaktifkan untuk menerima revisi revisi". Terima kasih!
pfctdayelise
1
+1 untuk memberikan perintah secara langsung :-) apache.org turun sekarang dan saya tidak bisa mengikuti tautan apa pun yang diberikan ...
Rafa
Jawaban ini layak mendapat lebih banyak poin! Itu lebih baik karena Anda tidak perlu mengatur kait untuk menggunakannya.
Peri Hartman
1
benjolan untuk jawaban ini, bekerja untuk saya tanpa memasang kait, juga tidak mengubah revisi "tanggal / waktu" di log, hanya pesan, yang persis apa yang saya harapkan.
segFaultCoder
17

Saya baru-baru ini ditugaskan dengan ini.

Kami ingin mengizinkan pemrogram kami untuk memodifikasi hanya pesan komit mereka sendiri, dan membatasi seberapa jauh mereka diizinkan melakukannya. Kami memutuskan mereka akan diizinkan untuk mengubah pesan log yang dilakukan hari itu, untuk memperbaiki kesalahan ketik dll.

Setelah melihat beberapa contoh online lainnya saya meretas ini bersama-sama, kita berada di lingkungan windows, jadi ini adalah konten kita dari pre-revprop-change.bat:

@ECHO OFF

set repos=%1
set rev=%2
set user=%3
set propname=%4
set action=%5

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Only allow changes to svn:log. The author, date and other revision
:: properties cannot be changed
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
if /I not '%propname%'=='svn:log' goto ERROR_PROPNAME

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Only allow modifications to svn:log (no addition/overwrite or deletion)
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
if /I not '%action%'=='M' goto ERROR_ACTION

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Only allow user to modify their own log messages
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
set AUTHOR=
for /f "delims=" %%a in ('svnlook author -r %REV% %REPOS%') do @set AUTHOR=%%a

if /I not '%AUTHOR%'=='%user%' goto ERROR_WRONGUSER

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Only allow user to modify log messages from today, old messages locked down
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
set DATESTAMP=
for /f "delims=" %%a in ('svnlook date -r %REV% %REPOS%') do @set DATESTAMP=%%a

for /F "tokens=1-2 delims= " %%a in ("%DATESTAMP%") do (
 set DATESTAMPDATE=%%a
 set DATESTAMPTIME=%%b )

:: Expects DATESTAMPDATE in the format: 2012-02-24
for /F "tokens=1-3 delims=-" %%a in ("%DATESTAMPDATE%") do (
 set DATESTAMPYEAR=%%a
 set DATESTAMPMONTH=%%b
 set DATESTAMPDAY=%%c )

:: Expects date in the format: Thu 08/01/2013
for /F "tokens=1-4 delims=/ " %%a in ("%date%") do (
 set YEAR=%%d
 set MONTH=%%b
 set DAY=%%c )

if /I not '%DATESTAMPYEAR%'=='%YEAR%' goto ERROR_MSGTOOOLD
if /I not '%DATESTAMPMONTH%'=='%MONTH%' goto ERROR_MSGTOOOLD
if /I not '%DATESTAMPDAY%'=='%DAY%' goto ERROR_MSGTOOOLD

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Make sure that the new svn:log message contains some text.
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
set bIsEmpty=true
for /f "tokens=*" %%g in ('find /V ""') do (
 set bIsEmpty=false
)
if '%bIsEmpty%'=='true' goto ERROR_EMPTY

goto :eof

:ERROR_EMPTY
echo Empty svn:log properties are not allowed. >&2
goto ERROR_EXIT

:ERROR_PROPNAME
echo Only changes to svn:log revision properties are allowed. >&2
goto ERROR_EXIT

:ERROR_ACTION
echo Only modifications to svn:log revision properties are allowed. >&2
goto ERROR_EXIT

:ERROR_WRONGUSER
echo You are not allowed to modify other user's log messages. >&2
goto ERROR_EXIT

:ERROR_MSGTOOOLD
echo You are not allowed to modify log messages older than today. >&2
goto ERROR_EXIT

:ERROR_EXIT
exit /b 1 

Sunting: Ide asli untuk ini berasal dari utas ini :

Josh Weatherly
sumber
7
Untuk beberapa alasan, pada sistem saya (menjalankan Server 2012 dan VisualSVN), di cek tanggal terakhir if /I not '%DATESTAMPDAY%'=='%DAY%' goto ERROR_MSGTOOOLD, saya harus beralih ke tanda kutip ganda di sekitar dua variabel. (Anda tidak akan percaya berapa lama waktu yang dibutuhkan untuk mencari tahu.) Kalau tidak, saya akan mendapatkan hal-hal seperti "== '02' tidak terduga pada saat ini" (pada hari ke-2 setiap bulan). Batch-fu saya tidak cukup kuat untuk mengetahui mengapa itu terjadi, tetapi kalau-kalau ada orang lain yang mengalami masalah aneh, mungkin membantu.
Carl Bussema
@CarlBussema: Terima kasih atas berita gembira itu. Anda baru saja menyelamatkan saya dari sakit kepala yang sangat besar.
Daniel Szabo
1
Perhatikan juga bahwa skrip di atas menggunakan format tanggal amerika, "Harapkan tanggal dalam format: Kamis 08/01/2013" . Jadi, jika Anda tidak menggunakannya Anda perlu memodifikasi bagian itu, dalam kasus saya formatnya adalah "mm.dd.yy", dan tanpa hari kerja.
Zitrax
Itu variasi yang keren pada jawaban yang bagus ini: stackoverflow.com/questions/6155/…
NateJ
17

Di Windows, menggunakan klien Tortoise SVN:

  1. klik kanan di folder proyek Anda dan pilih "Tampilkan log"
  2. di jendela Pesan Log, klik kanan pada revisi dan pilih "Edit pesan log"

Jika tidak berhasil, itu mungkin karena cara pengaturan SVN di server, baca tanggapan lain di sini.

Andrei N.
sumber
Terima kasih, ini adalah solusi yang lebih mudah bagi saya, +1. Sangat penting untuk memiliki izin.
theGabyRod
12

Jika Anda menggunakan IDE seperti gerhana, Anda dapat menggunakan cara mudah ini.

Right click on the project -> Team - Show history

Karena right click on the revision id for your commit and select 'Set commit properties' .

Anda dapat mengubah pesan sesuai keinginan dari sini.

mani_nz
sumber
Setidaknya di TortoiseSVN, mencoba mengedit properti komit untuk komit di log komit gagal dengan pesan kesalahan yang sama seperti mencoba untuk langsung mengedit pesan log.
Christian Severin
1
"Permintaan DAV gagal; mungkin saja kait pre-revprop-change repositori gagal atau tidak ada. Repositori tidak diaktifkan untuk menerima revisi revisi; minta administrator untuk membuat kait pre-revprop-change". Tapi seperti yang saya katakan: itu menggunakan TortoiseSVN (sebagai non-admin), bukan Eclipse. Mungkin Eclipse meretas izin SVN untuk membuat kaitan itu, saya tidak tahu.
Christian Severin
Ya mungkin. Coba lakukan dalam gerhana.
mani_nz
@ChristianSeverin, saya mendapatkan pesan kesalahan yang sama saat menggunakan Eclipse. Itu pasti berasal dari server Subversion.
GreenhouseVeg
10

Jika repositori Anda mengaktifkan pengaturan properti revisi melalui kait pre-revprop-change Anda dapat mengubah pesan log lebih mudah.

svn propedit --revprop -r 1234 svn:log url://to/repository

Atau di TortoiseSVN, AnkhSVN dan mungkin banyak klien subversi lainnya dengan mengklik kanan pada entri log dan kemudian 'mengubah pesan log'.

Bert Huijben
sumber
2
di Subclipse (Eclipse) itu adalah "Set Commit Properties".
pfctdayelise
2

The Subversion FAQ mencakup ini, tetapi menggunakan sekelompok membingungkan istilah terdefinisi seperti REPOS_PATHtanpa memberikan contoh-contoh aktual.

Mungkin diperlukan beberapa upaya untuk membuatnya berfungsi, jadi simpan pesan komit Anda yang diperbarui dalam sebuah file. Berbeda dengan svn-commit.tmpfile, Subversion tidak akan mempertahankan pengetikan Anda jika ada masalah.

Di direktori kerja Anda, jalankan

svn propedit -r N --revprop svn:log

untuk mengedit pesan komit. Jika itu berhasil, bagus! Tetapi mungkin tidak, karena svn:logproperti revisi tidak berversi dan Subversion secara default akan menghentikan Anda dari menimpanya, baik dengan skrip kait pre-revprop-change , atau pesan kesalahan yang Anda tidak memiliki kait seperti itu.

Untuk mengubah kait, Anda memerlukan akses ke sistem file tempat repositori di-host. svn infoakan memberi tahu Anda Repositori Root. Misalkan itu ~/svnrepo.

  1. cd untuk ~/svnrepo/hooks
  2. Apakah ada pre-revprop-changeatau pre-revprop-change.batnaskah? Jika demikian, komentar sementara bagian yang batal jika Anda mencoba untuk mengubah svn:log.
  3. Jika tidak, pada Windows, buat file kosong bernama pre-revprop-change.bat. Inilah satu cara untuk melakukannya:

    copy con pre-revprop-change.bat
    ^Z
    
  4. Kalau tidak, di Unix, jalankan

    echo '#!/bin/sh' > pre-revprop-change
    chmod +x pre-revprop-change
    
  5. Dalam copy pekerjaan, jalankan svn propedit -r N --revprop svn:loglagi

  6. Batalkan perubahan Anda ke ~/svnrepo/hooks/svn-revprop-change( .bat)
andrewdotn
sumber
0

Saya menemukan implementasi yang bagus dari sisi kait pre-rev-prop-change sisi server di svnforum: https://www.svnforum.org/forum/opensource-subversion-forums/scripts-contributions/8571-pre-revprop-change -shell-script-allow-commiters-to-change-own-log-dalam-x-jam

Ini mengimplementasikan

  • pengguna memeriksa, itu hanya pesan komit sendiri yang bisa diedit.
  • Admin Svn menimpa; admin dapat mengedit apa saja.
  • perbandingan cap waktu: hanya komitmen yang lebih muda dari waktu tertentu yang dapat diedit

Raih dari sana dan edit sesuka hati. Saya lebih suka tidak menyalinnya di sini karena saya bukan penulis asli dan tidak ada pemberitahuan hak cipta yang memungkinkan saya untuk melakukannya.

teroi
sumber