1

我试图找出从两个不同的提交中获取同一文件的来源的方法,但我找不到任何关于此的文档。

我知道有Repository.Dif.Compare哪些是有用的,但我只能从中获取补丁,这并没有多大帮助,因为我想实现自己的并排比较。

有人可以提供一个例子吗?这在 libgit2sharp 中是否可行?

4

2 回答 2

1

我试图找出从两个不同的提交中获取相同文件源的方法[...]这在 libgit2sharp 中是否可能?

每个Commitor类型都公开了一个字符串索引器,允许人们通过其路径Tree直接访问 a 。TreeEntryATreeEntry可以是一个Blob(即一个文件)、另一个Tree(即一个目录)或一个GitLink(即一个子模块)。

下面的代码提供了一个快速示例,说明如何在两个不同的提交中访问同一文件的内容。

[Fact]
public void CanRetrieveTwoVersionsOfTheSameBlob()
{
    using (var repo = new Repository(BareTestRepoPath))
    {
        var c1 = repo.Lookup<Commit>("8496071");
        var b1 = c1["README"].Target as Blob;

        var c2 = repo.Lookup<Commit>("4a202b3");
        var b2 = c2["README"].Target as Blob;

        Assert.NotEqual(b1.ContentAsText(), b2.ContentAsText());
    }
}

我想实现自己的并排比较

根据您正在处理的 blob 的大小,您可能不愿意检索内存中的全部内容。在这种情况下,blob.ContentStream可能会派上用场。

更新

我错过了演员阵容,想弄清楚其余的

FWIW,您可以依靠revparse 表达式直接访问Blob. 结果,以下内容也应该起作用;-)

[Fact]
public void CanRetrieveTwoVersionsOfTheSameBlob_ReduxEdition()
{
    using (var repo = new Repository(BareTestRepoPath))
    {
        var b1 = repo.Lookup<Blob>("8496071:README");
        var b2 = repo.Lookup<Blob>("4a202b3:README");

        Assert.NotEqual(b1.ContentAsText(), b2.ContentAsText());
    }
}
于 2013-10-19T07:55:05.630 回答
0

这篇文章应该回答你的问题,它来自这个网站上的另一个问题:

如何在同一分支上的两个不同提交之间区分同一文件?

我希望这会有所帮助。

于 2013-10-19T07:13:25.550 回答