如何从两个不同的提交中获取相同文件的来源?

时间:2013-10-19 07:06:23

标签: c# git version-control libgit2sharp

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

我知道有Repository.Dif.Compare这是有用的,但我只能从它获得Patch,这并没有太大帮助,因为我想实现我自己的并排比较。

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

2 个答案:

答案 0 :(得分:1)

  

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

每个CommitTree类型都会公开一个字符串索引器,允许用户通过其路径直接访问TreeEntryTreeEntry可以是Blob(即文件),另一个Tree(即目录)或GitLink(即子模块)。 / p>

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

[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可能很方便。

更新

  

我错过了对blob的演员,以便完成其余的事情

FWIW,您可以依靠 revparse expressions 直接访问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());
    }
}

答案 1 :(得分:0)

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

How to diff the same file between two different commits on the same branch?

我希望有所帮助。