那么给定一个 LibGit2Sharp 的实例,你Branch
如何计算出它最初是从哪个提交创建的?
问问题
747 次
1 回答
4
ABranch
只是一个描述 githead
引用的对象。A是一个文本文件,主要位于层次结构head
之下。.git/refs/heads
此文本文件包含commit
thishead
当前指向的哈希值。同样, 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 回答