Come modificare il messaggio di registro già impegnato in Subversion?


550

C'è un modo per modificare il messaggio di registro di una certa revisione in Subversion? Ho accidentalmente scritto il nome del file sbagliato nel mio messaggio di commit che potrebbe essere fonte di confusione in seguito.

Ho visto Come posso modificare un messaggio di commit errato in Git? , ma la soluzione a questa domanda non sembra essere simile per Subversion (secondo svn help commit).


26
Stavo per votare questa domanda, ma poi mi sono reso conto di averlo già fatto 4 mesi fa :)
oksayt

6
Se si tratta di codice, basta aggiungere alcuni commenti e impegnarsi nuovamente con i commenti appropriati. Se sei d'accordo con i tuoi commenti che riflettono l'errore, è molto meno sforzo e molto più veloce. Altrimenti la soluzione di Kamil Kisiel è chiaramente il modo giusto per farlo.
Marty,

Esiste un eccellente pre-revprop-changescript che consente all'utente che esegue il commit di modificare il proprio registro fino a 3 ore dopo il commit. Questo è un eccellente compromesso tra flessibilità / registri accurati e mantenimento della fedeltà del repository: wandisco.com/svnforum/threads/…
jwa

se non riesci a modificare il file ma desideri comunque aggiungere un nuovo messaggio di commit , puoi farlosvn propset dummyproperty 1 yourfile; svn commit yourfile -m yourmessage
mulllhausen,

Risposte:


457

Fondamentalmente devi avere i diritti di amministratore (direttamente o indirettamente) sul repository per farlo. È possibile configurare il repository per consentire a tutti gli utenti di eseguire questa operazione oppure modificare il messaggio di registro direttamente sul server.

Vedi questa parte delle FAQ di Subversion (sottolineatura mia):

I messaggi di registro vengono conservati nel repository come proprietà associate a ciascuna revisione. Per impostazione predefinita, la proprietà del messaggio di registro (svn: log) non può essere modificata dopo il commit . Questo perché le modifiche alle proprietà di revisione (di cui svn: log è una) fanno sì che il valore precedente della proprietà venga scartato in modo permanente e Subversion cerca di impedirti di farlo accidentalmente. Tuttavia, ci sono un paio di modi per far sì che Subversion cambi una proprietà di revisione.

Il primo modo è per l'amministratore del repository di abilitare le modifiche alle proprietà di revisione. Questo viene fatto creando un hook chiamato "pre-revprop-change" (vedi questa sezione nel libro Subversion per maggiori dettagli su come farlo). L'hook "pre-revprop-change" ha accesso al vecchio messaggio di registro prima che venga modificato, quindi può conservarlo in qualche modo (ad esempio, inviando un'e-mail). Una volta abilitate le modifiche alle proprietà di revisione, è possibile modificare il messaggio di registro di una revisione passando l'interruttore --revprop a svn propedit o svn propset, come uno di questi:

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

dove N è il numero di revisione di cui si desidera modificare il messaggio di registro e URL è la posizione del repository. Se si esegue questo comando da una copia funzionante, è possibile lasciare l'URL.

Il secondo modo di modificare un messaggio di registro è utilizzare setlog svnadmin. Questo deve essere fatto facendo riferimento alla posizione del repository sul filesystem. Non è possibile modificare un repository remoto utilizzando questo comando.

$ svnadmin setlog REPOS_PATH -r N FILE

dove REPOS_PATH è il percorso del repository, N è il numero di revisione di cui si desidera modificare il messaggio di registro e FILE è un file contenente il nuovo messaggio di registro. Se l'hook "pre-revprop-change" non è a posto (o vuoi bypassare lo script hook per qualche motivo), puoi anche usare l'opzione --bypass-hooks. Tuttavia, se decidi di utilizzare questa opzione, fai molta attenzione. È possibile ignorare elementi quali notifiche e-mail della modifica o sistemi di backup che tengono traccia delle proprietà della revisione.



1
Ecco un'implementazione di base per l'opzione svnadmin svn-change-commit
albfan

2
Grazie! Ancora utili 6,5 anni dopo la risposta. :-)
Michael,

Il metodo propedit ha funzionato più o meno; tuttavia, non è stato possibile ottenere che la modifica del registro si riflettesse nel browser repo. Ho potuto vedere solo il registro aggiornato nella riga di comando svn in Windows. Ho dovuto aggiornare la cache di registro come un ultimo passo: stackoverflow.com/questions/25750249/...
user_007

