では、LibGit2Sharp のインスタンスが与えられた場合、Branch
どのコミットから最初に作成されたのかをどのように判断するのでしょうか?
1 に答える
Aは、git参照Branch
を表す単なるオブジェクトです。head
Ahead
はテキスト ファイルで、ほとんどが.git/refs/heads
階層の下にあります。このテキスト ファイルには、現在指しているcommit
thisのハッシュが含まれています。head
同様に、 aBranch
は、Tip
を指すプロパティを持ち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 には、あなたが求めているものが含まれている可能性があります ;-)
しかし...
- 各メッセージ内で「branch: Created from」パターンを検索して、自分で正しいエントリを見つける必要があります。
- ブランチが古すぎる場合、組み込みのgit gcハウスキーピング プロセスによって reflog 内の古いエントリが削除された可能性があり (デフォルトでは、reflog エントリは 90 日間保持されます)、最初の「作成元」エントリが失われる可能性があります。
注:現在、LibGit2Sharp は、ブランチを作成または削除するときにエントリを作成しません。ただし、これは現在、プルリクエスト #499の一部として素晴らしい@dahlbykによって取り組まれています。