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?
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
}
}
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.
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.
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.
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.
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.
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
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.
Respostas:
Não existe um comando interno para isso, então geralmente faço algo assim:
Em seguida, você pode chamá-lo com:
fonte
svn: '.' is not a working copy svn: Syntax error in revision argument '@HEAD' svn: Syntax error in revision argument '@HEAD'
svn log --diff [path_to_file]
funciona exatamente assim! stackoverflow.com/a/24938573/3185510Um pouco diferente do que você descreveu, mas acho que pode ser o que você realmente precisa:
Ele imprimirá o arquivo com cada linha prefixada pela hora e autor da confirmação que o alterou pela última vez.
fonte
Se você deseja ver o histórico completo de um arquivo com alterações de código:
fonte
--diff
uma vez que possui testes para a opção, enquanto o 1.7.3 não possui nenhum -subversion/tests/cmdline/log_tests.py
.--limit <number>
opção. Assim:svn log --diff --limit 5 [path_to_file]
Você pode usar
git-svn
para importar o repositório para um repositório Git e, em seguida, usargit log -p filename
. Isso mostra cada entrada de log para o arquivo seguida pelo diff correspondente.fonte
git log X..Y -o filename
Começar com
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
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.txt
pouco agradável-liner um (awk faz mesmo que cut)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.
fonte
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.
fonte
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.
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.
fonte
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:
Para facilitar sua pesquisa, você pode gravar a saída em um arquivo e grep para o que está procurando.
fonte