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

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

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

Ответ 1

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

Смотрите эту часть Часто задаваемые вопросы о Subversion (выделение мой):

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

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

$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 - номер ревизии чей журнал сообщения вы хотите изменить, и FILE - это файл, содержащий новый сообщение журнала. Если Крючок "pre-revprop-change" не находится в место (или вы хотите обойти крючок script по какой-либо причине), вы также можете используйте опцию --bypass-hooks. Однако, если вы решите использовать это вариант, будьте очень осторожны. Вы можете быть в обход таких вещей, как электронная почта уведомления об изменении или резервное копирование системы, которые отслеживают изменения свойства.

Ответ 2

Когда вы запускаете эту команду,

svn propedit svn:log --revprop -r NNN 

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

Запрос DAV не выполнен; Возможно, что хук репозитория pre-revprop-change либо не удался, либо не существует

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

Unix-хостинг SVN

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

cd ~/svn/reponame/hooks

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

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

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

chmod 755 pre-revprop-change

Источник

Windows-хостинг SVN

Файлы шаблонов в каталоге ловушек нельзя использовать, так как они специфичны для Unix. Вам необходимо скопировать пакетный файл Windows pre-revprop-change.bat в каталог hooks, например, тот, который представлен здесь.

Ответ 3

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

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

Ответ 4

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

Ответ 5

Мне тоже недавно было поручено это сделать.

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

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

Изменить: оригинальная идея для этого появилась из этого потока:

Ответ 6

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

  • щелкните правой кнопкой мыши в папке проекта и выберите "Показать журнал"
  • в окне "Журнальные сообщения" щелкните правой кнопкой мыши по ревизии и выберите "Редактировать сообщение журнала"

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

Ответ 7

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

Right click on the project -> Team - Show history

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

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

Ответ 8

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

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

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

Ответ 9

Subversion FAQ описывает это, но использует кучу запутывающих undefined терминов, таких как REPOS_PATH, не приводя никаких реальных примеров.

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

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

svn propedit -r N --revprop svn:log

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

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

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

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

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

  • Отмените изменения на ~/svnrepo/hooks/svn-revprop-change (.bat)