Wie bearbeite ich bereits in Subversion festgeschriebene Protokollnachrichten?

550

Gibt es eine Möglichkeit, die Protokollmeldung einer bestimmten Revision in Subversion zu bearbeiten? Ich habe versehentlich den falschen Dateinamen in meine Commit-Nachricht geschrieben, was später verwirrend sein könnte.

Ich habe gesehen, wie ich eine falsche Commit-Nachricht in Git bearbeite. , aber die Lösung für diese Frage scheint für Subversion (laut svn help commit) nicht ähnlich zu sein .

Jeremy Ruten
quelle
26
Ich wollte diese Frage positiv bewerten, aber dann wurde mir klar, dass ich es bereits vor 4 Monaten getan habe :)
oksayt
6
Wenn es sich um Code handelt, machen Sie einfach einige Kommentare und legen Sie die entsprechenden Kommentare erneut fest. Wenn Sie mit Ihren Kommentaren, die den Fehler widerspiegeln, einverstanden sind, ist dies weitaus weniger Aufwand und viel schneller. Wenn nicht, ist die Lösung von Kamil Kisiel eindeutig der richtige Weg.
Marty
Es gibt ein hervorragendes pre-revprop-changeSkript, mit dem der festschreibende Benutzer sein Protokoll bis zu 3 Stunden nach dem Festschreiben ändern kann. Dies ist ein ausgezeichneter Kompromiss zwischen Flexibilität / genauen Protokollen und der Aufrechterhaltung der Genauigkeit des Repositorys: wandisco.com/svnforum/threads/…
jwa
Wenn Sie die Datei nicht ändern können, aber dennoch eine neuesvn propset dummyproperty 1 yourfile; svn commit yourfile -m yourmessage
Festschreibungsnachricht

Antworten:

457

Im Wesentlichen müssen Sie über Administratorrechte (direkt oder indirekt) für das Repository verfügen, um dies zu tun. Sie können das Repository entweder so konfigurieren, dass alle Benutzer dies tun können, oder Sie können die Protokollnachricht direkt auf dem Server ändern.

Siehe diesen Teil der Subversion-FAQ (Schwerpunkt Mine):

Protokollnachrichten werden im Repository als Eigenschaften gespeichert, die jeder Revision zugeordnet sind. Standardmäßig kann die Protokollnachrichteneigenschaft (svn: log) nach dem Festschreiben nicht mehr bearbeitet werden . Dies liegt daran, dass Änderungen an den Revisionseigenschaften (von denen svn: log eine ist) dazu führen, dass der vorherige Wert der Eigenschaft dauerhaft verworfen wird, und Subversion versucht, Sie daran zu hindern, dies versehentlich zu tun. Es gibt jedoch verschiedene Möglichkeiten, Subversion dazu zu bringen, eine Revisionseigenschaft zu ändern.

Die erste Möglichkeit besteht darin, dass der Repository-Administrator Änderungen an den Revisionseigenschaften aktiviert. Dazu erstellen Sie einen Hook mit dem Namen "pre-revprop-change" (weitere Informationen hierzu finden Sie in diesem Abschnitt im Subversion-Buch). Der Hook "Pre-Revprop-Change" hat Zugriff auf die alte Protokollnachricht, bevor sie geändert wird, sodass sie auf irgendeine Weise beibehalten werden kann (z. B. durch Senden einer E-Mail). Sobald Änderungen an den Revisionseigenschaften aktiviert sind, können Sie die Protokollnachricht einer Revision ändern, indem Sie den Schalter --revprop an svn propedit oder svn propset übergeben, wie eine der folgenden:

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

Dabei ist N die Revisionsnummer, deren Protokollnachricht Sie ändern möchten, und URL der Speicherort des Repositorys. Wenn Sie diesen Befehl in einer Arbeitskopie ausführen, können Sie die URL weglassen.

Die zweite Möglichkeit zum Ändern einer Protokollnachricht ist die Verwendung von svnadmin setlog. Dies muss unter Bezugnahme auf den Speicherort des Repositorys im Dateisystem erfolgen. Mit diesem Befehl können Sie kein Remote-Repository ändern.

$ svnadmin setlog REPOS_PATH -r N FILE

