181 Stimmen

Was ist ein pre-revprop-change-Hook in SVN und wie kann ich ihn erstellen?

Ich wollte einen Protokollkommentar im Repository-Browser bearbeiten und erhielt eine Fehlermeldung, dass für das Repository kein pre-revprop-change-Hook existiert. Was ist ein "pre-revprop-change"-Haken, abgesehen von seinem unheimlichen Namen, und wie kann ich ihn erstellen?

16 Stimmen

Jetzt ist dieser Link der zweite, gleich nach einem Link zu dieser Frage :)

0 Stimmen

Der Link über führt zu einem SEHR veralteten SVNBook 1.0. Die aktuelle ist 1.7 und 1.8 (nightly): svnbook.red-bean.com/de/1.8

7voto

bahrep Punkte 27861

Der Name des Hook-Skripts ist nicht so beängstigend, wenn man ihn entziffern kann: Er lautet Haken für Eigenschaftsänderungen vor der Revision . Kurz gesagt, der Zweck der pre-revprop-change Hook-Skript dient dazu, Änderungen von nicht versionierten (Revisions-)Eigenschaften zu kontrollieren und Benachrichtigungen zu senden (z.B. eine E-Mail zu senden, wenn eine Revisionseigenschaft geändert wurde).

Es gibt 2 Arten von Eigenschaften in Subversion:

  • versionierte Eigenschaften (z.B. svn:needs-lock y svn:mime-type ), die für Dateien und Verzeichnisse festgelegt werden können,
  • nicht versionierte (Revisions-)Eigenschaften (z. B. svn:log y svn:date ), die im Repository eingestellt sind Überarbeitungen .

Versionierte Eigenschaften haben einen Verlauf und können von normalen Benutzern mit Lese-/Schreibzugriff auf ein Repository manipuliert werden. Nicht versionierte Eigenschaften hingegen haben keine Historie und dienen hauptsächlich der Wartung. Wenn Sie zum Beispiel eine Revision übertragen, wird sie sofort svn:date mit der UTC-Zeit Ihrer Übertragung, svn:author mit Ihrem Benutzernamen und svn:log mit Ihrer Commit-Logmeldung (falls Sie eine angegeben haben).

Wie ich bereits dargelegt habe, ist der Zweck der pre-revprop-change Hook-Skript dient der Kontrolle von Änderungen der Revisionseigenschaften. Sie wollen nicht, dass jeder, der Zugriff auf ein Repository hat, alle Revisionseigenschaften ändern kann, daher ist die Änderung von Revisionseigenschaften standardmäßig verboten. Um Benutzern das Ändern von Eigenschaften zu erlauben, müssen Sie ein pre-revprop-change Haken.

Der einfachste Haken kann nur eine Zeile enthalten: exit 0 . Es erlaubt jedem authentifizierten Benutzer, jede Revisionseigenschaft zu ändern, und sollte nicht in einer realen Umgebung verwendet werden. Unter Windows können Sie ein Batch-Skript oder ein PowerShell-basiertes Skript verwenden, um eine bestimmte Logik innerhalb von pre-revprop-change Haken.

Mit diesem PowerShell-Skript können Sie Folgendes ändern svn:log Eigenschaft und verweigert leere Protokollmeldungen.

# Store hook arguments into variables with mnemonic names
$repos    = $args[0]
$rev      = $args[1]
$user     = $args[2]
$propname = $args[3]
$action   = $args[4]

# Only allow changes to svn:log. The author, date and other revision
# properties cannot be changed
if ($propname -ne "svn:log")
{
  [Console]::Error.WriteLine("Only changes to 'svn:log' revision properties are allowed.")
  exit 1
}

# Only allow modifications to svn:log (no addition/overwrite or deletion)
if ($action -ne "M")
{
  [Console]::Error.WriteLine("Only modifications to 'svn:log' revision properties are allowed.")
  exit 2
}

# Read from the standard input while the first non-white-space characters
$datalines = ($input | where {$_.trim() -ne ""})
if ($datalines.length -lt 25)
{
  # Log message is empty. Show the error.
  [Console]::Error.WriteLine("Empty 'svn:log' properties are not allowed.")
  exit 3
}

