Jak edytować komunikat dziennika już zatwierdzony w Subversion?

550

Czy istnieje sposób na edycję komunikatu dziennika określonej wersji w Subversion? Przypadkowo napisałem niepoprawną nazwę pliku w komunikacie zatwierdzenia, co może być mylące później.

Widziałem, jak edytować niepoprawną wiadomość zatwierdzenia w Git? , ale rozwiązanie tego pytania nie wydaje się być podobne w przypadku Subversion (zgodnie z svn help commit).

Jeremy Ruten
źródło
26
Chciałem głosować za tym pytaniem, ale potem zdałem sobie sprawę, że zrobiłem to już 4 miesiące temu :)
oksayt
6
Jeśli jest to kod, po prostu zrób kilka komentarzy i zatwierdź ponownie odpowiednimi komentarzami. Jeśli masz rację z komentarzami odzwierciedlającymi błąd, jest to o wiele mniej wysiłku i znacznie szybsze. Jeśli nie, to rozwiązanie Kamila Kisiela jest zdecydowanie właściwym sposobem na zrobienie tego.
marty
Istnieje doskonały pre-revprop-changeskrypt, który pozwala zatwierdzającemu użytkownikowi modyfikować swój dziennik do 3 godzin po zatwierdzeniu. Jest to doskonały kompromis między elastycznością / dokładnymi logami a utrzymaniem wierności repozytorium: wandisco.com/svnforum/threads/…
jwa 20'14
jeśli nie możesz zmienić pliku, ale nadal chcesz dodać nową wiadomość zatwierdzenia, możesz to zrobićsvn propset dummyproperty 1 yourfile; svn commit yourfile -m yourmessage
Mulllhausen,

Odpowiedzi:

457

Zasadniczo musisz mieć uprawnienia administratora (bezpośrednio lub pośrednio) do repozytorium, aby to zrobić. Możesz albo skonfigurować repozytorium, aby wszyscy użytkownicy mogli to zrobić, albo zmodyfikować komunikat dziennika bezpośrednio na serwerze.

Zobacz tę część z Subversion FAQ (podkreślenie moje):

Komunikaty dziennika są przechowywane w repozytorium jako właściwości dołączone do każdej wersji. Domyślnie właściwości komunikatu dziennika (svn: log) nie można edytować po zatwierdzeniu . Wynika to z faktu, że zmiany we właściwościach rewizji (w tym svn: log) powodują trwałe odrzucenie poprzedniej wartości właściwości, a Subversion próbuje zapobiec przypadkowemu wykonaniu tej czynności. Istnieje jednak kilka sposobów na przekonanie Subversion do zmiany właściwości wersji.

Pierwszym sposobem jest włączenie przez administratora repozytorium modyfikacji właściwości wersji. Odbywa się to poprzez utworzenie haka zwanego „przedpremierową zmianą” (więcej informacji na ten temat można znaleźć w tej sekcji książki Subversion). Hak „przed zmianą poprawki” ma dostęp do starej wiadomości dziennika przed jej zmianą, dzięki czemu może ją w jakiś sposób zachować (na przykład wysyłając wiadomość e-mail). Po włączeniu modyfikacji właściwości wersji można zmienić komunikat dziennika wersji, przekazując przełącznik --revprop do svn propedit lub svn, jak na przykład:

$svn propedit -r N --revprop svn:log URL 
$svn propset -r N --revprop svn:log "new log message" URL 

gdzie N to numer wersji, którego komunikat w dzienniku chcesz zmienić, a URL to lokalizacja repozytorium. Jeśli uruchomisz to polecenie z kopii roboczej, możesz pominąć adres URL.

Drugim sposobem zmiany komunikatu w dzienniku jest użycie svnadmin setlog. Należy to zrobić, odwołując się do lokalizacji repozytorium w systemie plików. Za pomocą tego polecenia nie można modyfikować zdalnego repozytorium.

$ svnadmin setlog REPOS_PATH -r N FILE

