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



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



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

587   9  

9 ответов:

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

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

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

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

svn propedit svn:log --revprop -r NNN 

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

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

потому что 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 client:

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

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

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

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

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

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

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

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

svn propedit -r N --revprop svn:log

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

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

  1. cd to ~/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)

Comments

    Ничего не найдено.