¿Qué herramientas optimizadas están disponibles para comparar los contenidos del directory?

Estoy duplicando una label del repository de Subversion con svn2git y quiero estar seguro de que cuando svn2git revisiones particulares, las que obtengo del espejo git coinciden con las de Subversion. Mi problema principal es que las tags de subversión se pueden actualizar, y debo asegurarme de que la comprobación de la label coincidente en el espejo git coincida con la equivalente en la twig de Subversion.

¿Hay algunas herramientas que pueden hacer esos controles de manera eficiente? La fuente es bastante con muchos files pequeños. Hay bastantes respuestas aquí sobre el tema que involucra a diff , pero me pregunto si hay herramientas más optimizadas para el trabajo.

diff -qrN es lo más rápido posible para comparar dos treees de directorys. La opción -q hace salir temprano cuando los files son diferentes. Como espera que los files sean idénticos la mayor parte del time, no importa demasiado: la herramienta de comparación tiene que leer y comparar todos los files de todos modos.

La única mejora que puede hacer en diff es evitar el check out desde ambos repositorys. Hacer que git haga el trabajo puede ser más rápido entonces.

Problema interesante. Usar Git en sí mismo podría ser una solución fácil. A continuación se muestra la comparación entre el repository de Subversion de Redmine https://svn.networkingmine.org/networkingmine y su mirror GitHub https://github.com/networkingmine/networkingmine para la label 3.0.3 :

 $ git clone https://github.com/networkingmine/networkingmine $ cd networkingmine $ 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.networkingmine.org/networkingmine/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 salida significa que no hay diferencia entre las transferencias de git y svn de la label 3.0.3 , con .gitignore considerado. Es posible que desee agregar /.svn en .gitignore .

ACTUALIZACIÓN: secuencia de commands completa:

 #!/bin/sh gitrepo=https://github.com/networkingmine/networkingmine svnrepo=https://svn.networkingmine.org/networkingmine 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 

Salida:

 $ ./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 ...