5

我正在寻找一种方法来计算任何两个提交的内容之间的良好编辑距离。

我发现的最好的方法是从

git diff <commit-ish> <commit-ish> --numstat

...但是我可以使用这种方法提出的任何东西都是编辑距离的非常粗略的代理。

有更好的吗?

4

1 回答 1

2

我认为您最好的选择是使用外部工具来计算 Levenshtein 距离。例如 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 秒。

于 2014-05-31T20:59:01.167 回答