Dabei ist REPOS_PATH der Speicherort des Repositorys, N die Revisionsnummer, deren Protokollnachricht Sie ändern möchten, und FILE ist eine Datei, die die neue Protokollnachricht enthält. Wenn der Hook "pre-revprop-change" nicht vorhanden ist (oder Sie das Hook-Skript aus irgendeinem Grund umgehen möchten), können Sie auch die Option --bypass-hooks verwenden. Wenn Sie sich jedoch für diese Option entscheiden, seien Sie sehr vorsichtig. Möglicherweise umgehen Sie beispielsweise E-Mail-Benachrichtigungen über die Änderung oder Sicherungssysteme, die die Revisionseigenschaften verfolgen.

Kamil Kisiel
quelle
15
Ab dem 3. Februar 2010 lautet die URL subversion.apache.org/faq.html#change-log-msg
GreenMatt
1
Hier ist eine grundlegende Implementierung für die svnadmin-Option svn-change-commit
albfan
2
Vielen Dank! Noch nützlich 6,5 Jahre nach der Antwort. :-)
Michael
Die Propedit-Methode hat mehr oder weniger funktioniert; Die Protokolländerung konnte jedoch nicht im Repo-Browser angezeigt werden. Ich konnte nur das aktualisierte Protokoll in der svn-Befehlszeile in Windows sehen. Ich musste den Protokollcache als letzten Schritt aktualisieren
user_007
89

Wenn Sie diesen Befehl ausführen,

svn propedit svn:log --revprop -r NNN 

und nur für den Fall, dass Sie diese Nachricht sehen:

DAV-Anfrage fehlgeschlagen; Es ist möglich, dass der Pre-Revprop-Change-Hook des Repositorys fehlgeschlagen ist oder nicht vorhanden ist

Dies liegt daran, dass Sie mit Subversion keine Protokollnachrichten ändern können, da diese nicht konvertiert sind und dauerhaft verloren gehen.

Von Unix gehostete SVN

Wechseln Sie in das Hooks-Verzeichnis auf Ihrem Subversion-Server (ersetzen Sie ~ / svn / reponame durch das Verzeichnis Ihres Repositorys).

cd ~/svn/reponame/hooks

Entfernen Sie die Erweiterung

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

Mach es ausführbar (kann nicht chmod + x!)

chmod 755 pre-revprop-change

Quelle

Von Windows gehostete SVN

Die Vorlagendateien im Hooks-Verzeichnis können nicht verwendet werden, da sie Unix-spezifisch sind. Sie müssen eine Windows-Batchdatei pre-revprop-change.batin das Hooks-Verzeichnis kopieren , z. B. das hier bereitgestellte .

Alex. S.
quelle
1
Warum Sie in Klammern geschrieben „kann nicht tun chmod + x“?
Apostel
1
Ich habe ein kleines Skript erstellt, das die gleiche Idee hier umsetzt. Blog.mmonem.com/enable-changing-svn-log
mmonem
SVN_EDITOR, VISUAL oder EDITOR müssen vor der Verwendung von svn propedit
Gerd
48

Hier ist eine praktische Variante, die ich in der FAQ nicht erwähnt sehe. Sie können die aktuelle Nachricht zur Bearbeitung zurückgeben, indem Sie einen Texteditor angeben.

svn propedit svn:log --revprop -r N --editor-cmd vim
mcqwerty
quelle
17
Es ist erforderlich, dass der Hook erstellt wurde - für den Administratorrechte erforderlich sind. svn: Repository has not been enabled to accept revision propchanges; ask the administrator to create a pre-revprop-change hook
Matt
Hier ist ein Skript, um das Protokoll zu aktivieren: blog.mmonem.com/enable-changing-svn-log
mmonem
37
svnadmin setlog /path/to/repository -r revision_number --bypass-hooks message_file.txt
nickf
quelle
Ich verwende Google Code, daher glaube ich nicht, dass ich das so machen kann, aber danke.
Jeremy Ruten
4
Dies funktionierte für mich, da die Propedit-Methode mit "Repository konnte keine Revisions-Propchanges akzeptieren" fehlgeschlagen ist. Vielen Dank!
Pfctdayelise
1
+1 für den direkten Befehl :-) apache.org war gerade nicht verfügbar und ich konnte keinem bestimmten Link folgen ...
Rafa
Diese Antwort verdient mehr Punkte! Es ist besser, weil Sie den Hook nicht einrichten müssen, um ihn zu verwenden.
Peri Hartman
1
Stoß für diese Antwort, arbeitete für mich, ohne den Haken einzurichten, änderte auch nicht die Revision "Datum / Uhrzeit" im Protokoll, nur die Nachricht, genau das, was ich mir erhofft hatte.
SegFaultCoder
17

