ディレクトリの内容を比較するために使用できる最適化ツールは何ですか?

ディレクトリの内容を比較するために使用できる最適化ツールは何ですか?

Subversionリポジトリタグをミラーリングしていsvn2gitて、特定のリビジョンをチェックアウトするときに、gitミラーで得られたリビジョンがSubversionで得られたリビジョンと一致することを確認したいと思います。私の主な問題は、Subversionタグを更新し、Subversionブランチの対応するタグと一致する一致タグがあるかどうかをgitミラーをチェックする必要があることです。

これらの検査を効率的に実行できるツールはありますか?ソースコードも多く、小さなファイルもたくさんあります。このトピックには多くの回答がありますが、そのタスクdiffに最適化されたツールがあるかどうか疑問に思います。

答え1

diff -qrN2つのディレクトリツリーを比較するのと同じくらい高速です。この-qオプションを使用すると、ファイルが異なる場合は早く終了します。ほとんどの場合、ファイルが同じであることを望むので、これは重要ではありません。とにかく、比較ツールはファイル全体を読み取って比較する必要があります。

あなたができる唯一の改善点は、両方のリポジトリdiffからチェックアウトしないことです。Gitに仕事をさせてください。そうすれば、より速いかもしれません。

答え2

興味深い質問です。 Git自体を使用するのは簡単な解決策かもしれません。次はレッドマインSubversionリポジトリhttps://svn.redmine.org/redmineそしてGitHubミラーhttps://github.com/redmine/redmineラベルの場合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)

この出力は、gitとsvn checkoutタグの間に違いはなく、考慮されることを3.0.3意味します。に.gitignore追加することもできます。/.svn.gitignore

修正する:フルスクリプト:

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

出力:

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

...

関連情報