89

Quando esegui questo comando,

svn propedit svn:log --revprop -r NNN 

e nel caso in cui visualizzi questo messaggio:

Richiesta DAV non riuscita; è possibile che l'hook pre-revprop-change del repository non sia riuscito o sia inesistente

È perché Subversion non consente di modificare i messaggi di registro perché non sono sottoposti a revisione e andranno persi in modo permanente.

SVN ospitato da Unix

Vai alla directory hooks sul tuo server Subversion (sostituisci ~ / svn / reponame con la directory del tuo repository)

cd ~/svn/reponame/hooks

Rimuovi l'estensione

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

Renderlo eseguibile (impossibile fare chmod + x!)

chmod 755 pre-revprop-change

fonte

SVN ospitato da Windows

I file modello nella directory hooks non possono essere utilizzati in quanto specifici di Unix. È necessario copiare un file batch di Windows pre-revprop-change.batnella directory hooks, ad esempio quello fornito qui .


1
Perché hai scritto tra parentesi " impossibile fare chmod + x!"?
Apostolo

1
Ho creato una piccola sceneggiatura che implementa la stessa idea qui blog.mmonem.com/enable-changing-svn-log
mmonem

SVN_EDITOR, VISUAL o EDITOR devono essere impostati prima dell'uso svn propedit
Gerd

48

Ecco una comoda variante che non vedo menzionata nella FAQ. È possibile restituire il messaggio corrente per la modifica specificando un editor di testo.

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

17
Richiede che l'hook sia stato creato, il che richiede i diritti di amministratore. svn: Repository has not been enabled to accept revision propchanges; ask the administrator to create a pre-revprop-change hook
Matt

Ecco uno script per abilitare il registro: blog.mmonem.com/enable-changing-svn-log
mmonem

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

Sto usando Google Code quindi non credo di poterlo fare in questo modo, ma grazie.
Jeremy Ruten,

4
questo ha funzionato per me poiché il metodo propedit non è riuscito con "Il repository non è stato abilitato ad accettare modifiche di revisione". Grazie!
pfctdayelise,

1
+1 per aver dato direttamente il comando :-) apache.org non era attivo in questo momento e non riuscivo a seguire nessun link dato ...
Rafa

Questa risposta merita più punti! È meglio perché non è necessario configurare l'hook per usarlo.
Peri Hartman,

1
bump per questa risposta, ha funzionato per me senza impostare l'hook, inoltre non ha cambiato la "data / ora" di revisione nel registro, solo il messaggio, che era esattamente quello che speravo.
segFaultCoder

17

Recentemente mi è stato assegnato anche questo.

Volevamo consentire ai nostri programmatori di modificare solo i propri messaggi di commit e di limitare la distanza consentita. Decidemmo che avrebbero potuto modificare tutti i messaggi di log commessi quel giorno, per correggere errori di battitura ecc.

Dopo aver visto un paio di altri esempi online, l'ho hackerato insieme, siamo in un ambiente Windows, quindi questo è il nostro contenuto di 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 

Modifica: l'idea originale per questo proviene da questa discussione :


7
Per qualche motivo, sul mio sistema (con Server 2012 e VisualSVN), nell'ultimo controllo della data if /I not '%DATESTAMPDAY%'=='%DAY%' goto ERROR_MSGTOOOLD, ho dovuto passare alle virgolette doppie attorno alle due variabili. (Non crederesti quanto tempo ci è voluto per capire.) Altrimenti otterrei cose come "== '02' in questo momento è inaspettato" (il 2 ° giorno del mese). Il mio batch-fu non è abbastanza forte da sapere perché ciò accada, ma nel caso in cui qualcun altro incontri problemi strani, potrebbe essere d'aiuto.
Carl Bussema,

@CarlBussema: grazie per quella notizia. Mi hai appena risparmiato un forte mal di testa.
Daniel Szabo,

1
Si noti inoltre che lo script sopra utilizza il formato data americano "Prevede la data nel formato: Gio 08/01/2013" . Quindi, se non si utilizza che è necessario modificare quella parte, nel mio caso il formato era "mm.dd.yy" e senza il giorno della settimana.
Zitrax,

Questa è una variante fredda su questa bella risposta: stackoverflow.com/questions/6155/...
NateJ

17