gdzie REPOS_PATH jest lokalizacją repozytorium, N jest numerem rewizji, którego komunikat dziennika chcesz zmienić, a PLIK to plik zawierający nowy komunikat dziennika. Jeśli haczyk „przed zmianą poprawki” nie jest na swoim miejscu (lub z jakiegoś powodu chcesz ominąć skrypt przechwytujący), możesz również użyć opcji --bypass-hooks. Jeśli jednak zdecydujesz się skorzystać z tej opcji, bądź bardzo ostrożny. Być może omijasz takie rzeczy, jak powiadomienia e-mail o zmianie lub systemy kopii zapasowych, które śledzą właściwości wersji.

Kamil Kisiel
źródło
15
Na dzień 3 lutego 2010 r. Adres URL to subversion.apache.org/faq.html#change-log-msg
GreenMatt
1
Oto podstawowa implementacja opcji svnadmin svn-change-commit
albfan
2
Dzięki! Nadal przydatne 6,5 roku po odpowiedzi. :-)
Michael
Metoda propedit działała mniej więcej; nie mogłem jednak wyświetlić zmiany dziennika w przeglądarce repozytorium. Zaktualizowany dziennik widziałem tylko w wierszu polecenia svn w systemie Windows. Musiałem odświeżyć pamięć podręczną dziennika jako ostatni krok: stackoverflow.com/questions/25750249/…
user_007
89

Po uruchomieniu tego polecenia

svn propedit svn:log --revprop -r NNN 

i na wszelki wypadek zobaczysz ten komunikat:

Żądanie DAV nie powiodło się; możliwe jest, że hak przed zmianą repozytorium nie zadziałał lub nie istnieje

Jest tak, ponieważ Subversion nie pozwala na modyfikowanie komunikatów w dzienniku, ponieważ są one niewersjonowane i zostaną trwale utracone.

SVN hostowany w systemie Unix

Przejdź do katalogu hooks na serwerze Subversion (zamień ~ / svn / reponame na katalog swojego repozytorium)

cd ~/svn/reponame/hooks

Usuń rozszerzenie

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

Spraw, by był wykonywalny (nie można zrobić chmod + x!)

chmod 755 pre-revprop-change

Źródło

Hostowana przez Windows SVN

Pliki szablonów w katalogu hooks nie mogą być używane, ponieważ są one specyficzne dla Uniksa. Musisz skopiować plik wsadowy systemu Windows pre-revprop-change.batdo katalogu hooks, np . Tutaj podanego .

Alex. S.
źródło
1
Dlaczego napisałeś w nawiasach „ nie mogę zrobić chmod + x!”?
Apostoł
1
Stworzyłem mały skrypt, który realizuje ten sam pomysł tutaj blog.mmonem.com/enable-changing-svn-log
mmonem
SVN_EDITOR, VISUAL lub EDITOR należy ustawić przed użyciem svn propedit
Gerd
48

Oto przydatna odmiana, o której nie widzę w często zadawanych pytaniach. Możesz zwrócić bieżącą wiadomość do edycji, określając edytor tekstu.

svn propedit svn:log --revprop -r N --editor-cmd vim
Mcqwerty
źródło
17
Wymaga to utworzenia haka - co wymaga uprawnień administratora. svn: Repository has not been enabled to accept revision propchanges; ask the administrator to create a pre-revprop-change hook
Matt
Oto skrypt, aby włączyć dziennik: blog.mmonem.com/enable-changing-svn-log
mmonem
37
svnadmin setlog /path/to/repository -r revision_number --bypass-hooks message_file.txt
pseudonim
źródło
Korzystam z Google Code, więc nie sądzę, żebym mógł to zrobić w ten sposób, ale dziękuję.
Jeremy Ruten,
4
działało to dla mnie, ponieważ metoda propedit zawiodła z „Repozytorium nie zostało włączone do akceptowania zmian wersji”. dzięki!
pfctdayelise
1
+1 do wydania polecenia bezpośrednio :-) apache.org spadła już teraz i nie mogłem śledzić dowolną link ...
Rafa
Ta odpowiedź zasługuje na więcej punktów! Jest lepiej, ponieważ nie musisz ustawiać haka, aby z niego korzystać.
Peri Hartman
1
Bump dla tej odpowiedzi, działało dla mnie bez ustawiania haka, nie zmieniłem też wersji „data / godzina” w dzienniku, tylko wiadomość, na którą dokładnie liczyłem.
segFaultCoder,
17

