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



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



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



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



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

1302   18  

18 ответов:

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

git rev-parse HEAD

или

git rev-parse --verify HEAD

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

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

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

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

еще один, используя git log:

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

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

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

$ git rev-parse HEAD
cbf1b9a1be984a9f61b79a05f23b19f66d533537

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

$ git rev-parse --short HEAD
cbf1b9a

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

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

cat .git/refs/heads/master

обновление:

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

всегда git describe Как хорошо. По умолчанию он дает вам --

john@eleanor:/dev/shm/mpd/ncmpc/pkg (master)$ git describe 
release-0.19-11-g7a68a75

Commit hash

git show -s --format=%H

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

git show -s --format=%h

клик здесь дополнительные git show примеры.

использовать git rev-list --max-count=1 HEAD

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

last_commit=$(git rev-parse HEAD)

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

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

самый лаконичный способ, который я знаю:

git show --pretty=%h 

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

--abbrev=n

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

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

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

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

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

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

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

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

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

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

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

git show-ref --head --hash head

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

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

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

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

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

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

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

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

in your home-dir in file".gitconfig " добавить следующее

[alias]
sha = rev-parse HEAD

тогда у вас будет более простая команда для запоминания:

$ git sha
59fbfdbadb43ad0b6154c982c997041e9e53b600

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

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

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

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

Comments

    Ничего не найдено.