Pesquisando o histórico do subversion (texto completo)


135

Existe uma maneira de executar uma pesquisa de texto completo de um repositório do subversion, incluindo todo o histórico?

Por exemplo, eu escrevi um recurso que usei em algum lugar, mas ele não era necessário, então eu rmmdm os arquivos, mas agora preciso encontrá-lo novamente para usá-lo para outra coisa. O svn log provavelmente diz algo como "coisas não utilizadas removidas", e há um monte de checkins assim.

Editar 15-04-2016: Observe que o que é solicitado aqui pelo termo "pesquisa de texto completo" é pesquisar as diferenças reais do histórico de confirmação, e não os nomes de arquivos e / ou mensagens de confirmação . Estou apontando isso porque o fraseado do autor acima não reflete muito bem - pois no exemplo dele, ele pode estar procurando apenas um nome de arquivo e / ou mensagem de confirmação. Daí muitas svn logrespostas e comentários.


6
O Apache Subversion 1.8 aceita --searchargumento para svn logcomando. Veja a minha resposta em stackoverflow.com/a/17473516/761095
bahrep

3
svn log --searchnão realiza uma pesquisa de texto completo conforme exigido por @rjmunro, mas apenas pesquisa autor, data, mensagem de log e lista de caminhos alterados.
precisa saber é o seguinte

Respostas:


77
git svn clone <svn url>
git log -G<some regex>

1
Bom ponto. A GUI do gitk faz esse tipo de pesquisa muito bem, e é fácil usar as ferramentas git svn para acessar um repositório svn. É certo que eu mudei completamente para usar o git desde o momento em que fiz essa pergunta; portanto, aceitar essa resposta pode ser um pouco específico para mim.
rjmunro 29/09/10

4
Esteja ciente, isso pode demorar um pouco, dependendo do tamanho do seu repositório. Para mim, levou mais de uma hora.
user247702

20
Eu diminuí a votação desta solução, pois a conversão de um grande repositório SVN em GIT geralmente não é viável ou levaria muito tempo. É como recomendar Java ao ter uma pergunta sobre uma construção da linguagem C #.
ooxi

3
Pode ser necessário instalar um pacote adicional para este comando. No Ubuntu, você quer apt-get install git-svn.
nedned 23/03/16

5
"Svn log --verbose --diff | grep ..." não compra a mesma funcionalidade sem ter que usar o git?
lyte

41

svn logno Apache Subversion 1.8 suporta uma nova --searchopção . Assim, você pode pesquisar as mensagens de log do histórico do repositório do Subversion sem usar ferramentas e scripts de terceiros.

svn log --search pesquisa no autor, data, texto da mensagem de log e lista de caminhos alterados.

Veja SVNBook | svn logreferência de linha de comando .


7
Pesquisa útil, mas não com texto completo. Eu estou furando com a resposta git-svn :-)
rjmunro

4
Não que no momento os repositórios svn no googlecode ainda estejam em execução no svn 1.6 ... consulte: code.google.com/p/support/wiki/… ? Mas, atualizar seu cliente para 1,8 (e SVN atualizar de qualquer check-out repo) permitirá que você use svn log --search no repo ...
Mario Ruggier

A cópia de trabalho precisa de todas as atualizações, mas este comando lista toda a alteração, incluindo o número da revisão, os arquivos alterados e o comentário. Como não é um texto completo?
Bernhard Döbler

24

Se você estiver executando o Windows, consulte o SvnQuery . Ele mantém um índice de texto completo de repositórios locais ou remotos. Todo documento já confirmado em um repositório é indexado. Você pode fazer consultas semelhantes ao google a partir de uma interface web simples.


Seria ótimo se o SvnQuery ainda fosse mantido, mas infelizmente ele morreu e agora simplesmente não funciona.
Dan Atkinson

Encontrei um clone em funcionamento (?) Em github.com/kalyptorisk/svnquery/releases
Philip Helger

21

Estou usando um shellscript pequeno, mas isso funciona apenas para um único arquivo. É claro que você pode combinar isso com o find para incluir mais arquivos.

#!/bin/bash
for REV in `svn log $1 | grep ^r[0-9] | awk '{print $1}'`; do 
  svn cat $1 -r $REV | grep -q $2
  if [ $? -eq 0 ]; then 
    echo "$REV"
  fi 
done

Se você realmente deseja pesquisar tudo, use o svnadmin dumpcomando e grep através dele.


Eu tive que remover o "r" dos números das revisões com: awk '{print substr ($ 1,2, length ($ 1))}' e remover a opção grep "-q", para realmente mostrar as correspondências.
Hugo

strings myDump.txt | grep "tartaruga fwd 10"
jedierikb 14/07/12

2
E é por isso que adotamos o git.
Expiação limitada

pode querer fazer o último grep -i para ignorar maiúsculas e minúsculas -q para realmente ver a linha que corresponde #
Belun

13

A melhor maneira que encontrei para fazer isso é com menos:

svn log --verbose | Menos

Uma vez menos, você pode pressionar /para pesquisar, como o VIM.

Editar:

Segundo o autor, ele deseja pesquisar mais do que apenas as mensagens e os nomes dos arquivos. Nesse caso, você será solicitado a invadir o gueto com algo como:

