Как отредактировать сообщение журнала, уже зафиксированное в Subversion? - PullRequest
537 голосов
/ 20 ноября 2008

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

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

Ответы [ 9 ]

446 голосов
/ 20 ноября 2008

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

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

Сообщения журнала хранятся в хранилище как свойства, прикрепленные к каждая ревизия. По умолчанию журнал свойство сообщения (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 не находится в место (или вы хотите обойти крючок сценарий по какой-то причине), вы также можете используйте опцию --bypass-hooks. Однако, если вы решите использовать это Вариант, будь очень осторожен. Вы можете быть в обход таких вещей, как электронная почта уведомления об изменении или резервное копирование системы, которые отслеживают пересмотр свойства.

87 голосов
/ 19 июня 2009

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

svn propedit svn:log --revprop -r NNN 

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

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

Это потому, что 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, например, предоставленный здесь .

45 голосов
/ 13 апреля 2009

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

svn propedit svn:log --revprop -r N --editor-cmd vim
36 голосов
/ 20 ноября 2008
svnadmin setlog /path/to/repository -r revision_number --bypass-hooks message_file.txt
17 голосов
/ 02 августа 2013

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

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

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

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

14 голосов
/ 15 сентября 2015

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

  1. щелкните правой кнопкой мыши папку вашего проекта и выберите «Показать журнал»
  2. в окне Сообщения журнала, щелкните правой кнопкой мыши на ревизии и выберите «Редактировать сообщение журнала»

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

12 голосов
/ 26 декабря 2013

Если вы используете 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 голосов
/ 20 ноября 2008

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

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

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

2 голосов
/ 07 августа 2012

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

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

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

svn propedit -r N --revprop svn:log

для редактирования сообщения о коммите. Если это работает, отлично! Но, вероятно, этого не произойдет, потому что свойство ревизии svn:log неверсированное, и Subversion по умолчанию не позволит вам перезаписать его, либо с помощью hook-скрипта 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...