Як редагувати повідомлення журналу, вже зроблене в Subversion?


550

Чи є спосіб редагувати повідомлення журналу певної версії в Subversion? Я випадково написав неправильне ім’я файлу у своєму повідомленні про фіксацію, яке пізніше може заплутатися

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


26
Я збирався підтримати це питання, але потім зрозумів, що вже робив 4 місяці тому :)
oksayt

6
Якщо це код, просто зробіть кілька зауважень та повторіть відповідні коментарі. Якщо ви добре, коли ваші коментарі відображають помилку, це набагато менше зусиль і набагато швидше. Якщо не рішення Каміля Кісіеля - це явно правильний спосіб зробити це.
март

Існує чудовий pre-revprop-changeсценарій, який дозволяє користувачеві, що здійснює зобов’язання, змінювати свій журнал протягом 3 годин після здійснення. Це відмінний компроміс між гнучкістю / точними журналами та підтриманням вірності сховища: wandisco.com/svnforum/threads/…
jwa

якщо ви не можете змінити файл, але все ж хочете додати нове повідомлення про фіксацію, тоді ви можете це зробитиsvn propset dummyproperty 1 yourfile; svn commit yourfile -m yourmessage
mulllhausen

Відповіді:


457

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

Дивіться цю частину поширених запитань про підрив (моє значення):

Повідомлення журналу зберігаються у сховищі як властивості, додані до кожної версії. За замовчуванням властивість повідомлення журналу (svn: log) неможливо редагувати, коли воно робиться . Це відбувається через те, що зміни в властивостях ревізії (з яких svn: log є одним) призводять до того, що попереднє значення властивості буде назавжди відкинуто, і Subversion намагається запобігти цьому випадково. Однак існує кілька способів отримати Subversion для зміни властивості редагування.

Перший спосіб полягає в тому, щоб адміністратор сховища дозволив змінити властивості редагування. Це робиться шляхом створення гачка під назвою "pre-revprop-change" (див. Цей розділ у книзі Subversion, щоб отримати докладнішу інформацію про те, як це зробити). Гак "pre-revprop-change" має доступ до старого повідомлення журналу перед його зміною, тому він може певним чином зберегти його (наприклад, надіславши електронний лист). Після ввімкнення модифікацій властивостей версії ви можете змінити журнал повідомлення редакції, передавши перемикач --revprop на provnvv svn або пропсет 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 - номер редакції, повідомлення журналу якого ви хочете змінити, а FILE - файл, що містить нове повідомлення журналу. Якщо гачок "попередня зміна" не встановлений (або ви хочете чомусь обійти скрипт гачка), ви також можете скористатися опцією --bypass-hooks. Однак якщо ви вирішили скористатися цим варіантом, будьте дуже обережні. Можливо, ви обминаєте такі речі, як сповіщення електронною поштою про зміну або резервні копії систем, які відстежують властивості редагування.


15
Станом на 3 лютого 2010 року URL-адреса є subversion.apache.org/faq.html#change-log-msg
GreenMatt

1
Ось основна реалізація для svnadmin варіант svn-change-commit
albfan

2
Дякую! Ще корисний через 6,5 років після відповіді. :-)
Майкл

Метод пропедиту більш-менш працював; однак я не зміг відобразити зміну журналу для відображення в браузері repo. Я міг бачити лише оновлений журнал у командному рядку svn у Windows. Я повинен був оновити кеш журналу в якості заключного кроку: stackoverflow.com/questions/25750249 / ...
user_007

89

Коли ви запускаєте цю команду,

svn propedit svn:log --revprop -r NNN 

і на всякий випадок, коли ви побачите це повідомлення:

Помилка запиту DAV; можливо, що гак попередньої зміни репозиторію або не вдався, або його немає

Це тому, що Subversion не дозволяє змінювати повідомлення журналу, оскільки вони неперероблені і назавжди будуть втрачені.

SVN з розміщенням у Unix

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

cd ~/svn/reponame/hooks

Видаліть розширення

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

Зробіть його виконуваним (не можна робити chmod + x!)

chmod 755 pre-revprop-change

Джерело

SVN, що розміщено під Windows

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


1
Чому ви написали в дужках " не можна робити chmod + x!"?
Апостол

1
Я створив невеликий сценарій, який реалізує ту саму ідею тут blog.mmonem.com/enable-changing-svn-log
mmonem

SVN_EDITOR, VISUAL або EDITOR потрібно встановити перед тим, як використовувати svn propedit
Герд

48

Ось зручна версія, яку я не бачу згадувати у файлі. Ви можете повернути поточне повідомлення для редагування, вказавши текстовий редактор.

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

17
Для цього потрібно створити гачок - для цього потрібні права адміністратора. svn: Repository has not been enabled to accept revision propchanges; ask the administrator to create a pre-revprop-change hook
Метт

Ось сценарій для ввімкнення журналу: blog.mmonem.com/enable-changing-svn-log
mmonem

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

Я використовую Google Code, тому не думаю, що я можу це зробити так, але дякую.
Джеремі Рутен

4
це спрацювало для мене, оскільки метод пропедиту не вдався, "Репозиторій не ввімкнено для прийому пропозицій змін". Дякую!
pfctdayelise

1
+1 за те, що я дав команду безпосередньо :-) apache.org зараз не працював, і я не міг перейти жодне посилання ...
Рафа