exit 0

Dieses Batch-Skript erlaubt es nur dem Benutzer "svnmgr", Revisionseigenschaften zu ändern:

IF "%3" == "svnmgr" (goto :label1) else (echo "Only the svnmgr user may change revision properties" >&2 )

exit 1
goto :eof

:label1
exit 0

3voto

Tobias Knauss Punkte 3141

Wenn Sie die Änderungen in den Protokollmeldungen speichern möchten, verwenden Sie das Batch-Skript aus der obigen Antwort von @patmortech ( https://stackoverflow.com/a/468475 ),
der das Skript kopiert hat von https://stackoverflow.com/a/68850 ,
und fügen Sie diese Zeilen zwischen if "%bIsEmpty%" == "true" goto ERROR_EMPTY y goto :eofbefore :

set outputFile=%repos%\log-change-history.txt

echo User '%user%' changes log message in rev %rev% on %date% %time%.>>%outputFile%
echo ----- Old message: ----->>%outputFile%
svnlook propget --revprop %repos% svn:log -r %rev% >>%outputFile%
echo.>>%outputFile%
echo ----- New message: ----->>%outputFile%
for /f "tokens=*" %%g in ('find /V ""') do (echo %%g >>%outputFile%)
echo ---------->>%outputFile%
echo.>>%outputFile%

Es wird eine Textdatei erstellt log-change-history.txt im Repo-Ordner auf dem Server und fügen Sie jede Protokolländerungsmeldung an.

2voto

noti Punkte 857

Für PC-Benutzer: Die .bat-Erweiterung funktionierte bei mir nicht, wenn ich sie unter Windows Server verwendete. Ich habe VisualSvn verwendet, wie Django Reinhardt vorgeschlagen hat, und es hat einen Hook mit der Erweiterung .cmd erstellt.

2voto

Janis Punkte 408
  1. Gehen Sie in das SVN Repo Verzeichnis in den Unterordner "hooks", z.B. " D:\SVN\hooks\ "
  2. dort die leere Datei "pre-revprop-change.bat" erstellen
  3. in die Datei "exit 0" (ohne "") schreiben und speichern
  4. viel Spaß :)

(Diese Lösung hat sicherlich Nachteile, da nichts kontrolliert/verboten wird. Aber für meinen Fall - ein lokales Repo, das nur ich benutze - scheint es zu funktionieren).

2voto

Tom Andraszek Punkte 1571

Dies war für mich auf einem Windows-Server am einfachsten: Klicken Sie in VisualSVN mit der rechten Maustaste auf Ihr Projektarchiv und wählen Sie dann Eigenschaften... und dann die Häkchen tab.

Wählen Sie Haken für Eigenschaftsänderungen vor der Überarbeitung klicken. 編集 .

Ich musste in der Lage sein, den Autor zu ändern, da es bei Remote-Computern, die von mehreren Personen genutzt werden, häufig vorkommt, dass wir versehentlich mit den gespeicherten Anmeldedaten einer anderen Person einchecken.

Hier ist das geänderte Community-Wiki-Skript zum Einfügen:

@ECHO OFF
:: Set all parameters. Even though most are not used, in case you want to add
:: changes that allow, for example, editing of the author or addition of log messages.
set repository=%1
set revision=%2
set userName=%3
set propertyName=%4
set action=%5

:: Only allow the author to be changed, but not message ("svn:log"), etc.
if /I not "%propertyName%" == "svn:author" goto ERROR_PROPNAME

:: Only allow modification of a log message, not addition or deletion.
if /I not "%action%" == "M" goto ERROR_ACTION

:: Make sure that the new svn:log message is not empty.
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:author messages are not allowed. >&2
goto ERROR_EXIT

:ERROR_PROPNAME
echo Only changes to svn:author messages are allowed. >&2
goto ERROR_EXIT

:ERROR_ACTION
echo Only modifications to svn:author revision properties are allowed. >&2
goto ERROR_EXIT

:ERROR_EXIT
exit /b 1

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