在 Ancestry Path 中查找所有合并

Find all merge in Ancestry Path

在Git中,我可以通过

获得所有需要的提交

git log hash..master --ancestry-path --merges

在 LibGit2Sharp 中是否有等效项?

首先是一些基础知识:

git log topic..master

var filter = new CommitFilter { 
    SortBy = CommitSortStrategies.Time,
    Since = master,
    Until = topic,
};
var commitList = repo.Commits.QueryBy (filter);

git log topic..master --merges

var filter = new CommitFilter { 
    SortBy = CommitSortStrategies.Time,
    Since = master,
    Until = topic,
};
var commitList = repo.Commits.QueryBy (filter);
var mergeList = commitList.Where (p => p.Parents.Count () >= 2);

现在回答你的问题:

git log topic..master --ancestry-path --merges

ancestry-path =

       When given a range of commits to display (e.g.  commit1..commit2 or
       commit2 ^commit1), only display commits that exist directly on the
       ancestry chain between the commit1 and commit2, i.e. commits that
       are both descendants of commit1, and ancestors of commit2.

一旦我们有了祖先路径,-merges 就很容易了,因为我们可以过滤超过一个 parent 的提交。获取祖先路径需要一些编码 ;-)

由于在上面的第一个示例中从 commitList 返回的 ICommitLog 包含通过 .Parents 属性 的 DAG(有向无环图),我们需要遍历图表并通过 depth-first 搜索获得“所有简单路径”以查找所有 non-cyclical 路径。一旦你有了所有 simple 路径的列表,只需过滤它的提交>=2 parents.

注意:我已经在一些 C# 项目中完成了此操作,甚至像计算与特定提交相关的 pull-request 这样的简单项目也使用了此 depth-first 祖先。我倾向于远离 Linq 来执行此操作,因为我有 huge 提交列表(我搜索的 sub-DAG 中开始到结束节点之间的 100k+ 个节点)并且还避免了由于堆栈大小而导致的递归方法但是您的 use-case may/will 不同。如果您此时遇到困难,post 另一个关于您的 algorithm/code 问题的问题。