如何识别Git和Mercurial中的criss交叉合并?

时间:2012-06-14 21:18:28

标签: git mercurial merge git-merge

我想确定一些Git和Mercurial开源项目中存在的criss cross merges的数量,仅用于研究目的。有关如何实现这一目标的任何建议吗?

如果合并有两个不同的共同祖先,则可以确定纵横交错。它正在为Mercurial开发一个名为consensus merge的新合并策略,它将扩展ancestor.ancestor()代码以返回所有最伟大的共同祖先。我还没找到这段新代码,但它会有很多帮助。

我不太了解Git,但肯定有类似的东西。

1 个答案:

答案 0 :(得分:1)

我假设您希望获得存储库中任何分支之间的纵横交叉合并的数量,而不是两个分支机构进行纵向交叉合并的次数。在这种情况下,以下shell脚本应该对Git执行:

#!/bin/sh

# Get the list of branches and convert it to an array.
branches=$(git for-each-ref --format='%(refname:short)' refs/heads/)
branches=( $branches )
N=${#branches[*]}

cc_merges=0

# Loop over all combinations of two branches.
for ((i=0; i<N-1; ++i)); do
    for ((k=i+1; k<N; ++k)); do
        a=${branches[$i]}
        b=${branches[$k]}
        bases=$(git merge-base --all $a $b | wc -l)
        if [ $bases -gt 1 ]; then
            let "cc_merges += 1"
        fi
    done
done

echo "Number of criss-cross merges in repository: $cc_merges"

对于Mercurial,遗憾的是ancestor() revset和debugancestor命令只列出了最大的共同祖先,而不是所有祖先的列表,所以我无法在此提出解决方案。