Как определить, из какого коммита была создана ветка в LibGit2Sharp

Итак, учитывая экземпляр LibGit2Sharp Branch, как определить, из какого коммита он был первоначально создан?


person Simon    schedule 29.08.2013    source источник


Ответы (1)


Branch — это просто объект, изображающий ссылку git head. head — это текстовый файл, в основном расположенный в иерархии .git/refs/heads. Этот текстовый файл содержит хэш commit, на который в данный момент указывает этот head. Точно так же Branch имеет свойство Tip, которое указывает на Commit.

При работе с репозиториями 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 также предоставляет журнал ссылок. Например, следующий код будет перечислять записи журнала для определенного 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);
}

Так что "хорошие новости", рефлог может содержать то, что вам нужно ;-)

но...

  • вам придется найти правильную запись самостоятельно, выполнив поиск в каждом сообщении по шаблону "филиал: Создано из"
  • Если ваша ветка слишком старая, старые записи в журнале ссылок могли быть удалены встроенной функцией процесс очистки git gc (по умолчанию записи журнала ссылок хранятся в течение 90 дней), и начальная запись "Создано из" теперь может быть утеряна.

Примечание. На сегодняшний день LibGit2Sharp не создает запись при создании или удалении ветки. Однако в настоящее время этим занимается замечательный @dahlbyk в рамках Запрос на извлечение № 499

person nulltoken    schedule 29.08.2013
comment
У меня была та же проблема, что и у OP, и я следовал вашим рекомендациям, однако я заметил, что в моем репо журнал ссылок ветки останавливается в точке, где была создана ветка (например, она не показывала историю ранее), и она будет иметь «От ' значение 0. Я что-то здесь упустил? Кажется, это гораздо более чистый способ определить начало жизни ветки, а не искать отдельные тексты коммитов. - person Simon Ejsing; 19.04.2016