Como posso visualizar todas as alterações históricas em um arquivo no SVN

169

Eu sei que posso svn diff -r a:b repo visualizar as alterações entre as duas revisões especificadas. O que eu gostaria é um diff para cada revisão que mudou o arquivo. Esse comando está disponível?

Gordon Wilson
fonte
16
Está oculto no comando "culpar", de nome estranho.
goosemanjack
6
Eu pensei que @goosemanjack estava brincando, até que eu tentei.
SSH Esta

Respostas:

181

Não existe um comando interno para isso, então geralmente faço algo assim:

#!/bin/bash

# history_of_file
#
# Outputs the full history of a given file as a sequence of
# logentry/diff pairs.  The first revision of the file is emitted as
# full text since there's not previous version to compare it to.

function history_of_file() {
    url=$1 # current url of file
    svn log -q $url | grep -E -e "^r[[:digit:]]+" -o | cut -c2- | sort -n | {

#       first revision as full text
        echo
        read r
        svn log -r$r $url@HEAD
        svn cat -r$r $url@HEAD
        echo

#       remaining revisions as differences to previous revision
        while read r
        do
            echo
            svn log -r$r $url@HEAD
            svn diff -c$r $url@HEAD
            echo
        done
    }
}

Em seguida, você pode chamá-lo com:

history_of_file $1
Bendin
fonte
35
Eu nunca vi esse truque de "canalizar para o bloco" antes. Arrumado.
5
Versão de arquivo em lote desse script, fwiw.
precisa
Adicionei isso ao meu arquivo .bashrc. Quando eu começar-up eu recebo svn: '.' is not a working copy svn: Syntax error in revision argument '@HEAD' svn: Syntax error in revision argument '@HEAD'
Francisc0
1
@ Francisco0: não inclua a linha final no seu bashrc. não faz parte da definição da função, é uma chamada para a função porque o exemplo fornecido é destinado ao uso como um script independente.
bendin
26
svn log --diff [path_to_file]funciona exatamente assim! stackoverflow.com/a/24938573/3185510
webster
143

Um pouco diferente do que você descreveu, mas acho que pode ser o que você realmente precisa:

svn blame filename

Ele imprimirá o arquivo com cada linha prefixada pela hora e autor da confirmação que o alterou pela última vez.

ngn
fonte
4
Uau, isso é incrível! Vindo a utilizar SVN durante anos e nunca soube sobre isso: O
Sim Barry
4
Você pode precisar da opção detalhada / -v para ver o registro de data e hora (eu faço com minha compilação padrão do svn 1.7.9).
Weston C
meu professor escreveu o plugin inicial de culpa no svn. Eu ainda tinha que procurar isso. Ele está totalmente se auto-preenchendo nesta tarefa. : P
Joseph Dailey
93

Se você deseja ver o histórico completo de um arquivo com alterações de código:

svn log --diff [path_to_file] > log.txt
emilie zawadzki
fonte
3
Eu não sei quando a opção --diff foi adicionado mas funciona com svn 1.8.10, então não há necessidade de um script bash
Guillaume Gros
1
Eu acho que o svn 1.7.4 introduziu a opção, --diffuma vez que possui testes para a opção, enquanto o 1.7.3 não possui nenhum - subversion/tests/cmdline/log_tests.py.
válido
Apenas uma pequena observação: dependendo do tamanho do histórico, isso pode levar algum tempo até que o arquivo log.txt seja completamente renderizado (embora seja legível imediatamente).
Ivan Durst
1
Como se limita isso às revisões X mais recentes?
Enigma
@Enigma: com a --limit <number>opção. Assim:svn log --diff --limit 5 [path_to_file]
Reid
37

Você pode usar git-svnpara importar o repositório para um repositório Git e, em seguida, usar git log -p filename. Isso mostra cada entrada de log para o arquivo seguida pelo diff correspondente.

Greg Hewgill
fonte
27
Instale o git, crie um repositório git, use um comando git? A pergunta foi marcada e feita sobre o Subversion.
Ken Gentle
21
Eu uso o git como cliente do Subversion com o git-svn. É assim que eu faria a operação log + diff em um repositório Subversion. O Git tem algumas ferramentas realmente excelentes para visualização de repositórios, não é uma idéia tão estranha.
Greg Hewgill 12/11/2008
10
Acima, alguém é (com razão) parabenizado por escrever um bom script - para fornecer funcionalidade não presente no SVN. Vendo que o git é local, a menos que você faça push, você pode chamar isso de ferramentas, sem precisar ficar chateado com as coisas.
Adam Tolley
Também é a única resposta que permite que você use uma GUI (de escolha) para exibir o histórico do arquivo. As outras respostas também não explicaram como limitar as últimas revisões do X (possíveis?), O que é fácil no git. git log X..Y -o filename
TamaMcGlinn 9/10/19
21

