测量大型源树中的"亲密度"

red*_*bmk 7 git diff directory-structure

作为我之前提出的关于找到两个源之间最佳匹配的问题的一部分,其中一个有一个活跃的git repo而另一个没有git历史,我编写了一个perl脚本来找到最接近的git commit.

我正在重写脚本,以便您不必猜测要使用哪个分支,但它会在所有分支中运行并找到最接近的匹配,然后告诉您最佳分支的最佳提交.不幸的是,我发现我正在使用的测量可能不是"亲近"的最佳判断.

目前,我diff -burN -x.git my_git_subtree my_src_subtree | wc -l用来确定代码树的接近程度.这似乎或多或少有效,但我遇到了添加或丢失整个文件夹的情况,这些文件可能存在或不存在于另一个分支中.

有没有更好的方法来确定来源的接近程度?我正在设想比较目录结构的东西,可能还有多少行不同.它可能只是传递不同的参数diff,或者可能还有另一种工具可以做到这样的事情.

dpk*_*pkp 3

为了改进你的测量,为什么不尝试 'git diff --shortstat' 呢?输出如下所示:

 1 file changed, 1 insertion(+), 2 deletions(-)
Run Code Online (Sandbox Code Playgroud)

您可以根据结果尝试如何确定文件更改/插入/删除的优先级。

看看你的 perl,我认为你可能无法对提交之间的“紧密度”顺序做出假设——你可能需要强力检查每个提交,或者至少将其作为一个选项。

我还建议您不要寻找最接近的,而是保留一个(提交,“接近度”)对的排序列表,并且可能显示前几个并手动查看它们。如下所述,仅通过查看更改数量来确定两组代码是否接近并不存在灵丹妙药。也就是说,更改的数量绝对可以帮助您缩小应该审查的列表的范围......

更新:我还应该提到使用 git diff 的另一个优点是您不必为每次提交运行硬重置。只需从您的未知树(没有 git 历史记录的树)符号链接 .git/ 目录,然后使用 git reset [--mixed] ,它将更新当前的头指针,但保持源代码不变(显然需要备份未知的)使用此方法之前的源树)。