Итак, учитывая экземпляр LibGit2Sharp Branch
, как определить, из какого коммита он был первоначально создан?
Как определить, из какого коммита была создана ветка в LibGit2Sharp
Ответы (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