【问题标题】:How to detect what commit a branch has been created from in LibGit2Sharp如何检测在 LibGit2Sharp 中创建了哪个提交
【发布时间】:2013-08-29 05:51:06
【问题描述】:

那么给定一个 LibGit2Sharp Branch 的实例,你如何计算出它最初是从哪个提交创建的?

【问题讨论】:

    标签: git libgit2 libgit2sharp


    【解决方案1】:

    Branch 只是一个描述 git head 引用的对象。 head 是一个文本文件,主要位于 .git/refs/heads 层次结构下。此文本文件包含此 head 当前指向的 commit 的哈希值。同样,Branch 带有一个指向 CommitTip 属性。

    在使用 git 存储库并执行诸如提交、重置、变基等操作时...head 文件使用不同的哈希值进行更新,指向不同的提交。

    head 不跟踪先前指向的提交。 Branch 也没有。

    使用 git,在创建新分支时,会创建一个新的 reflog。 Git 负责添加第一个条目,其中包含一条消息,用于标识创建分支的对象。

    给定一个现有的分支backup

    $ cat .git/refs/heads/backup
    7dec18258252769d99a4ec9c82225e47d58f958c
    

    创建一个新分支将创建并提供它的 reflog

    $ git branch new_branch_from_branch backup
    
    $ git reflog new_branch_from_branch
    7dec182 new_branch_from_branch@{0}: branch: Created from backup
    

    当然,这也适用于直接从提交创建分支时

    $ git branch new_branch_from_sha 191adce
    
    $ git reflog new_branch_from_sha
    191adce new_branch_from_sha@{0}: branch: Created from 191adce
    

    LibGit2Sharp 也公开了 reflog。例如,以下代码将枚举特定 Branch 的日志条目。

    var branch = repository.Head; // or repository.Branches["my_branch"]...
    
    foreach (ReflogEntry e in repository.Refs.Log(branch.CanonicalName))
    {
        Console.WriteLine("{0} - {1} : {2}",
            e.From.ToString(7), e.To.ToString(7), e.Message);
    }
    

    所以“好消息”,reflog 可能包含您所追求的内容 ;-)

    但是……

    • 您必须自己找出正确的条目,方法是在每条消息中搜索 “branch: Created from” 模式
    • 如果您的分支太旧,则 reflog 中较旧的条目可能已被内置的 git gc 内务处理过程删除(默认情况下,reflog 条目保留 90 天)和初始“创建自”条目现在可能会丢失

    注意:截至今天,LibGit2Sharp 在创建或删除分支时不会创建条目。然而,目前这个问题已经被令人惊叹的 @dahlbyk 作为 Pull Request #499

    的一部分解决了

    【讨论】:

    • 我遇到了与 OP 相同的问题并遵循了您的指导方针,但是我注意到在我的 repo 中,分支 reflog 停止在创建分支的位置(例如,它没有显示之前的历史记录) 并且它的“从”值为 0。我在这里遗漏了什么吗?这似乎是一种更简洁的方法来检测分支生命的开始,而不是搜索单个提交文本。
    猜你喜欢
    • 2012-10-02
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    • 2013-10-03
    • 1970-01-01
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多