【发布时间】:2013-08-29 05:51:06
【问题描述】:
那么给定一个 LibGit2Sharp Branch 的实例,你如何计算出它最初是从哪个提交创建的?
【问题讨论】:
标签: git libgit2 libgit2sharp
那么给定一个 LibGit2Sharp Branch 的实例,你如何计算出它最初是从哪个提交创建的?
【问题讨论】:
标签: git libgit2 libgit2sharp
Branch 只是一个描述 git head 引用的对象。 head 是一个文本文件,主要位于 .git/refs/heads 层次结构下。此文本文件包含此 head 当前指向的 commit 的哈希值。同样,Branch 带有一个指向 Commit 的 Tip 属性。
在使用 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 可能包含您所追求的内容 ;-)
但是……
注意:截至今天,LibGit2Sharp 在创建或删除分支时不会创建条目。然而,目前这个问题已经被令人惊叹的 @dahlbyk 作为 Pull Request #499
的一部分解决了【讨论】: