如何在LibGit2Sharp中检测创建分支的提交



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

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天),并且最初的"Created from"条目现在可能会丢失

注意:截至目前,LibGit2Sharp在创建或删除分支时不会创建条目。然而,作为Pull Request#499

的一部分,令人惊叹的@dahlbyk目前正在解决这一问题

最新更新