Как найти хеш ветки в Git?

88

Учитывая имя локальной / удаленной ветки, как я могу получить хэш фиксации, на которую указывает эта ветка?

Миша Морошко
источник

Ответы:

143

Команда git rev-parse- ваш друг, например:

$ git rev-parse development
17f2303133734f4b9a9aacfe52209e04ec11aff4

... или для ветки удаленного отслеживания:

$ git rev-parse origin/master
da1ec1472c108f52d4256049fe1f674af69e785d

Эта команда обычно очень полезна, поскольку она может анализировать любой из способов указания имен веток в git, например:

git rev-parse master~3
git rev-parse HEAD@{2.days.ago}

... так далее.

Марк Лонгэр
источник
как увидеть весь хеш фиксации локальной ветки?
Mahdi
1
@Kenji: вам, вероятно, следует создать для этого новый вопрос, но если вам просто нужны хэши каждого коммита в ветке foo, вы можете сделать:git log --pretty=format:'%H'
Марк Лонгэр
когда я бегу на следующую строку в JenkinsFile: def BranchHash = sh "git rev-parse ${BRANCH-NAME}Я получаю: fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree.. что не так?
arielma
5

Хеши хранятся .git/refs/, например,.git/refs/heads/master

Но используйте программно, git rev-parseкак предложил Марк Лонгэр, так как это безопаснее.

Марк Фишер
источник
2

Не забывайте, что начиная с Git 2.19 (второй квартал 2018 г.), Git готовит переход от хэшей SHA1 к SHA2: см. « Почему Git не использует более современный SHA? »

С Git 2.25 (первый квартал 2020 г.), git rev-parse развитие и отражение этого возможного нового хэша.

См совершать fa26d5e , совершать cf02be8 , совершают 38ee26b , совершают 37ab8eb , совершают 0370b35 , совершают 0253e12 , совершают 45e2ef2 , совершают 79b0edc , совершают 840624f , совершают 32a6707 , совершают 440bf91 , совершают 0b408ca , совершают 2eabd38 (28 окт 2019), а также совершать 1bcef51 , совершают ecde49b (5 октября 2019 г.) Брайан М. Карлсон ( bk2204) .
(Объединено Junio ​​C Hamano - gitster- в фиксации 28014c1, 10 ноя 2019)

rev-parse: добавить --show-object-formatпараметр

Подписано: brian m. Карлсон

Добавьте возможность печати формата объекта, используемого для ввода, вывода или хранения.
Это позволяет сценариям оболочки обнаруживать используемый алгоритм хеширования.

Поскольку план перехода допускает использование нескольких алгоритмов ввода, укажите, что мы можем предоставить несколько результатов для ввода, и формат, который они могут принимать.
Хотя мы не поддерживаем это сейчас, раннее документирование означает, что авторы сценариев могут подготовить свои сценарии к будущему, когда мы это сделаем.

git rev-parseДокументация теперь включает в себя:

--show-object-format[=(storage|input|output)]:

Показать формат объекта (алгоритм хеширования), используемый репозиторием для хранения внутри .gitкаталога, ввода или вывода. Для ввода можно напечатать несколько алгоритмов, разделенных пробелами. Если не указано, по умолчанию используется «хранилище».


С Git 2.29 (Q4 2020) вы можете убедиться, какой формат вы должны использовать для чтения хеш-фиксации ветки (или любого другого объекта).

