594 Stimmen

Wie kann man in Subversion eine bereits übergebene Logmeldung bearbeiten?

Gibt es eine Möglichkeit, die Logmeldung 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 kann ich eine fehlerhafte Commit-Nachricht in Git bearbeiten? , aber die Lösung dieser Frage scheint für Subversion nicht ähnlich zu sein (laut svn help commit ).

31 Stimmen

Ich wollte diese Frage hochstufen, aber dann habe ich gemerkt, dass ich das schon vor 4 Monaten getan habe :)

6 Stimmen

Wenn es sich um Code handelt, machen Sie einfach ein paar Kommentare und übertragen Sie ihn erneut mit den entsprechenden Kommentaren. Wenn Sie damit einverstanden sind, dass Ihre Kommentare den Fehler widerspiegeln, ist das viel weniger Aufwand und geht viel schneller. Wenn nicht, ist die Lösung von Kamil Kisiel eindeutig der richtige Weg, um es zu tun.

0 Stimmen

Es gibt eine ausgezeichnete pre-revprop-change Skript, das es dem übertragenden Benutzer ermöglicht, sein Protokoll bis zu 3 Stunden nach der Übertragung zu ändern. Dies ist ein hervorragender Kompromiss zwischen Flexibilität/genauen Protokollen und der Aufrechterhaltung der Treue des Repositorys: wandisco.com/svnforum/threads/

20voto

Josh Weatherly Punkte 1678

Auch ich wurde kürzlich mit dieser Aufgabe betraut.

Wir wollten unseren Programmierern erlauben, nur ihre eigenen Commit-Nachrichten zu ändern, und einschränken, wie weit zurück sie das tun dürfen. Wir beschlossen, dass sie alle an diesem Tag übertragenen Protokollnachrichten ändern dürfen, um Tippfehler zu korrigieren usw.

Nachdem ich mir ein paar andere Beispiele im Internet angeschaut habe, habe ich das hier zusammengebastelt. Wir arbeiten in einer Windows-Umgebung, also ist dies 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: Die ursprüngliche Idee dazu stammt von dieses Thema :

8 Stimmen

Aus irgendeinem Grund wird auf meinem System (mit Server 2012 und VisualSVN) bei der letzten Datumsprüfung if /I not '%DATESTAMPDAY%'=='%DAY%' goto ERROR_MSGTOOOLD musste ich die beiden Variablen in doppelte Anführungszeichen setzen. (Sie glauben gar nicht, wie lange es gedauert hat, das herauszufinden.) Sonst würde ich Dinge bekommen wie "=='02' ist zu diesem Zeitpunkt unerwartet" (am 2. Tag des Monats). Meine Batch-Kenntnisse reichen nicht aus, um zu wissen, warum das passiert, aber falls noch jemand auf seltsame Probleme stößt, kann das vielleicht helfen.

0 Stimmen

@CarlBussema: Danke für diesen Leckerbissen. Sie haben mir gerade eine Menge Kopfschmerzen erspart.

1 Stimmen

Beachten Sie auch, dass das obige Skript ein amerikanisches Datumsformat verwendet, "Erwartet Datum im Format: Thu 08/01/2013" . Wenn Sie das also nicht verwenden, müssen Sie diesen Teil ändern. In meinem Fall war das Format "mm.tt.jj", und zwar ohne den Wochentag.

14voto

mani_nz Punkte 3244

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

Right click on the project -> Team - Show history

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

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

0 Stimmen

Zumindest in TortoiseSVN schlägt der Versuch, die Eigenschaften einer Übertragung im Übertragungsprotokoll zu bearbeiten, mit der gleichen Fehlermeldung fehl wie der Versuch, die Logmeldung direkt zu bearbeiten.

1 Stimmen

"DAV-Anfrage fehlgeschlagen; es ist möglich, dass der pre-revprop-change-Hook des Projektarchivs entweder fehlgeschlagen ist oder nicht existiert. Das Projektarchiv wurde nicht für die Annahme von Revisionsänderungen aktiviert; bitten Sie den Administrator, einen pre-revprop-change-Hook zu erstellen". Aber wie ich schon sagte: das ist mit TortoiseSVN (als Nicht-Administrator), nicht mit Eclipse. Vielleicht hackt Eclipse die SVN-Berechtigungen, um diesen Haken zu erstellen, ich weiß es nicht.

0 Stimmen

Ja, vielleicht. Versuchen Sie, es in Eclipse zu tun.

12voto

Bert Huijben Punkte 19285

Wenn Ihr Repository das Setzen von Revisionseigenschaften über den pre-revprop-change-Hook ermöglicht, können Sie Protokollmeldungen 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 'Logmeldung ändern' wählen.

2 Stimmen

In Subclipse (Eclipse) ist es "Set Commit Properties".

4voto

andrewdotn Punkte 29643

El Subversion FAQ deckt dies ab, verwendet aber einen Haufen verwirrender undefinierter Begriffe wie REPOS_PATH ohne konkrete Beispiele zu nennen.

Es kann ein paar Versuche dauern, bis es funktioniert, also speichern Sie Ihre aktualisierte Commit-Nachricht in einer Datei. Anders als bei svn-commit.tmp Dateien, wird Subversion Ihre Eingabe nicht beibehalten, wenn es ein Problem gibt.

Führen Sie in Ihrem Arbeitsverzeichnis

svn propedit -r N --revprop svn:log

um die Commit-Nachricht zu bearbeiten. Wenn das funktioniert, großartig! Aber wahrscheinlich nicht, denn die svn:log Revisions-Eigenschaft ist unversioniert und Subversion wird Sie standardmäßig daran hindern, sie zu überschreiben, entweder mit der Hook-Skript pre-revprop-change oder eine Fehlermeldung, dass Sie nicht über einen solchen Haken verfügen.

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

  1. cd a ~/svnrepo/hooks

  2. Gibt es eine pre-revprop-change oder pre-revprop-change.bat Drehbuch? Wenn ja, kommentieren Sie vorübergehend die Teil des Skripts aus, der abbricht, wenn Sie versuchen, die svn:log .

  3. Andernfalls, am Windows eine leere Datei mit dem Namen pre-revprop-change.bat . Hier ist eine Möglichkeit, das zu tun:

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

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

  6. Machen Sie Ihre Änderungen an ~/svnrepo/hooks/svn-revprop-change ( .bat )

1voto

teroi Punkte 1087

Ich habe eine schöne Implementierung des serverseitigen pre-rev-prop-change Hooks im svnforum gefunden: https://www.svnforum.org/forum/opensource-subversion-forums/scripts-contributions/8571-pre-revprop-change-shell-script-allows-commiters-to-change-own-log-within-x-hours

Sie implementiert

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

Von dort aus können Sie sie nach Belieben bearbeiten. Ich würde es lieber nicht hierher kopieren, da ich nicht der ursprüngliche Autor bin und es keinen Copyright-Hinweis gibt, der mir das erlauben würde.

0 Stimmen

Der Link ist tot. Wenn jemand eine Kopie des Skripts hat, bitte teilen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X