2 つのコミットのコンテンツ間の適切な編集距離を計算する方法を探しています。
私が見つけた最良の方法は、の出力から何かを導き出すことです
git diff <commit-ish> <commit-ish> --numstat
...しかし、この方法を使用して思いつくものは、編集距離の非常に大まかなプロキシになります。
もっと良いものはありますか?
2 つのコミットのコンテンツ間の適切な編集距離を計算する方法を探しています。
私が見つけた最良の方法は、の出力から何かを導き出すことです
git diff <commit-ish> <commit-ish> --numstat
...しかし、この方法を使用して思いつくものは、編集距離の非常に大まかなプロキシになります。
もっと良いものはありますか?
ここでの最善の策は、レーベンシュタイン距離を計算するために外部ツールを使用することだと思います。たとえば、Perl のText::Levenshtein
モジュール。
たとえば、ややハッキリと:
#!/bin/sh
COMMIT_ONE=$1
COMMIT_TWO=$2
FILES_AFFECTED=$(git diff $COMMIT_ONE $COMMIT_TWO --numstat | awk '{ print $3 }')
TOTAL_LEV_DIST=0
for FILE in $FILES_AFFECTED; do
CONTENTS_ONE=$(git show $COMMIT_ONE:$FILE)
CONTENTS_TWO=$(git show $COMMIT_TWO:$FILE)
LEV_DIST=$(perl -MText::Levenshtein -e 'my ($str1, $str2) = @ARGV; print Text::Levenshtein::distance($str1, $str2);' "$CONTENTS_ONE" "$CONTENTS_TWO")
TOTAL_LEV_DIST=$(($TOTAL_LEV_DIST + $LEV_DIST))
done
echo $TOTAL_LEV_DIST
これはトリックを行うようです:
$ git diff HEAD HEAD~3 --numstat
0 5 Changes
1 3 dist.ini
$ ./lev_dist_git_commits.sh HEAD HEAD~3
230
$ ./lev_dist_git_commits.sh HEAD HEAD
0
注: Text::Levenshtein::XS
C コンパイラがあり、速度が重要な場合は、インストールして速度を上げることができます。私のコンピューターでは、時間が 1.5 秒から 0.05 秒に短縮されました。