Как редактировать сообщение журнала, уже совершенное в Subversion?

есть ли способ редактировать сообщение журнала определенной ревизии в Subversion? Я случайно написал неправильное имя файла в моем сообщении фиксации, которое может быть запутанным позже.

Я видел как отредактировать неверное сообщение фиксации в Git?, но решение этого вопроса, похоже, не похоже на Subversion (согласно svn help commit).

9 ответов


по сути, вы должны иметь права администратора (прямо или косвенно) в хранилище для этого. Вы можете настроить репозиторий так, чтобы разрешить это всем пользователям, или изменить сообщение журнала непосредственно на сервере.

посмотреть эта часть на Subversion FAQ (выделено мной):

сообщения журнала хранятся в репозиторий как свойства, присоединенные к каждая ревизия. по умолчанию, журнал сообщение свойство (svn: log) не может быть отредактировано после его фиксации. То есть поскольку изменения свойств ревизии (из которых svn: log является одним) причина Предыдущее значение свойства должно быть навсегда отброшено, и Subversion пытается помешать вам сделать это случайно. Тем не менее, есть несколько способов получить Subversion изменение свойства ревизии.

первый способ - для репозитория администратор для включения ревизии изменения свойств. Этот выполняемый путем создания крючка под названием "pre-revprop-change "(см. Этот раздел в книге Subversion для большего подробности о том, как это сделать). Этот крюк" pre-revprop-change " имеет доступ в старых сообщений журнала перед измененный, поэтому он может сохранить его в некоторых способ (например, отправив электронная почта.) Как только собственность редакции изменения включены, вы можете изменить сообщение журнала ревизии передача переключателя --revprop в svn или репозиторием. propedit SVN, можно как либо один из эти:

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

где N номер редакции журнала сообщение, которое вы хотите изменить, и URL расположение хранилища. Если вы выполните эту команду из рабочей скопируйте, вы можете оставить URL.

второй способ изменения журнал сообщение должно использовать svnadmin setlog. это должно быть сделано со ссылкой на расположение репозитория на файловая система. Вы не можете изменить удаленный репозиторий, использующий это команда.

$ svnadmin setlog REPOS_PATH -r N FILE

где REPOS_PATH-это репозиторий местоположение, N-номер редакции чье сообщение журнала вы хотите изменить, и файл-это файл, содержащий новый сообщение журнала. Если крючок" pre-revprop-change " отсутствует место (или вы хотите обойти крюк скрипт почему-то), вы также можете используйте опцию --bypass-hooks. Однако, если вы решите использовать этот вариант, будьте очень осторожны. Вы можете быть обход таких вещей, как электронная почта уведомления изменения или резервного копирования системы, отслеживающие процесс пересмотра свойства.


при выполнении этой команды,

svn propedit svn:log --revprop -r NNN 

и на всякий случай вы видите это сообщение:

ошибка запроса DAV; возможно, что pre-revprop-изменение репозитория крюк либо не удалось, либо не существует

это потому, что Subversion не позволяет изменять сообщения журнала, потому что они неверсионные и будут потеряны навсегда.

перейдите в каталог hooks на сервере Subversion (замените ~ / svn / reponame на каталог вашего репозитория)

cd ~/svn/reponame/hooks

удалить расширение

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

сделать его исполняемым (не может сделать chmod +x!)

chmod 755 pre-revprop-change

источник


вот удобный вариант, который я не вижу, упомянутый в faq. Текущее сообщение можно вернуть для редактирования, указав текстовый редактор.

svn propedit svn:log --revprop -r N --editor-cmd vim

svnadmin setlog /path/to/repository -r revision_number --bypass-hooks message_file.txt

недавно мне также было поручено это.

мы хотели позволить нашим программистам изменять только свои собственные сообщения фиксации и ограничить, насколько далеко они могут это делать. Мы решили, что им будет разрешено изменять любые сообщения журнала, совершенные в тот день, исправлять опечатки и т. д.

после просмотра нескольких других примеров онлайн я взломал это вместе, мы находимся в среде windows, так что это наше содержимое 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 

Изменить: Оригинальный идея для этого пришла от этой теме:


Если вы используете IDE, как eclipse, вы можете использовать этот простой способ.

Right click on the project -> Team - Show history

в этой right click on the revision id for your commit and select 'Set commit properties'.

Вы можете изменить сообщение, как вы хотите отсюда.


в Windows, используя клиент Tortoise SVN:

  1. щелкните правой кнопкой мыши в папке проекта и выберите "Показать журнал"
  2. в окне сообщения журнала щелкните правой кнопкой мыши на редакции и выберите "Изменить сообщение журнала"

Если он не работает, это может быть из-за того, как SVN на сервере настроен, прочитайте другие ответы здесь.


Если ваш репозиторий позволяет устанавливать свойства ревизии с помощью крючка pre-revprop-change, вы можете изменить сообщения журнала намного проще.

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

или в TortoiseSVN, AnkhSVN и, вероятно, многих других клиентах subversion, щелкнув правой кнопкой мыши запись журнала, а затем "изменить сообщение журнала".


на Subversion FAQ охватывает это, но использует кучу запутанных неопределенных терминов, таких как REPOS_PATH без каких-либо фактических примеров.

может потребоваться несколько попыток, чтобы заставить его работать, поэтому сохраните обновленное сообщение фиксации в файле. В отличие от svn-commit.tmp файлы, Subversion не сохранит ваш ввод, если есть проблема.

в вашем рабочем каталоге запустите

svn propedit -r N --revprop svn:log

изменить сообщение коммита. Если это сработает, здорово! Но это, вероятно, не будет, потому что svn:log revision свойство является неверсионным и Subversion по умолчанию остановит вас от перезаписи его, либо с hook script pre-revprop-change, или сообщение об ошибке, что у вас нет такого крючка.

менять крючки, вам нужен доступ к файловой системе, на которой хранится репозиторий. svn info сообщит вам корень репозитория. Предположим, это ~/svnrepo.

  1. cd в ~/svnrepo/hooks
  2. есть pre-revprop-change или pre-revprop-change.bat сценарий? Если это так, временно закомментируйте часть его, которая прерывается, если вы пытаетесь изменить svn:log.
  3. в противном случае, на Windows, создайте пустой файл с именем pre-revprop-change.bat. Вот один из способов сделать это:

    copy con pre-revprop-change.bat
    ^Z
    
  4. в противном случае, в Unix, выполните

    echo '#!/bin/sh' > pre-revprop-change
    chmod +x pre-revprop-change
    
  5. в рабочей копии, запустите svn propedit -r N --revprop svn:log снова

  6. отменить изменения ~/svnrepo/hooks/svn-revprop-change(.bat)