Como editar a mensagem de log já confirmada no Subversion?

550

Existe uma maneira de editar a mensagem de log de uma determinada revisão no Subversion? Eu acidentalmente escrevi o nome do arquivo errado na minha mensagem de confirmação, o que pode ser confuso mais tarde.

Eu já vi Como edito uma mensagem de confirmação incorreta no Git? , mas a solução para essa pergunta não parece ser semelhante para o Subversion (de acordo com svn help commit).

Jeremy Ruten
fonte
26
Eu estava indo para upvote esta pergunta, mas então eu percebi que já fez 4 meses atrás :)
oksayt
6
Se for código, faça alguns comentários e confirme novamente com os comentários apropriados. Se você concorda com seus comentários refletindo o erro, é muito menos esforço e muito mais rápido. Caso contrário, a solução de Kamil Kisiel é claramente a maneira certa de fazê-lo.
Marty
Existe um excelente pre-revprop-changescript que permite ao usuário confirmar modificar seu log por até 3 horas após a confirmação. Esse é um excelente compromisso entre flexibilidade / logs precisos e manutenção da fidelidade do repositório: wandisco.com/svnforum/threads/…
jwa
se você não pode alterar o arquivo, mas ainda deseja adicionar uma nova mensagem de confirmação , pode fazêsvn propset dummyproperty 1 yourfile; svn commit yourfile -m yourmessage
#

Respostas:

457

Essencialmente, você precisa ter direitos de administrador (direta ou indiretamente) no repositório para fazer isso. Você pode configurar o repositório para permitir que todos os usuários façam isso ou pode modificar a mensagem de log diretamente no servidor.

Veja esta parte do FAQ do Subversion (ênfase minha):

As mensagens de log são mantidas no repositório como propriedades anexadas a cada revisão. Por padrão, a propriedade da mensagem de log (svn: log) não pode ser editada depois de confirmada . Isso ocorre porque as alterações nas propriedades de revisão (das quais svn: log é uma) fazem com que o valor anterior da propriedade seja permanentemente descartado, e o Subversion tenta impedir que você faça isso acidentalmente. No entanto, existem algumas maneiras de fazer o Subversion alterar uma propriedade de revisão.

A primeira maneira é o administrador do repositório ativar as modificações da propriedade de revisão. Isso é feito criando um gancho chamado "alteração pré-revisão" (veja esta seção no livro do Subversion para mais detalhes sobre como fazer isso). O gancho "pre-revprop-change" tem acesso à mensagem de log antiga antes de ser alterada, para que possa preservá-la de alguma forma (por exemplo, enviando um email). Depois que as modificações das propriedades de revisão estiverem ativadas, você poderá alterar a mensagem de log de uma revisão, passando a opção --revprop para svn propedit ou svn propset, como um destes:

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

onde N é o número da revisão cuja mensagem de log você deseja alterar e URL é o local do repositório. Se você executar este comando em uma cópia de trabalho, poderá deixar de fora o URL.

A segunda maneira de alterar uma mensagem de log é usar svnadmin setlog. Isso deve ser feito consultando a localização do repositório no sistema de arquivos. Você não pode modificar um repositório remoto usando este comando.

$ svnadmin setlog REPOS_PATH -r N FILE

onde REPOS_PATH é o local do repositório, N é o número da revisão cuja mensagem de log você deseja alterar e FILE é um arquivo que contém a nova mensagem de log. Se o gancho "pre-revprop-change" não estiver no lugar (ou você desejar ignorar o script do gancho por algum motivo), também poderá usar a opção --bypass-hooks. No entanto, se você decidir usar esta opção, tenha muito cuidado. Você pode estar ignorando coisas como notificações por email da alteração ou sistemas de backup que controlam as propriedades da revisão.

Kamil Kisiel
fonte
15
Em 3 de fevereiro de 2010, o URL é subversion.apache.org/faq.html#change-log-msg
GreenMatt em
1
Aqui está uma implementação básica para a opção svnadmin SVN-change-commit
albfan
2
Obrigado! Ainda é útil 6,5 anos após a resposta. :-) #
Michael Michael
O método propedit funcionou mais ou menos; no entanto, não foi possível fazer a alteração do log refletir no navegador de repositório. Eu só conseguia ver o log atualizado da linha de comando svn no Windows. Eu tive que atualizar o cache de log como uma etapa final: stackoverflow.com/questions/25750249/…
user_007
89

Quando você executa este comando,

svn propedit svn:log --revprop -r NNN 

e apenas no caso de você ver esta mensagem:

