Программа git rev-parse
может сделать это легко. Одна из его основных задач - превратить любое имя в Git идентификатор объекта в соответствии с правилами, изложенными в документации gitrevisions :
git rev-parse v2.12:animals/ant
дает вам желаемый идентификатор ha sh здесь.
Как сказано в документации, если вы хотите убедиться, что результирующий объект является конкретно tree объектом (и не один из других видов объектов), вы можете добавить суффикс:
git rev-parse v2.12:animals/ant^{tree}
В некоторых случаях добавление суффикса говорит git rev-parse
найти этот конкретный тип объекта. Например, имя ветви всегда разрешается в объект фиксации по умолчанию, но объект фиксации всегда имеет ассоциированное дерево верхнего уровня, поэтому:
git rev-parse master
обычно находит объект фиксации, 1 while:
git rev-parse master^{tree}
находит соответствующее дерево верхнего уровня, содержащее данные моментального снимка для коммита, найденного без суффикса с именем ветви.
1 Случаи, когда этот не не создает фиксацию ha sh ID, включают:
- , если есть no name
master
, поэтому что нет способа разрешить имя; или - , если сокращенное имя
master
разрешается в имя тега (по правилу 3, которое предшествует правилу 4, которое разрешит master
в имя ветви) и имя тега называет некоторый объект, который не является объектом фиксации.
Имена тегов, такие как v1.2
, имеют тенденцию разрешать либо тегировать объекты, либо фиксировать объекты. Следовательно, одна довольно распространенная идиома:
git rev-parse ${name}^{commit}
, чтобы найти объект фиксации, или:
git rev-parse ${name}^{}
, чтобы найти целевой объект, если нужно разрешить аннотированное имя тега разрешить в дерево или капля ха sh. (Пустые фигурные скобки, подобные этой, допускаются для объектов фиксации и не имеют никакого эффекта.)
С осторожностью используйте этот синтаксис для произвольных строк, которые могут включать, например, :/bug123
, так как добавление суффикса изменяет строку поиска. Чтобы справиться с этим делом, рассмотрите возможность использования двух git rev-parse
шагов:
hash=$(git rev-parse "$1") || exit
hash=$(git rev-parse $hash^{}) || exit