2008-11-20 1 views
498

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

Я видел How do I edit an incorrect commit message in Git?, но решение этого вопроса, кажется, не похож на Subversion (в соответствии с svn help commit).

+22

Я собирался поднять этот вопрос, но потом понял, что я уже сделал 4 месяца назад :) – oksayt 2011-08-29 10:21:32

+3

Если это код, просто сделайте несколько комментариев и сделайте повтор с соответствующими комментариями. Если у вас все в порядке с вашими комментариями, отражающими ошибку, это гораздо меньше усилий и намного быстрее. Если не решение Камиля Кисиэля, это, безусловно, правильный способ сделать это. – marty 2012-05-10 15:15:17

+0

Существует отличный сценарий «pre-revprop-change», который позволяет пользователю изменять свой журнал на срок до 3 часов после фиксации. Это отличный компромисс между гибкостью/точными журналами и сохранением верности репозитория: http://www.wandisco.com/svnforum/threads/39203-Pre-revprop-change-shell-script-allows-commiters-to -change-own-log-within-X-hours – jwa 2014-05-20 14:20:59

ответ

417

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

См this part в Subversion FAQ (курсив мой):

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

Первый способ для администратора репозитория для внесения изменений в изменения изменений свойств. Это делается , создав крюк под названием «pre-revprop-change» (см. Этот раздел в книге Subversion для получения более подробной информации о том, как это сделать) . Крючок «pre-revprop-change» имеет доступ к старому сообщению журнала до , поэтому он может сохранить его в некотором способе (например, отправив сообщение ). После пересмотра собственности модификации включены, вы можете изменить сообщение журнала о пересмотре путем прохождения --revprop переключатель Svn propedit или СВН 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 номер ревизии которого журнал сообщения вы хотите изменить, и файл представляет собой файл, содержащий новое сообщение журнала. Если крючок «pre-revprop-change» находится не в месте (или вы хотите обойти крючок сценарий по какой-либо причине), вы также можете использовать опцию --bypass-hooks . Однако, если вы решите использовать этот вариант , будьте очень осторожны. Вы можете быть в обход таких вещей, как электронная почта уведомления об изменениях или резервные копии систем, которые отслеживают ревизию .

+15

По состоянию на 3 февраля 2010 года URL-адрес: http://subversion.apache.org/faq.html#change-log-msg – GreenMatt 2010-02-03 22:45:56

+0

Вот базовая реализация для опции svnadmin [svn -change-commit] (https://github.com/albfan/svn-change-commit) – albfan 2015-07-08 09:33:39

+0

«propedit» не работает для меня на моем Mac – 2016-09-02 14:57:11

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

Я использую Google Code, поэтому я не думаю, что могу это сделать, но спасибо. – 2008-11-20 05:19:44

7

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

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

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

41

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

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

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

svn propedit svn:log --revprop -r NNN 

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

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

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

Перейти к каталогу крючками на вашем Subversion сервере (заменить ~/SVN/reponame с каталогом вашего хранилища)

cd ~/svn/reponame/hooks 

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

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

Сделать это исполняемый файл (не может сделать CHMOD + х!)

chmod 755 pre-revprop-change 

Source

2

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

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

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

svn propedit -r N --revprop svn:log

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

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

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

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

Edit: Оригинальная идея для этого пришел из this thread:

12

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

Right click on the project -> Team - Show history 

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

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

10

В Windows с помощью Tortoise SVN клиента:

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

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

Смежные вопросы