Как получить хэш для текущей фиксации в Git?
Я хотел бы сохранить (на данный момент) возможность связывать наборы изменений Git с рабочими элементами, хранящимися в TFS.
Я уже написал инструмент (используя крюк от Git), в котором я могу ввести workitemidentifiers в сообщение набора изменений Git.
однако я также хотел бы сохранить идентификатор фиксации Git (хэш) в пользовательском поле TFS workitem. Таким образом, я могу изучить workitem в TFS и посмотреть, какие наборы изменений Git связаны с рабочий объект.
Как я могу легко получить хэш из текущей фиксации от Git?
18 ответов:
чтобы превратить произвольную расширенную ссылку на объект в SHA-1, Используйте просто git-rev-parse, например
git rev-parse HEADили
git rev-parse --verify HEADSidenote: если вы хотите превратить ссылки (отделения и теги) в ша-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примеры.
Если вам нужно сохранить хэш в переменной во время скрипта, вы можете использовать
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
вот еще одна реализация прямого доступа:
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