A solicitação de DAV falhou; é possível que o gancho de alteração pré-revprop do repositório falhe ou não exista

É porque o Subversion não permite modificar mensagens de log porque elas não são versionadas e serão perdidas permanentemente.

SVN hospedado em Unix

Vá para o diretório hooks no servidor Subversion (substitua ~ / svn / reponame pelo diretório do seu repositório)

cd ~/svn/reponame/hooks

Remova a extensão

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

Torne executável (não é possível executar chmod + x!)

chmod 755 pre-revprop-change

Fonte

SVN hospedado no Windows

Os arquivos de modelo no diretório hooks não podem ser usados, pois são específicos para Unix. Você precisa copiar um arquivo em lotes do Windows pre-revprop-change.batpara o diretório hooks, por exemplo, o fornecido aqui .

Alex. S.
fonte
1
Por que você escreveu entre parênteses " não pode fazer chmod + x!"?
Apóstolo
1
Eu criei um pequeno script que implementa a mesma idéia aqui blog.mmonem.com/enable-changing-svn-log
mmonem
SVN_EDITOR, visual ou necessidade EDITOR a ser definido antes de usar svn propedit
Gerd
48

Aqui está uma variação útil que não vejo mencionada nas perguntas frequentes. Você pode retornar a mensagem atual para edição especificando um editor de texto.

svn propedit svn:log --revprop -r N --editor-cmd vim
mcqwerty
fonte
17
Requer que o gancho tenha sido criado - o que requer direitos de administrador. svn: Repository has not been enabled to accept revision propchanges; ask the administrator to create a pre-revprop-change hook
Matt
Aqui está um script para habilitar o log: blog.mmonem.com/enable-changing-svn-log
mmonem
37
svnadmin setlog /path/to/repository -r revision_number --bypass-hooks message_file.txt
nickf
fonte
Estou usando o Google Code, então acho que não posso fazê-lo dessa maneira, mas obrigado.
Jeremy Ruten 20/11/2008
4
isso funcionou para mim, pois o método propedit falhou com "O repositório não foi ativado para aceitar alterações de revisão". obrigado!
Pfctdayelise 13/05/10
1
+1 para dar o comando diretamente :-) apache.org estava para baixo agora e eu não poderia seguir qualquer link ...
Rafa
Esta resposta merece mais pontos! É melhor porque você não precisa configurar o gancho para usá-lo.
Peri Hartman
1
bump para esta resposta, funcionou para mim sem configurar o gancho, também não alterou a revisão "data / hora" no log, apenas a mensagem, que era exatamente o que eu estava esperando.
segFaultCoder
17

Recentemente, fui encarregado disso também.

Queríamos permitir que nossos programadores modificassem apenas suas próprias mensagens de confirmação e restringissem quanto tempo eles têm permissão para fazê-lo. Decidimos que eles teriam permissão para modificar qualquer mensagem de log confirmada naquele dia, para corrigir erros de digitação etc.

Depois de ver alguns outros exemplos on-line, eu os hackeei juntos, estamos em um ambiente Windows, portanto, este é o nosso conteúdo de 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 

Editar: a ideia original para isso veio deste tópico :

Josh Weatherly
fonte
7
Por alguma razão, no meu sistema (executando o Server 2012 e o VisualSVN), na última verificação de data if /I not '%DATESTAMPDAY%'=='%DAY%' goto ERROR_MSGTOOOLD, tive que mudar para aspas duplas nas duas variáveis. (Você não acreditaria quanto tempo demorou para descobrir.) Caso contrário, obteria coisas como "== '02' é inesperado neste momento" (no segundo dia do mês). Meu lote-fu não é forte o suficiente para saber por que isso acontece, mas, caso mais alguém tenha problemas estranhos, isso pode ajudar.
precisa saber é o seguinte
@CarlBussema: Obrigado por esse boato. Você acabou de me salvar de uma enorme dor de cabeça.
Daniel Szabo
1
Observe também que o script acima usa o formato de data americano, "Espera a data no formato: qui 08/01/2013" . Portanto, se você não usar isso, precisará modificar essa parte. No meu caso, o formato era "mm.dd.yy" e sem o dia da semana.
Zitrax 7/10
Isso é uma variação legal sobre esta resposta agradável: stackoverflow.com/questions/6155/...
NateJ
17

No Windows, usando o cliente Tortoise SVN:

  1. clique com o botão direito do mouse na pasta do projeto e escolha "Mostrar log"
  2. na janela Mensagens de log, clique com o botão direito do mouse em uma revisão e escolha "Editar mensagem de log"