svn diff -r0:HEAD | less

Você também pode substituir grepou outra coisa para fazer a pesquisa por você. Se você deseja usá-lo em um subdiretório do repositório, será necessário svn logdiscernir a primeira revisão na qual esse diretório existia e usar essa revisão em vez de 0.


5
Isso não é pesquisa de texto completo, está pesquisando os registros e nomes de arquivos.
Rjmunro 07/09/08

Se for esse o caso, será necessário usar logs de confirmação mais expressivos. Se você deseja considerar a diferença entre as revisões, essa é outra bola de cera. E eu pessoalmente não conheço uma maneira de fazer isso.
Jack M.

> svn diff -r0: HEAD> log> menos log é a minha escolha no Windows. Graças
kingoleg


7
svn log -v [repository] > somefile.log

para diff você pode usar a --diffopção

svn log -v --diff [repository] > somefile.log

use o vim ou o nano ou o que você quiser e faça uma pesquisa pelo que está procurando. Você o encontrará rapidamente.

Não é um script sofisticado ou qualquer coisa automatizada. Mas funciona.


AFAICS, que procurará mensagens de confirmação, não as diferenças reais.
Rjmunro 14/10

Em seguida, use svn log -v --diff [repositório]> somefile.log
JREN 15/15/15

6

Embora não seja de graça, você pode dar uma olhada no Fisheye da Atlassian, o mesmo pessoal que o traz para o JIRA. Faz pesquisa de texto completo no SVN com muitos outros recursos úteis.

http://www.atlassian.com/software/fisheye/


1
Olho de peixe é muito bom. Como você diz, não é de graça, mas a licença de committer <= 10 é de apenas US $ 10 / ano.
Jason S

Atualmente, 5 usuários custam US $ 10, mas com apenas 10 usuários, eles saltam para US $ 1.000!
Mawg diz que restabelece Monica


4

Acabei de encontrar este problema e

svnadmin dump <repo location> |grep -i <search term>

fez o trabalho para mim. Retornou a revisão da primeira ocorrência e citou a linha que eu estava procurando.


1
Funciona apenas localmente e levará muito tempo se um repositório for grande.
bahrep

2

Não tenho nenhuma experiência com isso, mas o SupoSE (código aberto, escrito em Java) é uma ferramenta projetada para fazer exatamente isso.


2

svn log -l<commit limit> | grep -C<5 or more lines> <search message>


1

Eu costumo fazer o que Jack M diz (use svn log --verbose), mas faço pipe para grep em vez de menos.


5
Isso não é pesquisa de texto completo, está pesquisando os registros e nomes de arquivos.
rjmunro 7/09/08

Isso é o que geralmente acabo fazendo, mas descobri que lessvocê pode ver a revisão, a data etc., em vez de apenas a linha do comentário. Isso é geralmente o que estou procurando de qualquer maneira.
Jack M.

1

Eu escrevi isso como um script de cygwin bash para resolver esse problema.

No entanto, exige que o termo de pesquisa esteja atualmente no arquivo do sistema de arquivos. Para todos os arquivos que correspondem ao grep do sistema de arquivos, um grep de todas as diferenças svn para esse arquivo é executado. Não é perfeito, mas deve ser bom o suficiente para a maioria dos usos. Espero que isto ajude.

/ usr / local / bin / svngrep

#!/bin/bash
# Usage: svngrep $regex @grep_args

regex="$@"
pattern=`echo $regex | perl -p -e 's/--?\S+//g; s/^\\s+//;'` # strip --args
if [[ ! $regex ]]; then
    echo "Usage: svngrep \$regex @grep_args"
else 
    for file in `grep -irl --no-messages --exclude=\*.tmp --exclude=\.svn $regex ./`;     do 
        revs="`svnrevisions $file`";
        for rev in $revs; do
            diff=`svn diff $file -r$[rev-1]:$rev \
                 --diff-cmd /usr/bin/diff -x "-Ew -U5 --strip-trailing-cr" 2> /dev/null`
            context=`echo "$diff" \
                 | grep -i --color=none   -U5 "^\(+\|-\).*$pattern" \
                 | grep -i --color=always -U5             $pattern  \
                 | grep -v '^+++\|^---\|^===\|^Index: ' \
                 `
            if [[ $context ]]; then
                info=`echo "$diff" | grep '^+++\|^---'`
                log=`svn log $file -r$rev`
                #author=`svn info -r$rev | awk '/Last Changed Author:/ { print $4 }'`; 

                echo "========================================================================"
                echo "========================================================================"
                echo "$log"
                echo "$info"
                echo "$context"
                echo
            fi;
        done;
    done;
fi

/ usr / local / bin / svnrevisions

#!/bin/sh
# Usage:  svnrevisions $file
# Output: list of fully numeric svn revisions (without the r), one per line

file="$@"
    svn log "$file" 2> /dev/null | awk '/^r[[:digit:]]+ \|/ { sub(/^r/,"",$1); print  $1 }'

'A' por esforço! (use git :))
Expiação limitada

-1

Caso esteja tentando determinar qual revisão é responsável por uma linha de código específica, provavelmente você está procurando:

svn blame

Crédito: resposta original


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.