【问题标题】:How to identifiy criss cross merges in Git and Mercurial?如何识别 Git 和 Mercurial 中的交叉合并?
【发布时间】:2012-06-14 21:18:28
【问题描述】:

我想确定存在于某些 Git 和 Mercurial 开源项目中的 criss cross merges 的数量,仅用于研究目的。关于如何完成此任务的任何建议?

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

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

【问题讨论】:

  • 这是一个有趣的链接,但已经超过 6 年了...我想知道新/修订版本(具有更多 Hg/Git/Bzr 输入)会是什么样子...
  • 您可能想将标题重命名为“3-way merge”,因为我以前从未听说过“交叉合并”……
  • @poke,阅读链接。 3路合并!=纵横交错合并。交叉合并是分支 A 合并分支 B 的变化,分支 B 合并分支 A 的变化。在 A->B 或 B->A 的稍后点使用 3-way 合并可能会导致合并过程中的错误。
  • @MarkTolonen 哦,对不起,刚读了第一句话,听起来是一样的。
  • Mercurial revsets 非常具有表现力。我相信你可以找到一种方法来识别这些与它们的合并。 hg help revsets.

标签: git mercurial merge git-merge


【解决方案1】:

我假设您想要获取存储库中任何分支之间的交叉合并次数,而不是两个分支交叉合并的次数。在这种情况下,应该为 Git 使用以下 shell 脚本:

#!/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 命令都只列出了最大的共同祖先,而不是所有祖先的列表,所以我无法在这里提出解决方案。

【讨论】:

    猜你喜欢
    • 2013-06-17
    • 2014-12-09
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    相关资源
    最近更新 更多