Как получить хеш для текущей фиксации в Git?

Я хотел бы сохранить (на данный момент) возможность связывать Git набор изменений с рабочими элементами, хранящимися в TFS.

Я уже написал инструмент (используя hook из Git), в котором я могу вставлять workitemidentifiers в сообщение набора изменений Git.

Однако я также хотел бы сохранить идентификатор фиксации Git (хеш) в пользовательском поле рабочего места TFS. Таким образом, я могу проверить работу в TFS и посмотреть, что Git changeets связаны с рабочим элементом.

Как я могу легко получить хэш из текущего фиксации из Git?

Ответ 1

Чтобы превратить произвольную ссылку на расширенный объект в SHA-1, используйте просто git-rev-parse, например

git rev-parse HEAD

или

git rev-parse --verify HEAD

Sidenote: Если вы хотите повернуть ссылки (ветки и теги) в SHA-1, есть git show-ref и git for-each-ref.

Ответ 2

Если вам нужен только сокращенный хеш:

git log --pretty=format:'%h' -n 1

Кроме того, использование% H - это еще один способ получить длинный хэш.

Ответ 3

Другой, используя git log:

git log -1 --format="%H"

Он очень похож на @outofculture, хотя немного короче.

Ответ 4

Чтобы получить полный SHA:

$ git rev-parse HEAD
cbf1b9a1be984a9f61b79a05f23b19f66d533537

Чтобы получить сокращенную версию:

$ git rev-parse --short HEAD
cbf1b9a

Ответ 5

Для полноты, поскольку никто еще не предложил ее. .git/refs/heads/master - это файл, содержащий только одну строку: хэш последней фиксации на master. Поэтому вы можете просто прочитать его оттуда.

Или, как команда:

cat .git/refs/heads/master

Update:

Обратите внимание, что git теперь поддерживает сохранение некоторых head ref в файле pack-ref вместо файла в папке /refs/heads/. https://www.kernel.org/pub/software/scm/git/docs/git-pack-refs.html

Ответ 6

Там всегда git describe а также. По умолчанию это дает вам -

[email protected]:/dev/shm/mpd/ncmpc/pkg (master)$ git describe --always
release-0.19-11-g7a68a75

Ответ 7

Фиксировать хеш

git show -s --format=%H

Сокращенный хеш фиксации

git show -s --format=%H

Нажмите здесь для более git show примеров.

Ответ 8

Используйте git rev-list --max-count=1 HEAD

Ответ 9

Если вам нужно сохранить хэш в переменной во время script, вы можете использовать

last_commit=$(git rev-parse HEAD)

Или, если вам нужны только первые 10 символов (например, github.com)

last_commit=$(git rev-parse HEAD | cut -c1-10) 

Ответ 10

Самый сжатый способ, который я знаю:

git show --pretty=%h 

Если вы хотите указать определенное количество цифр хэша, вы можете добавить:

--abbrev=n

Ответ 11

Возможно, вам нужен псевдоним, поэтому вам не нужно запоминать все детали. После выполнения одного из следующих шагов вы сможете просто ввести:

$ git lastcommit
49c03fc679ab11534e1b4b35687b1225c365c630

Следуя принятому ответу , вот два способа установить это:

1) Научите git явным образом, отредактировав глобальную конфигурацию (мой оригинальный ответ):

 # open the git config editor
 $ git config --global --edit
 # in the alias section, add
 ...
 [alias]
   lastcommit = rev-parse HEAD
 ...

2) Или, если вам нравится ярлык, чтобы научить git ярлыку, как недавно прокомментировал Адриен:

$ git config --global alias.lastcommit "rev-parse HEAD"

В этом случае используйте git lastcommit, чтобы показать последний хэш-код фиксации.

Ответ 12

Если вам нужен супер-хакерский способ сделать это:

cat .git/`cat .git/HEAD | cut -d \  -f 2`

В основном, git хранит расположение HEAD в .git/HEAD в форме ref: {path from .git}. Эта команда считывает это, вырезает "ref:" и считывает любой файл, на который он указал.

Это, конечно, не удастся в режиме отсоединенной головы, поскольку HEAD не будет "ref:...", но сам хеш - но вы знаете, я не думаю, что вы ожидаете, что много умений в ваш bash однострочный. Если вы не думаете, что точки с запятой обманывают, хотя...

HASH="ref: HEAD"; while [[ $HASH == ref\:* ]]; do HASH="$(cat ".git/$(echo $HASH | cut -d \  -f 2)")"; done; echo $HASH

Ответ 13

Мне нужно было что-то немного другое: отобразите полный sha1 коммита, но добавьте звездочку в конец, если рабочий каталог не чист. Если я не хотел использовать несколько команд, ни один из вариантов предыдущих ответов не работает.

Вот один лайнер, который делает:
git describe --always --abbrev=0 --match "NOT A TAG" --dirty="*"
Результат: f5366ccb21588c0d7a5f7d9fa1d3f85e9f9d1ffe*

Объяснение: описывает (используя аннотированные теги) текущую фиксацию, но только с тегами, содержащими "NOT A TAG". Поскольку теги не могут иметь пробелы, это никогда не совпадает с тегом, и поскольку мы хотим показать результат --always, команда возвращается с отображением полного (--abbrev=0) sha1 коммита и добавляет звездочку, если рабочий каталог --dirty.

Если вы не хотите добавлять звездочку, это работает, как и все остальные команды в предыдущих ответах:
git describe --always --abbrev=0 --match "NOT A TAG"
Результат: f5366ccb21588c0d7a5f7d9fa1d3f85e9f9d1ffe

Ответ 14

git show-ref --head --hash head

Если вы собираетесь использовать скорость, подход, упомянутый Deestan

cat .git/refs/heads/<branch-name>

значительно быстрее, чем любой другой метод, указанный здесь до сих пор.

Ответ 15

Вот однострочный шрифт в оболочке Bash, используя прямое чтение из git файлов:

(head=($(<.git/HEAD)); cat .git/${head[1]})

Вам нужно выполнить команду выше в вашей корневой папке git.

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

Если это не сработает, .git/refs/heads папку .git/refs/heads какие главы у вас есть.

Ответ 16

в файле home-dir в файле .gitconfig добавьте следующее

[alias]
sha = rev-parse HEAD

тогда вам будет легче запомнить:

$ git sha
59fbfdbadb43ad0b6154c982c997041e9e53b600

Ответ 17

Вот еще один способ сделать это с помощью:)

git log | grep -o '\w\{8,\}' | head -n 1

Ответ 18

Вот шаги, которые помогли мне, используя хэш коммита:

  1. Войдите в свою ссылку на GIT HUB, например: https://github.<xyz.abc>.com
  2. После входа в систему в текстовом поле "Искать или перейти к..." введите как:

    hash:<GIT COMMIT HASH>
    
  3. Выберите между "Все GitHub Enterprise" или "В этой организации" в зависимости от ваших потребностей

  4. Нажмите Enter.

Ответ 19

Вот еще одна реализация прямого доступа:

head="$(cat ".git/HEAD")"
while [ "$head" != "${head#ref: }" ]; do
  head="$(cat ".git/${head#ref: }")"
done

Это также работает над http, который полезен для локальных архивов пакетов (я знаю: для общедоступных веб-сайтов не рекомендуется делать доступным каталог .git):

head="$(curl -s "$baseurl/.git/HEAD")"
while [ "$head" != "${head#ref: }" ]; do
  head="$(curl -s "$baseurl/.git/${head#ref: }")"
done