Как получить хеш для текущего коммита в Git? - PullRequest
1667 голосов
/ 04 июня 2009

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

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

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

Как мне легко получить хеш из текущего коммита из Git?

Ответы [ 19 ]

12 голосов
/ 09 октября 2015

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

$ 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, чтобы отобразить хэш последнего коммита.

11 голосов
/ 14 октября 2015

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

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

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

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

HASH="ref: HEAD"; while [[ $HASH == ref\:* ]]; do HASH="$(cat ".git/$(echo $HASH | cut -d \  -f 2)")"; done; echo $HASH
8 голосов
/ 17 февраля 2018

Мне нужно было что-то немного другое: отобразить полный 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

6 голосов
/ 30 апреля 2015
git show-ref --head --hash head

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

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

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

5 голосов
/ 06 октября 2017

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

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

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

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

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

2 голосов
/ 18 февраля 2016

в вашем домашнем каталоге в файле ".gitconfig" добавьте следующее

[alias]
sha = rev-parse HEAD

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

$ git sha
59fbfdbadb43ad0b6154c982c997041e9e53b600
1 голос
/ 10 февраля 2017

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

git log | grep -o '\w\{8,\}' | head -n 1
0 голосов
/ 31 января 2019

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

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

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

  4. Нажмите Enter.
0 голосов
/ 04 ноября 2016

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...