Se não funcionar, pode ser devido à maneira como o SVN no servidor está configurado, leia outras respostas aqui.

Andrei N.
fonte
Obrigado, essa foi uma solução mais fácil para mim, +1. É essencial ter permissões.
theGabyRod
12

Se você estiver usando um IDE como o eclipse, poderá usar esse caminho fácil.

Right click on the project -> Team - Show history

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

Você pode modificar a mensagem como quiser daqui.

mani_nz
fonte
Pelo menos no TortoiseSVN, a tentativa de editar as propriedades de confirmação de uma confirmação no log de confirmação falha com a mesma mensagem de erro que a tentativa de editar diretamente a mensagem de log.
Christian Severin
1
"A solicitação da DAV falhou; é possível que o gancho de alteração pré-revprop do repositório tenha falhado ou seja inexistente. O repositório não foi ativado para aceitar alterações de revisão; peça ao administrador para criar um gancho pré-revprop-change". Mas como eu disse: está usando o TortoiseSVN (como um não administrador), não o Eclipse. Talvez o Eclipse hackeie as permissões SVN para criar esse gancho, eu não sei.
Christian Severin
Sim, talvez. Tente fazer isso em eclipse.
precisa saber é
@ChristianSeverin, recebo a mesma mensagem de erro ao usar o Eclipse. Certamente vem do servidor Subversion.
GreenhouseVeg
10

Se o seu repositório ativar a configuração de propriedades de revisão por meio do gancho de pré-revisão de alteração, você poderá alterar as mensagens de log com muito mais facilidade.

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

Ou no TortoiseSVN, AnkhSVN e provavelmente em muitos outros clientes do subversion, clicando com o botão direito do mouse em uma entrada de log e depois em 'alterar mensagem de log'.

Bert Huijben
fonte
2
no Subclipse (Eclipse) é "Definir propriedades de confirmação".
Pfctdayelise 13/05/10
2

O FAQ do Subversion cobre isso, mas usa muitos termos indefinidos confusos, como REPOS_PATHsem dar exemplos reais.

Pode levar algumas tentativas para fazê-lo funcionar, então salve sua mensagem de confirmação atualizada em um arquivo. Ao contrário dos svn-commit.tmparquivos, o Subversion não preservará sua digitação se houver algum problema.

No seu diretório de trabalho, execute

svn propedit -r N --revprop svn:log

para editar a mensagem de confirmação. Se isso funcionar, ótimo! Mas provavelmente não, porque a svn:logpropriedade revision não possui versão e o Subversion, por padrão, impedirá que você a substitua, seja com o script hook pre-revprop-change ou com uma mensagem de erro de que você não possui esse tipo de gancho.

Para alterar os ganchos, você precisa acessar o sistema de arquivos no qual o repositório está hospedado. svn infolhe dirá a raiz do repositório. Suponha que seja ~/svnrepo.

  1. cd para ~/svnrepo/hooks
  2. Existe uma pre-revprop-changeou pre-revprop-change.batscript? Nesse caso, comente temporariamente a parte que interrompe se você tentar alterar svn:log.
  3. Caso contrário, no Windows, crie um arquivo em branco chamado pre-revprop-change.bat. Aqui está uma maneira de fazer isso:

    copy con pre-revprop-change.bat
    ^Z
    
  4. Caso contrário, no Unix, execute

    echo '#!/bin/sh' > pre-revprop-change
    chmod +x pre-revprop-change
    
  5. Na cópia de trabalho, execute svn propedit -r N --revprop svn:lognovamente

  6. Desfazer suas alterações para ~/svnrepo/hooks/svn-revprop-change( .bat)
andrewdotn
fonte
0

Encontrei uma boa implementação do gancho pré-rev-prop-change do lado do servidor no svnforum: https://www.svnforum.org/forum/opensource-subversion-forums/scripts-contributions/8571-pre-revprop-change -shell-script-permite-comissários-para-alterar-próprio-log-dentro de x-horas

Implementa

  • verificação do usuário, ou seja, apenas as próprias mensagens de confirmação podem ser editadas.
  • Substituição de administrador de SVN; admin pode editar qualquer coisa.
  • comparação de carimbo de data / hora: somente confirmações menores que um determinado horário podem ser editadas

Pegue a partir daí e edite à vontade. Prefiro não copiá-lo aqui, pois não sou o autor original e não há nenhum aviso de direitos autorais que me permita fazê-lo.

teroi
fonte