Ich wurde kürzlich auch damit beauftragt.

Wir wollten unseren Programmierern erlauben, nur ihre eigenen Commit-Nachrichten zu ändern und einzuschränken, wie weit sie dies zurück dürfen. Wir haben beschlossen, dass sie alle an diesem Tag festgeschriebenen Protokollnachrichten ändern, Tippfehler usw. beheben dürfen.

Nachdem ich mir ein paar andere Beispiele online angesehen habe, habe ich dies zusammen gehackt. Wir befinden uns in einer Windows-Umgebung. Dies ist also unser Inhalt von 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: Ursprüngliche Idee dazu kam aus diesem Thread :

Josh Weatherly
quelle
7
Aus irgendeinem Grund musste ich auf meinem System (mit Server 2012 und VisualSVN) bei der letzten Datumsprüfung if /I not '%DATESTAMPDAY%'=='%DAY%' goto ERROR_MSGTOOOLDin doppelte Anführungszeichen um die beiden Variablen wechseln. (Sie würden nicht glauben, wie lange das gedauert hat, um herauszufinden.) Andernfalls würde ich Dinge wie "== '02' ist zu diesem Zeitpunkt unerwartet" (am 2. Tag des Monats) erhalten. Mein Batch-Fu ist nicht stark genug, um zu wissen, warum das passiert, aber falls jemand anderes auf seltsame Probleme stößt, kann es helfen.
Carl Bussema
@ CarlBussema: Danke für diesen Leckerbissen. Du hast mir gerade große Kopfschmerzen erspart.
Daniel Szabo
1
Beachten Sie auch, dass das obige Skript das amerikanische Datumsformat "Erwartet das Datum im Format: Do 08/01/2013" verwendet . Wenn Sie dies nicht verwenden, müssen Sie diesen Teil ändern. In meinem Fall war das Format "mm.dd.yy" und ohne den Wochentag.
Zitrax
Das ist eine coole Variante dieser schönen Antwort: stackoverflow.com/questions/6155/…
NateJ
17

Unter Windows mit dem Tortoise SVN-Client:

  1. Klicken Sie mit der rechten Maustaste in Ihren Projektordner und wählen Sie "Protokoll anzeigen".
  2. Klicken Sie im Fenster "Protokollnachrichten" mit der rechten Maustaste auf eine Revision und wählen Sie "Protokollnachricht bearbeiten".

Wenn es aufgrund der Art und Weise, wie SVN auf dem Server eingerichtet ist, möglicherweise nicht funktioniert, lesen Sie hier andere Antworten.

Andrei N.
quelle
Danke, das war eine einfachere Lösung für mich, +1. Ist wichtig, um Berechtigungen zu haben.
TheGabyRod
12

Wenn Sie eine IDE wie Eclipse verwenden, können Sie diesen einfachen Weg verwenden.

Right click on the project -> Team - Show history

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

Sie können die Nachricht von hier aus beliebig ändern.

mani_nz
quelle
Zumindest in TortoiseSVN schlägt der Versuch, die Festschreibungseigenschaften für ein Festschreiben im Festschreibungsprotokoll zu bearbeiten, mit derselben Fehlermeldung fehl wie der Versuch, die Protokollnachricht direkt zu bearbeiten.
Christian Severin
1
"DAV-Anforderung fehlgeschlagen. Möglicherweise ist der Pre-Revprop-Change-Hook des Repositorys fehlgeschlagen oder nicht vorhanden. Das Repository konnte keine Revisions-Propchanges akzeptieren. Bitten Sie den Administrator, einen Pre-Revprop-Change-Hook zu erstellen." Aber wie gesagt: Das ist TortoiseSVN (als Nicht-Administrator), nicht Eclipse. Vielleicht hackt Eclipse die SVN-Berechtigungen, um diesen Hook zu erstellen, ich weiß es nicht.
Christian Severin
Ja vielleicht. Versuchen Sie es in Eclipse.
Mani_nz
@ChristianSeverin, ich erhalte die gleiche Fehlermeldung, wenn ich Eclipse verwende. Es kommt sicherlich vom Subversion-Server.
GreenhouseVeg
10

