3

では、LibGit2Sharp のインスタンスが与えられた場合、Branchどのコミットから最初に作成されたのかをどのように判断するのでしょうか?

4

1 に答える 1

4

Aは、git参照Branchを表す単なるオブジェクトです。headAheadはテキスト ファイルで、ほとんどが.git/refs/heads階層の下にあります。このテキスト ファイルには、現在指しているcommitthisのハッシュが含まれています。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によって取り組まれています。

于 2013-08-29T07:57:00.737 に答える