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

问题描述 投票:0回答:2

LibGit2Sharp是否具有该命令的等效项: git diff-tree --patch-with-raw --cc <commit> 我可以看到哪些文件合并了或没有更改

c# git libgit2 libgit2sharp
2个回答
3
投票

截至2014-05-27,libgit2没有提供,我担心。

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


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方法即可。

© www.soinside.com 2019 - 2024. All rights reserved.