Niedawno mi to również powierzono.

Chcieliśmy umożliwić naszym programistom modyfikowanie tylko własnych komunikatów zatwierdzania i ograniczyć, jak daleko mogą to robić. Zdecydowaliśmy, że będą mogli modyfikować wszelkie komunikaty dziennika zatwierdzone tego dnia, naprawić literówki itp.

Po zapoznaniu się z kilkoma innymi przykładami online zhackowałem to razem, jesteśmy w środowisku Windows, więc oto nasza zawartość 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 

Edycja: oryginalny pomysł na to pochodzi z tego wątku :

Josh Weatherly
źródło
7
Z jakiegoś powodu w moim systemie (działającym na serwerze 2012 i VisualSVN) podczas ostatniej kontroli daty if /I not '%DATESTAMPDAY%'=='%DAY%' goto ERROR_MSGTOOOLDmusiałem przejść do podwójnych cudzysłowów wokół dwóch zmiennych. (Nie uwierzyłbyś, ile czasu to zajęło.) W przeciwnym razie dostałbym takie rzeczy, że „== '02' jest w tej chwili nieoczekiwany” (drugiego dnia miesiąca). Moja partia-fu nie jest wystarczająco silna, aby wiedzieć, dlaczego tak się dzieje, ale na wypadek, gdyby ktoś napotkał dziwne problemy, może to pomóc.
Carl Bussema,
@CarlBussema: Dzięki za ten smakołyk. Właśnie zaoszczędziłeś mi ogromnego bólu głowy.
Daniel Szabo
1
Należy również pamiętać, że powyższy skrypt używa amerykańskiego formatu daty „Oczekuje daty w formacie: czw 08.01.2013” . Jeśli więc nie korzystasz z tego, że musisz zmodyfikować tę część, w moim przypadku był to format „mm.dd.rr” i bez dnia tygodnia.
Zitrax,
To fajna odmiana tej ładnej odpowiedzi: stackoverflow.com/questions/6155/…
NateJ
17

W systemie Windows za pomocą klienta Tortoise SVN:

  1. kliknij prawym przyciskiem myszy folder projektu i wybierz „Pokaż dziennik”
  2. w oknie Wiadomości dziennika kliknij wersję prawym przyciskiem myszy i wybierz polecenie „Edytuj wiadomość dziennika”

Jeśli to nie działa, może to wynikać ze sposobu konfiguracji SVN na serwerze, przeczytaj inne odpowiedzi tutaj.

Andrei N.
źródło
Dzięki temu było to dla mnie łatwiejsze rozwiązanie, +1. Niezbędne jest posiadanie uprawnień.
theGabyRod
12

Jeśli używasz środowiska IDE, takiego jak eclipse, możesz skorzystać z tej prostej metody.

Right click on the project -> Team - Show history

W takim right click on the revision id for your commit and select 'Set commit properties'.

Tutaj możesz zmodyfikować wiadomość, jak chcesz.

mani_nz
źródło
Przynajmniej w TortoiseSVN próba edycji właściwości zatwierdzenia dla zatwierdzenia w dzienniku zatwierdzeń kończy się niepowodzeniem z takim samym komunikatem o błędzie, jak próba bezpośredniej edycji komunikatu dziennika.
Christian Severin,
1
„Żądanie DAV nie powiodło się; możliwe jest, że hak przed zmianą repozytorium nie powiódł się lub nie istnieje Repozytorium nie zostało włączone, aby zaakceptować zmiany wersji; poproś administratora o utworzenie haka przed zmianą poprawki”. Ale jak powiedziałem: używa TortoiseSVN (jako nie-administrator), a nie Eclipse. Może Eclipse włamuje się do uprawnień SVN do stworzenia tego haka, nie wiem.
Christian Severin,
Tak, może Spróbuj zrobić to w zaćmieniu.
mani_nz
@ChristianSeverin, otrzymuję ten sam komunikat o błędzie podczas korzystania z Eclipse. Z pewnością pochodzi z serwera Subversion.
GreenhouseVeg,
10