См совершать e023ff0 , совершать 4feb562 , совершает 8a06d56 , совершает c49fe07 , совершает 02a32db , совершают ceaa4b3 , совершает eff45da , совершает b5b46d7 , совершает c5aecfc , совершает e74b606 , совершает 439d3a1 , совершает 6c2adf8 , совершает de5737c , совершает e0a646e , совершает 6ff6a67 , совершает 831279d , совершить b6e5005 , совершить 287bb3a , зафиксировать 22f1824 , зафиксировать db00af9 ,совершают 7187eb1 , совершают 98de0b2 , совершает a5587b8 , совершает 66b6d43 , совершает 2197f87 , совершает c0b65ea , совершает d62607d , совершает d482c23 , совершают 866be6e , совершают 4bacb6d , совершает 252a4ee , совершает 368f3cb , совершает abe3db1 , совершает 08fbc5d , совершает 11b6961 , совершает 9e3bd8a , совершает d827bce , совершить 094a685 (29 июля 2020 г.) Брайан М. Карлсон ( bk2204) .
Увидетьcommit 800e6a7(29 июля 2020 г.) Йоханнес Шинделин ( dscho) .
(Объединено Junio ​​C Hamano - gitster- в коммите e0ad957 , 11 августа 2020 г.)

docs: добавить документацию для extensions.objectFormat

Подписано: brian m. carlson Обзор
: Эрик Саншайн

Задокументируйте extensions.objectFormatнастройку конфигурации.
Предупредите пользователей, чтобы они не изменяли его самостоятельно.

git configтеперь включает в свою справочную страницу :

extensions.objectFormat

Укажите используемый алгоритм хеширования.

Допустимые значения: sha1и> sha256.
Если не указано, sha1предполагается.
Указать этот ключ, если он не core.repositoryFormatVersionравен 1, является ошибкой .

Обратите внимание, что этот параметр следует устанавливать только с помощью git initили git clone.
Попытка изменить его после инициализации не сработает и приведет к возникновению трудно диагностируемых проблем.


Для ясности: в Git 2.29 (Q4 2020) недавнее добавление поддержки SHA-256 отмечено в документации как экспериментальное .

См. Коммит ff233d8 (16 августа 2020 г.) Мартина Агрена ( none) .
(Объединено Junio ​​C Hamano - gitster- в коммите d1ff741 , 24 августа 2020 г.)

Documentation: отметить --object-format=sha256как экспериментальный

Подписано: Мартин Агрен

После eff45daab8 (" repository: включить поддержку SHA-256 по умолчанию", 2020-07-29, Git v2.29.0 - слияние указано в пакете №6 ) стандартные сборки Git позволяют пользователю запускать, например,

git init --object-format=sha256  

и взломать.
Это может быть хорошим способом получить опыт работы с миром SHA-256, например, чтобы найти ошибки, которые

GIT_TEST_DEFAULT_HASH=sha256 make test  

не замечает.

Но на самом деле это отдельный мир: такие репозитории SHA-256 будут существовать полностью отдельно от (к настоящему времени довольно большого) набора репозиториев SHA-1.
Взаимодействие через границу в принципе возможно, например, через " diff+ apply" (или " format-patch+ am"), но даже это имеет свои ограничения: применение различий SHA-256 в репозитории SHA-1 работает в простом случае, но если вы нужно прибегнуть -3, вам не повезло.

