SVN Obtendo todas as revisões de um arquivo

6

Eu tenho um repositório de tamanho moderado (cerca de 2.500 versões) de um projeto que tenho executado nos últimos 3 anos. Existe um arquivo em particular (vamos chamá-lo de foo.xml), que agora quero analisar sua evolução. Idealmente, o que estou procurando é exportar para um diretório todas as versões que o arquivo tinha, anexadas à data, por exemplo,

2007_08_08_foo.xml
2007_08_09_foo.xml
2007_08_15_foo.xml
...

Qual é a maneira mais rápida de conseguir isso?

    
por Hugo Sereno Ferreira 05.07.2010 / 05:10

3 respostas

4

Eu não acho que o SVN tem essa funcionalidade embutida, mas se você é capaz de executar comandos no servidor que contém o repositório SVN (e supondo que o servidor tenha as ferramentas UNIX / Linux disponíveis), este script bash deve faça por você:

REPOS=/path/to/repos
FILE=dir/foo.xml
for rev in "$(svnlook history $REPOS $FILE | awk 'NR > 2 { print $1 }')"; do
    rev_date=$(svnlook date -r $rev $REPOS | awk '{ print $1 }')
    svnlook cat -r $rev $REPOS $FILE > ${rev_date}_${FILE}
done

Isso produzirá nomes de arquivos na forma 2007-08-08_foo.xml . Obviamente, você precisa alterar /path/to/repos na primeira linha para o caminho real do sistema de arquivos (não uma URL) do repositório e dir/foo.xml na segunda linha para o caminho do arquivo dentro do repositório.

Se for realmente importante para você ter sublinhados na data, altere a linha 4 da seguinte forma:

    rev_date=$(svnlook date -r $rev $REPOS | awk '{ print $1 }' | tr - _)

Lembre-se também de que, se o arquivo já foi modificado mais de uma vez em um determinado dia, somente a primeira edição de cada dia será refletida nos arquivos gravados.

    
por 05.07.2010 / 07:42
2

Meu colega de trabalho escreveu este script de shell para um propósito semelhante:

#!/bin/bash
for rev in 'svn log $1 | grep ^r[0-9] | cut -c 2- | cut -d ' ' -f 1'; do
    svn log -r $rev
    svn diff -r $[$rev-1]:$rev $1 2>/dev/null || svn cat -r $rev $1
done

Você não precisa de acesso ao servidor para executá-lo; executá-lo em um diretório onde você tem esse arquivo check-out e passar um nome de arquivo como o argumento. Você pode querer modificar o corpo do loop para gravar arquivos completos em vez de imprimir diffs para stdout:

do
    svn cat -r $rev $1 > $1.$rev
done
    
por 11.07.2010 / 15:43
1

Eu estava tendo problemas com um dos scripts nesta resposta, ele não parecia funcionar sempre que havia um espaço em um nome de arquivo. Eu não sou mestre no bash scripting, mas esta é uma solução rápida.

#!/bin/bash
echo "svn log \"$1\" | grep ^r[0-9] | cut -c 2- | cut -d ' ' -f 1"
for rev in 'svn log "$1" | grep ^r[0-9] | cut -c 2- | cut -d ' ' -f 1'; do
    svn log -r $rev
    #svn diff -r $[$rev-1]:$rev $1 2>/dev/null || svn cat -r $rev $1
    'svn cat -r $rev "$1" > "$rev.$1"'
done
    
por 03.04.2011 / 06:09