使用LibGit2Sharp获取合并提交的差异

时间:2014-05-27 06:29:17

标签: c# git libgit2 libgit2sharp

LibGit2Sharp是否具有等效命令:
git diff-tree --patch-with-raw --cc <commit>

我可以看到哪些文件合并了或没有更改

2 个答案:

答案 0 :(得分:3)

截至2014-05-27,libgit2并未提供,我很害怕。

https://github.com/libgit2/libgit2/pull/1965具有基本逻辑,用于确定在合并期间哪些文件从原始父项更改(即,为解决合并冲突而进行的更改),但它不完整,可能需要重新设计。实际上,为合并生成一个带有差异的补丁更进一步。

答案 1 :(得分:0)

到目前为止,仍然没有内置支持。但是您可以通过获取合并的提交与其父提交之间的差异来手动实现。

以下函数返回两次提交之间的更改。您必须通过提交的树。

private IEnumerable<TreeEntryChanges> GetDiffOfTrees(LibGit2Sharp.Repository repo, Tree oldTree,Tree newTree, CompareOptions compareOptions)
{
    foreach (TreeEntryChanges change in repo.Diff.Compare<TreeChanges>(oldTree, newTree, compareOptions))
    {
        var changeStatus = change.Status;

        if (changeStatus == ChangeKind.Unmodified)
        {
            continue;
        }

        yield return change;

    }
}

然后下面的函数计算提交与每个父对象之间的差异,并返回两个差异之间共有的那些更改。这些更改是在合并过程中引入的。

private IEnumerable<TreeEntryChanges> GetDiffOfMergedTrees(Repository gitRepo, IEnumerable<LibGit2Sharp.Commit> parents, Tree tree, CompareOptions compareOptions)
{
        var firstParent = parents.ElementAt(0);
        var secondParent = parents.ElementAt(1);

        var firstChanges = GetDiffOfTrees(gitRepo, firstParent.Tree, tree, compareOptions);
        var secondChanges = GetDiffOfTrees(gitRepo, secondParent.Tree, tree, compareOptions);

        var changes = firstChanges.Where(c1 => secondChanges.Any(c2 => c2.Oid == c1.Oid));

        return changes;
}

因此,要获取差异,只需调用 GetDiffOfMergedTrees 方法。