Точно так же " push+ pull" должен работать, но на самом деле вы будете работать в основном за пределами остального мира. Это может быть нормально к тому времени, когда вы инициализируете свой репозиторий, и это может быть нормально в течение нескольких месяцев после этого, но может наступить день, когда вы начнете сожалеть о своем использовании [git init --object-format = sha256 ](https://github.com/git/git/blob/ff233d8dda12657a90d378f2b403bc6c85838c59/Documentation/git-init.txt#L52)<sup>([man](https://git-scm.com/docs/git-init#Documentation/git-init.txt---object-formatltformatgt))</sup>и получите закопался в довольно глубокую яму.

В настоящее время разрабатываются темы для документирования наших форматов данных и протоколов, касающихся SHA-256, и в некоторых случаях (midx и commit-graph) мы рассматриваем возможность корректировки того, как форматы файлов указывают, какой формат объекта использовать.

Везде, где --object-formatупоминается в нашей документации, давайте проясним, что его использование с sha256 является экспериментальным.
Если позже нам понадобится объяснить, почему мы не можем обрабатывать данные, которые мы сгенерировали еще в 2020 году, мы всегда можем указать на этот абзац, который мы здесь добавляем.

Используя «include ::» - небольшую аннотацию, мы должны быть единообразны во всей документации и в конечном итоге можем постепенно снизить серьезность этого текста.
Однажды мы можем даже использовать это, чтобы начать поэтапный отказ --object-format=sha1, но не будем забегать вперед ...

Также есть extensions.objectFormat, но упоминается только три раза. Дважды, где мы добавляем новый отказ от ответственности, и в третьем месте у нас уже есть предупреждение «не редактировать». Оттуда заинтересованные читатели должны в конечном итоге найти этот новый, который мы добавляем здесь.

Поскольку GIT_DEFAULT_HASHпредоставляет еще одну точку входа в эту функциональность, задокументируйте ее экспериментальный характер.

gitтеперь включает в свою справочную страницу :

вместо этого используется. По умолчанию - «sha1». ЭТА ПЕРЕМЕННАЯ ЭКСПЕРИМЕНТАЛЬНАЯ! Смотрите --object-formatв git init.

object-format-disclaimerтеперь включает в свою справочную страницу :

ЭТО ВАРИАНТ ЭКСПЕРИМЕНТАЛЬНЫЙ!
Поддержка SHA-256 является экспериментальной и все еще находится на начальной стадии.

Репозиторий SHA-256, как правило, не может> совместно использовать> работу с "обычными" репозиториями SHA-1.
Следует предположить, что, например, внутренние форматы файлов Git по отношению к репозиториям SHA-256 могут изменяться обратно несовместимыми способами.
Используйте только --object-format=sha256для тестирования.


Тот же Git 2.29 (Q4 2020) гарантирует, что " git clone" ( man ) будет работать при клонировании из репозитория SHA-1, в то время как GIT_DEFAULT_HASHуже настроено использование SHA-256.
До версии 2.29 это приводило к созданию непригодного для использования репозитория, который наполовину претендовал на роль репозитория SHA-256 с объектами SHA-1 и ссылками.
Это было исправлено.

См. Commit 47ac970 (20 сентября 2020 г.) Брайан М. Карлсон ( bk2204) .
(Объединено Junio ​​C Hamano - gitster- в фиксации b28919c , 29 сентября 2020 г.)

builtin/clone: избежать неудач с GIT_DEFAULT_HASH

Автор сообщения: Матеус Таварес.
Подпись: brian m. Карлсон

Если пользователь клонирует репозиторий SHA-1 со GIT_DEFAULT_HASHзначением « sha256», то мы можем получить репозиторий, в котором версия формата репозитория равна 0, но extensions.objectformatключ установлен на « sha256».
Это и неправильно (у пользователя есть репозиторий SHA-1), и нефункционально (потому что расширение не может использоваться в репозитории v0).

Это происходит потому, что в клоне мы сначала настраиваем репозиторий, а затем меняем его алгоритм в зависимости от того, что удаленная сторона сообщает нам, что он использует.
В этом случае мы изначально настроили репозиторий как SHA-256, а затем сбросили версию репозитория, не очищая расширение.

В этом случае мы всегда могли бы установить расширение, но это означало бы, что наши репозитории SHA-1 несовместимы со старыми версиями Git, хотя нет никаких причин, по которым они не должны быть совместимы.
И мы также не хотим изначально инициализировать репозиторий как SHA-1, поскольку это означает, что если мы клонируем пустой репозиторий, мы не сможем выполнить GIT_DEFAULT_HASHпеременную и в итоге получим репозиторий SHA-1, а не репозиторий SHA-256.

Ни то, ни другое не является привлекательным, поэтому давайте сообщим коду инициализации репозитория, если мы выполняем повторную настройку, подобную этой, и, если да, очистим расширение, если мы используем SHA-1.
Это гарантирует, что мы создадим действительный и функциональный репозиторий и не нарушим наши другие варианты использования.

VonC
источник