Как получить хеш для текущей фиксации в 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
Вот шаги, которые помогли мне, используя хэш коммита:
- Войдите в свою ссылку на GIT HUB, например:
https://github.<xyz.abc>.com
-
После входа в систему в текстовом поле "Искать или перейти к..." введите как:
hash:<GIT COMMIT HASH>
-
Выберите между "Все GitHub Enterprise" или "В этой организации" в зависимости от ваших потребностей
- Нажмите 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