【问题标题】:How to get source of the same file from two different commits?如何从两个不同的提交中获取同一文件的来源?
【发布时间】:2013-10-28 02:37:25
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# git version-control libgit2sharp


    【解决方案1】:

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

    每个CommitTree 类型都公开了一个字符串索引器,允许人们通过其路径直接访问TreeEntryTreeEntry 可以是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 可能会很方便。

    更新

    我错过了 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());
        }
    }
    

    【讨论】:

    • 感谢我错过了 Blob 的演员阵容,以解决其余问题。很棒的图书馆!
    【解决方案2】:

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

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

    希望对你有帮助。

    【讨论】:

    • 这是如何回答问题的?
    猜你喜欢
    • 1970-01-01
    • 2018-11-14
    • 2017-08-19
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    • 2021-06-21
    相关资源
    最近更新 更多