Quais ferramentas otimizadas estão disponíveis para comparar o conteúdo do diretório?

2

Eu estou espelhando uma tag de repositório do Subversion com svn2git e quero ter certeza de que quando eu fizer checkout de revisões particulares, aquelas que eu obtenho do git mirror combinam com aquelas do Subversion. Meu principal problema é que as tags do subversion podem ser atualizadas, e eu preciso garantir que a verificação da tag correspondente no espelho do git coincida com a equivalente na ramificação do Subversion.

Existem algumas ferramentas que podem fazer essas verificações com eficiência? A fonte é bastante com muitos arquivos pequenos. Há algumas respostas aqui sobre o assunto que envolvem diff , mas gostaria de saber se existem ferramentas mais otimizadas para o trabalho.

    
por vfclists 08.06.2015 / 12:39

2 respostas

2

diff -qrN é o mais rápido possível para comparar duas árvores de diretórios. A opção -q faz com que ela seja encerrada quando os arquivos são diferentes. Como você espera que os arquivos sejam idênticos a maior parte do tempo, não importa muito: a ferramenta de comparação precisa ler e comparar os arquivos inteiros de qualquer maneira.

A única melhoria que você pode fazer no diff é evitar o check-out de ambos os repositórios. Fazer o git para fazer o trabalho pode ser mais rápido do que isso.

    
por 09.06.2015 / 04:21
2

Problema interessante. Usar o próprio Git pode ser uma solução fácil. A seguir demonstra-se a comparação entre o repositório Subversion do Redmine a> e seu espelho link do GitHub para a tag 3.0.3 :

$ git clone https://github.com/redmine/redmine
$ cd redmine
$ git checkout 3.0.3
$ find -mindepth 1 -maxdepth 1 ! -name .git | xargs rm -rf
  ... remove files and dirs except .git
$ svn checkout https://svn.redmine.org/redmine/tags/3.0.3 .
$ git status
HEAD detached at 3.0.3
Untracked files:
  (use "git add <file>..." to include in what will be committed)

    .svn/

nothing added to commit but untracked files present (use "git add" to track)

Esta saída significa que não há diferença entre os checkouts git e svn da tag 3.0.3 , com .gitignore considerado. Você pode querer adicionar /.svn em .gitignore .

UPDATE: script completo:

#!/bin/sh

gitrepo=https://github.com/redmine/redmine
svnrepo=https://svn.redmine.org/redmine
tmpdir=$(mktemp -d)
trap "rm -rf $tmpdir" EXIT

git clone $gitrepo $tmpdir
cd $tmpdir

git tag -l |
while read tag; do
        echo
        echo "git checking out $tag" &&
        git checkout -q $tag >/dev/null &&
        find -mindepth 1 -maxdepth 1 ! -name .git | xargs rm -rf &&
        echo "svn checking out $tag" &&
        svn checkout $svnrepo/tags/$tag . >/dev/null &&
        git status --porcelain &&
        echo "done $tag"
done

Saída:

$ ./compare.sh 
Cloning into '/tmp/tmp.BYnBNQqB7I'...
remote: Counting objects: 120652, done.
remote: Total 120652 (delta 0), reused 0 (delta 0), pack-reused 120652
Receiving objects: 100% (120652/120652), 39.16 MiB | 6.40 MiB/s, done.
Resolving deltas: 100% (91652/91652), done.
Checking connectivity... done.

git checking out 0.2.0
svn checking out 0.2.0
?? .svn/
done 0.2.0

git checking out 0.3.0
svn checking out 0.3.0
?? .svn/
done 0.3.0

git checking out 0.4.0
svn checking out 0.4.0
?? .svn/
done 0.4.0

...
    
por 09.06.2015 / 03:26