我正在寻找一种计算任意两个提交内容之间良好的编辑距离的方法。
我找到的最佳方法是从以下输出中得出一些东西:
git diff <commit-ish> <commit-ish> --numstat
...但使用这种方法得出的任何内容都只是编辑距离的一个非常粗糙的代理。
有更好的方法吗?
我正在寻找一种计算任意两个提交内容之间良好的编辑距离的方法。
我找到的最佳方法是从以下输出中得出一些东西:
git diff <commit-ish> <commit-ish> --numstat
...但使用这种方法得出的任何内容都只是编辑距离的一个非常粗糙的代理。
有更好的方法吗?
我认为你最好使用外部工具来计算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
注意:如果您有C编译器并且速度很重要,可以安装Text::Levenshtein::XS
以提高速度。在我的电脑上,这将运行时间从1.5秒降低到0.05秒。