Su Windows, usando il client SVN di Tortoise:

  1. fare clic con il tasto destro nella cartella del progetto e selezionare "Mostra registro"
  2. nella finestra Messaggi di registro, fai clic con il tasto destro su una revisione e scegli "Modifica messaggio di registro"

Se non funziona potrebbe essere dovuto al modo in cui è impostato SVN sul server, leggi altre risposte qui.


Grazie questa è stata una soluzione più semplice per me, +1. È essenziale disporre delle autorizzazioni.
theGabyRod,

12

Se stai usando un IDE come eclipse, puoi usare questo modo semplice.

Right click on the project -> Team - Show history

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

Puoi modificare il messaggio come desideri da qui.


Almeno in TortoiseSVN, il tentativo di modificare le proprietà di commit per un commit nel registro di commit ha esito negativo con lo stesso messaggio di errore del tentativo di modificare direttamente il messaggio di registro.
Christian Severin,

1
"Richiesta DAV non riuscita; è possibile che l'hook pre-revprop-change del repository non sia riuscito o sia inesistente Il repository non è stato abilitato ad accettare modifiche di revisione; chiedere all'amministratore di creare un hook di pre-revprop-change". Ma come ho detto: sta usando TortoiseSVN (come non amministratore), non Eclipse. Forse Eclipse compromette le autorizzazioni SVN per creare quell'hook, non lo so.
Christian Severin,

Sì forse. Prova a farlo in eclissi.
mani_nz,

@ChristianSeverin, ricevo lo stesso messaggio di errore quando utilizzo Eclipse. Proviene sicuramente dal server Subversion.
SerraVeg

10

Se il repository abilita l'impostazione delle proprietà di revisione tramite l'hook di modifica pre-revprop, è possibile modificare i messaggi di registro molto più facilmente.

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

O in TortoiseSVN, AnkhSVN e probabilmente molti altri client di sovversione facendo clic con il tasto destro su una voce di registro e quindi "cambia messaggio di registro".


2
in Subclipse (Eclipse) è "Imposta proprietà commit".
pfctdayelise,

2

Le FAQ di Subversion trattano questo, ma usano un mucchio di termini confusi indefiniti come REPOS_PATHsenza fornire alcun esempio reale.

Potrebbero essere necessari alcuni tentativi per farlo funzionare, quindi salva il messaggio di commit aggiornato in un file. A differenza dei svn-commit.tmpfile, Subversion non manterrà la digitazione in caso di problemi.

Nella tua directory di lavoro, esegui

svn propedit -r N --revprop svn:log

per modificare il messaggio di commit. Se funziona, fantastico! Ma probabilmente non lo farà, perché la svn:logproprietà di revisione è senzaversione e Subversion per impostazione predefinita ti impedirà di sovrascriverla, con lo script hook pre-revprop-change o un messaggio di errore che non hai un tale hook.

Per modificare gli hook, è necessario accedere al filesystem su cui è ospitato il repository. svn infoti dirà la radice del repository. Supponiamo che lo sia ~/svnrepo.

  1. cd per ~/svnrepo/hooks
  2. C'è un pre-revprop-changeo uno pre-revprop-change.batscript? In tal caso, commenta temporaneamente la parte che si interrompe se provi a modificare svn:log.
  3. Altrimenti, su Windows, crea un file vuoto chiamato pre-revprop-change.bat. Ecco un modo per farlo:

    copy con pre-revprop-change.bat
    ^Z
    
  4. Altrimenti, su Unix, esegui

    echo '#!/bin/sh' > pre-revprop-change
    chmod +x pre-revprop-change
    
  5. Nella copia di lavoro, esegui di svn propedit -r N --revprop svn:lognuovo

  6. Annulla le modifiche a ~/svnrepo/hooks/svn-revprop-change( .bat)

0

Ho trovato una buona implementazione dell'hook pre-rev-prop-change lato server nello svnforum: https://www.svnforum.org/forum/opensource-subversion-forums/scripts-contributions/8571-pre-revprop-change -shell-script-permette-commiters-to-cambio-own-log-entro-x-ore

Implementa

  • controllo utente, ovvero solo i propri messaggi di commit possono essere modificati.
  • Svn admin override; l'amministratore può modificare qualsiasi cosa.
  • confronto timestamp: solo i commit più giovani di un certo tempo possono essere modificati

Prendi da lì e modifica a piacimento. Preferirei non copiarlo qui poiché non sono l'autore originale e non ci sono avvisi di copyright che mi permetterebbero di farlo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.