Ця відповідь заслуговує більше балів! Це краще, тому що вам не потрібно встановлювати гачок, щоб ним користуватися.
Пері Хартман

1
bump для цієї відповіді, працював на мене, не встановлюючи гачок, також не змінив редагування "дата / час" у журналі, просто повідомлення, на яке я точно сподівався.
segFaultCoder

17

Нещодавно мені було доручено і це.

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

Переглянувши кілька інших прикладів в Інтернеті, я зламав це разом, ми перебуваємо в середовищі 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 

Редагувати: Оригінальна ідея для цього виникла з цієї теми :


7
Чомусь у моїй системі (під управлінням Server 2012 та VisualSVN) під час перевірки останньої дати if /I not '%DATESTAMPDAY%'=='%DAY%' goto ERROR_MSGTOOOLDмені довелося перейти на подвійні лапки навколо двох змінних. (Ви б не повірили, як довго це знадобиться.) В іншому випадку я отримаю такі речі, як "== '02' в цей час несподівано" (2-й день місяця). Моя партія-фу не є достатньо сильною, щоб знати, чому це відбувається, але якщо хтось інший зіткнеться з дивними проблемами, це може допомогти.
Карл Буссема

@CarlBussema: Дякую за цей примх. Ти щойно врятував мені величезний головний біль.
Даніель Сабо

1
Також зауважте, що вищезазначений сценарій використовує американський формат дати "Очікує дату у форматі: Чт 08.01.2013" . Тож якщо ви не використовуєте, що вам потрібно змінювати цю частину, у моєму випадку формат був "mm.dd.yy", і без тижня.
Zitrax

Це круто варіація на цей хороший відповідь: stackoverflow.com/questions/6155 / ...
NateJ

17

У Windows за допомогою клієнта Tortoise SVN:

  1. клацніть правою кнопкою миші у папці проекту та виберіть "Показати журнал"
  2. у вікні Повідомлення журналу клацніть правою кнопкою миші на версію та виберіть "Редагувати повідомлення журналу"

Якщо це не працює, це може бути пов’язано із способом налаштування SVN на сервері, прочитайте тут інші відповіді.


Дякую, це було простішим рішенням для мене, +1. Необхідно мати дозволи.
theGabyRod

12

Якщо ви використовуєте IDE, як затемнення, ви можете використовувати цей простий спосіб.

Right click on the project -> Team - Show history

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

Ви можете змінити повідомлення, як хочете, звідси.


Принаймні, в TortoiseSVN спроба редагувати властивості фіксації для комісії в журналі фіксації не вдається з тим же повідомленням про помилку, що і спроба безпосередньо редагувати повідомлення журналу.
Крістіан Северин

1
"Запит DAV не вдався; можливо, гачок попередньої зміни репозиторію або невдалий або неіснуючий Репозиторій не ввімкнено для прийому змін для перегляду ревізії; попросіть адміністратора створити гачок попередньої зміни". Але як я вже сказав: це використання TortoiseSVN (як не-адміністратора), а не Eclipse. Можливо, Eclipse зламає дозволи SVN для створення цього гака, я не знаю.
Крістіан Северин

Так, може. Спробуйте це зробити в затемненні.
mani_nz

@ChristianSeverin, я отримую те саме повідомлення про помилку під час використання Eclipse. Це, безумовно, походить із сервера Subversion.
GreenhouseVeg

10

Якщо ваш сховище дозволяє встановити властивості редагування за допомогою гака, який попередньо змінився, ви можете змінити повідомлення журналу набагато простіше.

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

Або в TortoiseSVN, AnkhSVN та, ймовірно, у багатьох інших підривних клієнтів, клацнувши правою кнопкою миші на запис журналу, а потім «змінити повідомлення журналу».


2
в Subclipse (Eclipse) це "Встановити властивості фіксації".
pfctdayelise

2

Subversion FAQ охоплює, але використовує купу оману невизначених термінів , якREPOS_PATH без надання будь - яких реальних прикладів.

Це може зайняти кілька спроб, щоб він працював, тому збережіть оновлене повідомлення про фіксацію у файлі. На відміну від сsvn-commit.tmp файлів, Subversion не збереже ваше введення тексту, якщо є проблема.

У своєму робочому каталозі запустіть

svn propedit -r N --revprop svn:log

щоб відредагувати повідомлення про фіксацію. Якщо це працює, чудово! Але це, мабуть, не буде, тому що svn:logвластивість редагування не буде перетворено, і Subversion за замовчуванням не дозволить вам її перезаписати, або за допомогою сценарію гачка 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)

0

Я знайшов приємну реалізацію гачка попереднього rev-prop-change на стороні сервера на svnforum: https://www.svnforum.org/forum/opensource-subversion-forums/scripts-contributions/8571-pre-revprop-change -shell-script-дозволяє-комітерам змінювати-власний-журнал-протягом-x-годин

Він реалізує

  • перевірка користувача, тобто редагувати можуть лише власні повідомлення про фіксацію.
  • Svn адміністратор перевизначає; адміністратор може редагувати що завгодно.
  • Порівняння часових позначок: можна редагувати лише ті команди, які є молодшими за певний час

Візьміть його звідти і відредагуйте за бажанням. Я б краще не копіював його тут, оскільки я не є оригінальним автором, і немає жодного повідомлення про авторські права, яке дозволило б мені це зробити.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.