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?


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

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.


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

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.


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.


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.


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.


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

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.