Começar com

svn log -q file | grep '^r' | cut -f1 -d' '

Isso fornecerá uma lista de revisões nas quais o arquivo foi alterado, que você poderá usar para criar scripts para chamadas repetidas svn diff.


fonte
4
ou ... continue! svn log -q some_file.xxx | grep ^r | awk '{print $1}' | sed -e 's/^r//' | xargs -i svn diff -rHEAD:{} some_file.xxx > ~/file_history.txtpouco agradável-liner um (awk faz mesmo que cut)
Kasapo
8

O comando "culpar", de nome estranho, faz isso. Se você usar o Tortoise, ele exibirá uma caixa de diálogo "da revisão" e, em seguida, uma lista de arquivos com um indicador linha a linha do número da revisão e o autor ao lado.

Se você clicar com o botão direito do mouse nas informações da revisão, poderá abrir uma caixa de diálogo "Mostrar log" que fornece informações completas sobre o check-in, juntamente com outros arquivos que fizeram parte do check-in.

goosemanjack
fonte
1
Isso é muito útil, mas não o que o OP estava procurando, que é um histórico completo do arquivo, não apenas as contribuições históricas do arquivo atual. Esse histórico completo é útil quando se olha para trás para descobrir por que certo código foi removido ou alterado e quando.
precisa
Pelo contrário, o nome está certo. Ele diz a quem culpar por um pedaço de código específico (porcaria / buggy / incompreensível).
precisa saber é o seguinte
Não seria bom se o nome óbvio para o comando fosse "crédito" em vez de "culpa"? :)
Nick
1
O elogio ao @Nick svn é um apelido para culpar o svn, dependendo de como alguém se sente.
27613 stefgosselin
@stefgosselin - Obrigado por essa nota. Fico feliz em saber que há uma escolha! :)
Nick
3

Até onde eu sei, não existe um comando svn integrado para fazer isso. Você precisaria escrever um script para executar vários comandos para criar todas as diferenças. Uma abordagem mais simples seria usar um cliente svn da GUI, se essa for uma opção. Muitos deles, como o plug-in subversivo do Eclipse, listarão o histórico de um arquivo e permitirão visualizar o diff de cada revisão.

D-Rock
fonte
3

Obrigado, Bendin. Eu gosto muito da sua solução.

Eu mudei para trabalhar em ordem inversa, mostrando as alterações mais recentes primeiro. O que é importante com o código antigo, mantido por vários anos. Eu costumo colocá-lo em mais.

svnhistory elements.py |more

Eu adicionei -r ao tipo. Eu removi as especificações. manipulação para 'primeiro registro'. É que ocorrerá um erro na última entrada, pois não há nada para diferenciá-la. Embora eu esteja vivendo com isso porque nunca desço tão longe.

#!/bin/bash                                                                    

# history_of_file                                                              
#                                                                              
# Bendin on Stack Overflow: http://stackoverflow.com/questions/282802          
#   Outputs the full history of a given file as a sequence of                  
#   logentry/diff pairs.  The first revision of the file is emitted as         
#   full text since there's not previous version to compare it to.             
#                                                                              
# Dlink                                                                        
#   Made to work in reverse order                                              

function history_of_file() {
    url=$1 # current url of file                                               
    svn log -q $url | grep -E -e "^r[[:digit:]]+" -o | cut -c2- | sort -nr | {
        while read r
    do
            echo
            svn log -r$r $url@HEAD
            svn diff -c$r $url@HEAD
            echo
    done
    }
}

history_of_file $1
dlink
fonte
0

Eu já vi várias respostas parciais enquanto pesquisava esse tópico. Foi isso que funcionou para mim e espero que ajude os outros. Este comando exibirá a saída na linha de comando, mostrando o número da revisão, autor, carimbo de data e hora da revisão e alterações feitas:

svn blame -v <filename>

Para facilitar sua pesquisa, você pode gravar a saída em um arquivo e grep para o que está procurando.

alamba
fonte