我想确定一些 Git 和 Mercurial 开源项目中存在的交叉合并的数量,仅用于研究目的。关于如何做到这一点的任何建议?
如果合并具有两个不同的共同祖先,则可以确定交叉合并。它正在为 Mercurial 开发一种新的合并策略,称为共识合并,它将扩展祖先.ancestor() 代码以返回所有最大的共同祖先。我还找不到这段新代码,但它会有很大帮助。
我不太了解 Git,但它肯定有类似的东西。
我假设您想要获取存储库中任何分支之间的交叉合并次数,而不是两个分支交叉合并的次数。在这种情况下,下面的 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
命令都只列出了最大的共同祖先,而不是所有祖先的列表,所以我无法在这里提出解决方案。