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

时间:2013-08-29 05:51:07

标签: git libgit2 libgit2sharp

所以给定一个LibGit2Sharp Branch的实例,你如何计算最初创建它的提交?

1 个答案:

答案 0 :(得分:4)

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

使用git存储库并执行提交,重置,重新定位等操作时,head文件会使用不同的哈希值进行更新,指向不同的提交。

head不保留以前指向的提交。 Branch

也不是。{1}}。

使用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可能包含你所追求的东西; - )

但是...

  • 您必须通过在每条消息中搜索“分支:从模式中创建
  • 来自行找出正确的条目
  • 如果您的分支太旧,则内置的 git gc 内务处理过程可能已删除了旧日志中的旧条目(默认情况下,reflog条目会保留90天)最初的“Created From”条目现在可能会丢失

注意:截至今天,LibGit2Sharp在创建或删除分支时不会创建条目。但是,目前这是由 @dahlbyk

中的 Pull Request #499 来解决的。