Wenn Ihr Repository das Festlegen von Revisionseigenschaften über den Pre-Revprop-Change-Hook ermöglicht, können Sie Protokollnachrichten viel einfacher ändern.

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

Oder in TortoiseSVN, AnkhSVN und wahrscheinlich vielen anderen Subversion-Clients, indem Sie mit der rechten Maustaste auf einen Protokolleintrag klicken und dann "Protokollnachricht ändern".

Bert Huijben
quelle
2
In Subclipse (Eclipse) heißt es "Commit-Eigenschaften festlegen".
pfctdayelise
2

In den Subversion-FAQ wird dies behandelt, es werden jedoch einige verwirrende undefinierte Begriffe verwendet, REPOS_PATHohne dass tatsächliche Beispiele angegeben werden.

Es kann einige Versuche dauern, bis es funktioniert. Speichern Sie daher Ihre aktualisierte Festschreibungsnachricht in einer Datei. Im Gegensatz zu svn-commit.tmpDateien behält Subversion Ihre Eingabe nicht bei, wenn ein Problem auftritt.

Führen Sie in Ihrem Arbeitsverzeichnis aus

svn propedit -r N --revprop svn:log

um die Commit-Nachricht zu bearbeiten. Wenn das funktioniert, großartig! Aber es wird wahrscheinlich nicht, weil diesvn:log Fall Revisionseigenschaft nicht versioniert ist und Subversion standardmäßig verhindert, dass Sie sie überschreiben, entweder mit dem Hook-Skript pre-revprop-change oder mit der Fehlermeldung, dass Sie keinen solchen Hook haben.

Um die Hooks zu ändern, benötigen Sie Zugriff auf das Dateisystem, auf dem das Repository gehostet wird. svn infowird Ihnen das Repository-Stammverzeichnis mitteilen. Angenommen, es ist ~/svnrepo.

  1. cd zu ~/svnrepo/hooks
  2. Gibt es ein pre-revprop-change oder ein pre-revprop-change.batSkript? Wenn ja, kommentieren Sie vorübergehend den Teil aus, der abgebrochen wird, wenn Sie versuchen, Änderungen vorzunehmen svn:log.
  3. Andernfalls erstellen Sie unter Windows eine leere Datei mit dem Namen pre-revprop-change.bat. Hier ist eine Möglichkeit, dies zu tun:

    copy con pre-revprop-change.bat
    ^Z
    
  4. Andernfalls führen Sie unter Unix aus

    echo '#!/bin/sh' > pre-revprop-change
    chmod +x pre-revprop-change
    
  5. Führen Sie in der Arbeitskopie svn propedit -r N --revprop svn:logerneut aus

  6. Machen Sie Ihre Änderungen an ~/svnrepo/hooks/svn-revprop-change( .bat) rückgängig
andrewdotn
quelle
0

Ich habe im svnforum eine nette Implementierung des serverseitigen Pre-Rev-Prop-Change-Hooks gefunden: https://www.svnforum.org/forum/opensource-subversion-forums/scripts-contributions/8571-pre-revprop-change -shell-script-erlaubt-Committern-das-Ändern-des-eigenen-Protokolls innerhalb von x Stunden

Es implementiert

  • Benutzerprüfung, dh nur eigene Commit-Nachrichten können bearbeitet werden.
  • Svn admin override; Der Administrator kann alles bearbeiten.
  • Zeitstempelvergleich: Es können nur Commits bearbeitet werden, die jünger als eine bestimmte Zeit sind

Schnapp es dir von dort und bearbeite es nach Belieben. Ich würde es hier lieber nicht kopieren, da ich nicht der ursprüngliche Autor bin und es keinen Copyright-Hinweis gibt, der es mir erlauben würde, dies zu tun.

Teroi
quelle