Pergunta

Existe uma maneira de realizar uma pesquisa de texto completo em um repositório do Subversion, incluindo todo o histórico?

Por exemplo, escrevi um recurso que usei em algum lugar, mas não era necessário, então svn rm'd os arquivos, mas agora preciso encontrá-lo novamente para usá-lo em outra coisa.O log do svn provavelmente diz algo como "removido material não utilizado", e há muitos checkins como esse.

Editar 15/04/2016: Observe que o que é solicitado aqui pelo termo "pesquisa de texto completo" é pesquise as diferenças reais do histórico de commits, e não nomes de arquivos e/ou mensagens de commits.Estou apontando isso porque a frase do autor acima não reflete isso muito bem - já que em seu exemplo ele poderia estar apenas procurando por um nome de arquivo e/ou mensagem de commit.Daí grande parte svn log respostas e comentários.

Foi útil?

Solução

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

Outras dicas

svn log no Apache Subversion 1.8 suporta um novo --search opção.Assim, você pode pesquisar mensagens de log do histórico do repositório Subversion sem usar ferramentas e scripts de terceiros.

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

Ver SVNBook | svn log referência de linha de comando.

Se você estiver executando o Windows, dê uma olhada em 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 às do Google a partir de uma interface web simples.

Estou usando um pequeno shellscript, mas isso só funciona para um único arquivo.É claro que você pode combinar isso com 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 dump comando e grep através disso.

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

SVN LOG --verbose | menos

Assim que less aparecer com saída, você pode acertar / para pesquisar, como VIM.

Editar:

Segundo o autor, ele quer pesquisar mais do que apenas mensagens e nomes de arquivos.Nesse caso, você será solicitado a hackear o gueto junto com algo como:

svn diff -r0:HEAD | less

Você também pode substituir grep ou outra coisa para fazer a busca por você.Se você quiser usar isso em um subdiretório do repositório, você precisará usar svn log discernir a primeira revisão em que esse diretório existia e usar essa revisão em vez de 0.

Eu tenho procurado por algo semelhante.O melhor que eu descobri é OpenGrok.Ainda não tentei implementá-lo, mas parece promissor.

svn log -v [repository] > somefile.log

para diff você pode usar o --diff opção

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

em seguida, use vim ou nano ou o que você quiser e faça uma pesquisa pelo que procura.Você o encontrará muito rapidamente.

Não é um script sofisticado nem nada automatizado.Mas funciona.

Embora não seja gratuito, você pode dar uma olhada no Fisheye da Atlassian, a mesma pessoa que traz o JIRA para você.Ele faz pesquisa de texto completo no SVN com muitos outros recursos úteis.

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

Estava procurando a mesma coisa e encontrei isso:

http://svn-search.sourceforge.net/

Acabei de me deparar com esse problema e

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

fez o trabalho para mim.Retornei a revisão da primeira ocorrência e citei a linha que procurava.

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

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

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

No entanto, requer que o termo de pesquisa esteja atualmente no arquivo do sistema de arquivos.Para todos os arquivos que correspondem ao sistema de arquivos grep, um grep de todos os svn diffs para esse arquivo é então 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 }'

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

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

svn blame

Crédito: resposta original

Eu me deparei com isso script bash, mas eu não tentei.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top