Subversion 저장소 태그를 미러링하고 svn2git
있으며 특정 개정판을 체크아웃할 때 git 미러에서 얻은 개정판이 Subversion에서 얻은 개정판과 일치하는지 확인하고 싶습니다. 내 주요 문제는 Subversion 태그를 업데이트할 수 있고 Subversion 분기의 해당 태그와 일치하는 일치하는 태그가 있는지 git 미러를 확인해야 한다는 것입니다.
이러한 검사를 효율적으로 수행할 수 있는 도구가 있습니까? 소스 코드도 많고 작은 파일도 많습니다. 이 주제에 대해 많은 답변이 있지만 diff
해당 작업에 더 최적화된 도구가 있는지 궁금합니다.
답변1
diff -qrN
두 개의 디렉토리 트리를 비교하는 것만큼 빠릅니다. 이 -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
...