Jeśli Twoje repozytorium umożliwia ustawienie właściwości rewizji za pomocą haka przed zmianą propozycji, możesz znacznie łatwiej zmieniać komunikaty dziennika.

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

Lub w TortoiseSVN, AnkhSVN i prawdopodobnie wielu innych klientach subversion, klikając prawym przyciskiem myszy wpis dziennika, a następnie „zmień komunikat dziennika”.

Bert Huijben
źródło
2
w Subclipse (Eclipse) jest to „Set Commit Properties”.
pfctdayelise
2

Subversion FAQ Obejmuje to, ale wykorzystuje kilka mylące niezdefiniowanych pojęć jak REPOS_PATHbez podania rzeczywistych przykładów.

Może to potrwać kilka prób, aby go uruchomić, więc zapisz zaktualizowaną wiadomość zatwierdzenia w pliku. W przeciwieństwie do svn-commit.tmpplików, Subversion nie zachowa twojego pisania, jeśli wystąpi problem.

W katalogu roboczym uruchom

svn propedit -r N --revprop svn:log

aby edytować komunikat zatwierdzenia. Jeśli to zadziała, świetnie! Ale prawdopodobnie tak się nie stanie, ponieważ svn:logwłaściwość rewizji jest niewersjonowana, a Subversion domyślnie powstrzyma cię przed nadpisaniem, albo za pomocą skryptu przechwytującego pre-revprop-change, albo komunikatu błędu, że nie masz takiego przechwytywania.

Aby zmienić zaczepy, potrzebujesz dostępu do systemu plików, na którym znajduje się repozytorium. svn infopoinformuje o katalogu głównym repozytorium. Załóżmy, że tak ~/svnrepo.

  1. cd do ~/svnrepo/hooks
  2. Czy istnieje skrypt pre-revprop-changelub pre-revprop-change.batskrypt? Jeśli tak, tymczasowo skomentuj część przerywającą, jeśli spróbujesz zmienić svn:log.
  3. W przeciwnym razie w systemie Windows utwórz pusty plik o nazwie pre-revprop-change.bat. Oto jeden ze sposobów, aby to zrobić:

    copy con pre-revprop-change.bat
    ^Z
    
  4. W przeciwnym razie w systemie Unix uruchom

    echo '#!/bin/sh' > pre-revprop-change
    chmod +x pre-revprop-change
    
  5. W kopii roboczej uruchom svn propedit -r N --revprop svn:logponownie

  6. Cofnij zmiany w ~/svnrepo/hooks/svn-revprop-change( .bat)
andrewdotn
źródło
0

Na stronie svnforum znalazłem fajną implementację haka przed zmianą-prop-zmiany po stronie serwera: https://www.svnforum.org/forum/opensource-subversion-forums/scripts-contribution/8571-pre-revprop-change -shell-script-pozwala-zatwierdzającym-zmienić-własny-log-w ciągu x godzin

Implementuje

  • sprawdzanie przez użytkownika, czyli tylko własne komunikaty zatwierdzania mogą być edytowane.
  • Zastąpienie administratora Svn; Administrator może edytować wszystko.
  • porównanie znaczników czasu: można edytować tylko zatwierdzenia młodsze niż określony czas

Chwyć go stamtąd i edytuj do woli. Wolałbym nie kopiować go tutaj, ponieważ nie jestem oryginalnym autorem i nie ma informacji o prawach autorskich, która pozwoliłaby mi to zrobić.

teroi
źródło