3

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

4

1 回答 1

4

ABranch只是一个描述 githead引用的对象。A是一个文本文件,主要位于层次结构head之下。.git/refs/heads此文本文件包含committhishead当前指向的哈希值。同样, aBranch具有Tip指向 a 的属性Commit

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

Ahead不跟踪先前指向的提交。也没有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 可能包含你所追求的 ;-)

但...

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

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

于 2013-08-29T07:57:00.737 回答