Pesquisando o histórico do Subversion (texto completo)
-
09-06-2019 - |
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.
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.
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.
Estava procurando a mesma coisa e encontrei isso:
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.