Quels outils optimisés sont disponibles pour comparer le contenu des directorys?

Je mets en miroir une balise de référentiel Subversion avec svn2git et je veux être sûr que lorsque je vérifie des révisions particulières, celles que j'obtiens du miroir git correspondent à celles de Subversion. Mon principal problème est que les tags de subversion peuvent être mis à jour et je dois vérifier que la vérification de la balise correspondante dans le miroir git correspond à celle de la twig Subversion.

Y a-t-il des outils qui peuvent faire ces vérifications efficacement? La source est beaucoup avec beaucoup de petits files. Il y a pas mal de réponses ici sur le sujet impliquant diff , mais je me request s'il y a plus d'outils optimisés pour le travail.

diff -qrN est aussi rapide que possible pour comparer deux arborescences de directorys. L'option -q fait quitter tôt lorsque les files diffèrent. Comme vous attendez que les files soient identiques la plupart du time, cela n'a pas d'importance: l'outil de comparaison doit tout de même lire et comparer les files entiers.

La seule amélioration que vous pouvez faire sur diff est d'éviter de vérifier à partir des deux référentiels. Obtenir git pour faire le travail peut être plus rapide alors.

Problème intéressant. Utiliser Git lui-même pourrait être une solution facile. Ce qui suit démontre la comparaison entre le repository Subversion de Redmine https://svn.redmine.org/redmine et son miroir GitHub https://github.com/redmine/redmine pour la balise 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) 

Cette sortie signifie qu'il n'y a pas de différence entre git et svn checkouts de la balise 3.0.3 , avec .gitignore considéré. Vous voudrez peut-être append /.svn dans .gitignore .

MISE À JOUR: Script complet:

 #!/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 

Sortie:

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