Subversionリポジトリタグをミラーリングしていsvn2git
て、特定のリビジョンをチェックアウトするときに、gitミラーで得られたリビジョンがSubversionで得られたリビジョンと一致することを確認したいと思います。私の主な問題は、Subversionタグを更新し、Subversionブランチの対応するタグと一致する一致タグがあるかどうかをgitミラーをチェックする必要があることです。
これらの検査を効率的に実行できるツールはありますか?ソースコードも多く、小さなファイルもたくさんあります。このトピックには多くの回答がありますが、そのタスクdiff
に最適化されたツールがあるかどうか疑問に思います。
答え1
diff -qrN
2つのディレクトリツリーを比較するのと同じくらい高速です。この-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
...