Jak odzyskać hash dla bieżącego commita w Git?

Chciałbym zachować (na razie) możliwość łączenia zestawów zmian Gita z workitems przechowywanymi w TFS.

Napisałem już narzędzie (używając Hooka z Gita), w którym mogę wprowadzić workitemidentifiers do wiadomości zestawu zmian Gita.

Chciałbym jednak również zapisać identyfikator git commit (hash) w niestandardowym polu TFS workitem. W ten sposób mogę sprawdzić workitem w TFS i zobaczyć jakie zestawy zmian Git są powiązane z workitem.

Jak mogę łatwo pobrać hash z bieżącego commita z Git?

Author: Daniel B, 2009-06-04

18 answers

Aby zamienić dowolne rozszerzone odniesienie do obiektu w SHA - 1, Użyj po prostu git-rev-parse, na przykład

git rev-parse HEAD

Lub

git rev-parse --verify HEAD

Sidenote: If you want to turn reference (branches and tags ) w SHA-1, there is git show-ref and git for-each-ref.

 2148
Author: Jakub Narębski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-13 03:25:13

Jeśli chcesz tylko skrócony hash:

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

Ponadto, użycie %H jest innym sposobem uzyskania długiego skrótu.

 336
Author: outofculture,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-30 23:32:09

Kolejny, używając git log:

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

Jest bardzo podobny do @ outofculture, choć nieco krótszy.

 117
Author: Paul Pladijs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-21 18:48:18

Aby uzyskać pełne SHA:

$ git rev-parse HEAD
cbf1b9a1be984a9f61b79a05f23b19f66d533537

Aby uzyskać skróconą wersję:

$ git rev-parse --short HEAD
cbf1b9a
 66
Author: Alexander,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-29 20:04:03

Dla kompletności, ponieważ nikt jeszcze tego nie zasugerował. {[1] } jest plikiem, który zawiera tylko jedną linię: hash ostatniego commita na master. Więc możesz to po prostu przeczytać stamtąd.

Lub jako polecenie:

cat .git/refs/heads/master

Aktualizacja:

Zauważ, że git obsługuje teraz przechowywanie niektórych refów head w pliku pack-ref zamiast jako plik w folderze / refs / heads/. https://www.kernel.org/pub/software/scm/git/docs/git-pack-refs.html

 63
Author: Deestan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-11 09:36:26

Zawsze jest git describe również. Domyślnie daje --

john@eleanor:/dev/shm/mpd/ncmpc/pkg (master)$ git describe 
release-0.19-11-g7a68a75
 35
Author: John Tyree,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-26 10:43:43

Commit hash

git show -s --format=%H

Skrót commit hash

git show -s --format=%h

Kliknij tutaj aby uzyskać więcej git show przykładów.

 27
Author: ecwpz91,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-27 19:46:59

Użyj git rev-list --max-count=1 HEAD

 25
Author: Robert Munteanu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-04 08:48:11

Jeśli chcesz zapisać hash w zmiennej podczas skryptu, możesz użyć

last_commit=$(git rev-parse HEAD)

Lub, jeśli chcesz tylko pierwszych 10 znaków (jak github.com does)

last_commit=$(git rev-parse HEAD | cut -c1-10) 
 19
Author: Henk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-20 10:15:28

Najbardziej zwięzły sposób jaki znam:

git show --pretty=%h 

Jeśli chcesz mieć określoną liczbę cyfr hasha, możesz dodać:

--abbrev=n
 12
Author: Brian Peterson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-07 06:43:57

Jeśli chcesz super-hacky sposób, aby to zrobić:

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

Zasadniczo, git przechowuje lokalizację HEAD in .git / HEAD, w formie ref: {path from .git}. To polecenie odczytuje to, odcina "ref:" i odczytuje dowolny plik, na który wskazała.

To, oczywiście, zawiedzie w trybie odłączonej głowy, ponieważ głowa nie będzie " ref:...", ale sam hash-ale wiesz, nie sądzę, że oczekujesz tyle sprytu w swoim bash one-liners. Jeśli uważasz, że średniki nie oszukują, chociaż...

HASH="ref: HEAD"; while [[ $HASH == ref\:* ]]; do HASH="$(cat ".git/$(echo $HASH | cut -d \  -f 2)")"; done; echo $HASH
 10
Author: Fordi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-21 11:08:28

Być może chcesz pseudonim, więc nie musisz pamiętać wszystkich sprytnych szczegółów. Po wykonaniu jednej z poniższych czynności będziesz mógł po prostu wpisać:

$ git lastcommit
49c03fc679ab11534e1b4b35687b1225c365c630

Po zaakceptowanej odpowiedzi , Oto dwa sposoby, aby to skonfigurować:

1) Naucz Gita jawnego poprzez edycję globalnego config (moja oryginalna odpowiedź):

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

2) lub jeśli lubisz skrót, aby nauczyć Gita skrótu, jak ostatnio skomentował Adrien:

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

Od tej chwili użyj git lastcommit do Pokaż hash ostatniego commita.

 10
Author: miraculixx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:44

Potrzebowałem czegoś nieco innego: wyświetlenia pełnego sha1 commita, ale dopisania gwiazdki na koniec, jeśli katalog roboczy nie jest czysty. Chyba, że chciałem użyć wielu poleceń, żadna z opcji w poprzednich odpowiedziach nie działa.

Oto jedyna liner, która:
git describe --always --abbrev=0 --match "NOT A TAG" --dirty="*"
Wynik: f5366ccb21588c0d7a5f7d9fa1d3f85e9f9d1ffe*

Explanation: opisuje (używając znaczników z komentarzami) bieżący commit, ale tylko ze znacznikami zawierającymi "nie znacznik". Ponieważ znaczniki nie mogą mieć spacji, to nigdy nie pasuje znacznik i ponieważ chcemy pokazać wynik --always, Komenda powraca wyświetlając Pełny (--abbrev=0) sha1 commita i dodaje gwiazdkę, jeśli katalog roboczy to --dirty.

Jeśli nie chcesz dodawać gwiazdki, działa to tak jak wszystkie inne polecenia w poprzednich odpowiedziach:
git describe --always --abbrev=0 --match "NOT A TAG"
Wynik: f5366ccb21588c0d7a5f7d9fa1d3f85e9f9d1ffe

 5
Author: Rado,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-17 19:06:21
git show-ref --head --hash head

Jeśli jednak dążysz do prędkości, podejście wspomniane przez Deestana

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

Jest znacznie szybsza niż jakakolwiek inna metoda wymieniona tutaj do tej pory.

 4
Author: Dennis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:44

Oto jednolinijkowy w powłoce Bash używający bezpośredniego odczytu z plików git:

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

musisz uruchomić powyższe polecenie w głównym folderze git.

Ta metoda może być przydatna, gdy masz repozytorium plików, ale polecenie git nie zostało zainstalowane.

Jeśli nie działa, sprawdź w folderze .git/refs/heads Jakie masz głowice.

 4
Author: kenorb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-07 14:34:05

In your home-dir in file".gitconfig " Dodaj następujący

[alias]
sha = rev-parse HEAD

Wtedy będziesz miał łatwiejsze polecenie do zapamiętania:

$ git sha
59fbfdbadb43ad0b6154c982c997041e9e53b600
 2
Author: jo_,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-18 16:16:08

Oto inny sposób na zrobienie tego:)

git log | grep -o '\w\{8,\}' | head -n 1
 1
Author: Marcelo Lazaroni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-10 15:14:12

Oto kolejna implementacja bezpośredniego dostępu:

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

To również działa przez http, co jest przydatne dla lokalnych archiwów pakietów (wiem: Dla publicznych stron internetowych nie jest zalecane, aby .dostęp do katalogu git):

head="$(curl -s "$baseurl/.git/HEAD")"
while [ "$head" != "${head#ref: }" ]; do
  head="$(curl -s "$baseurl/.git/${head#ref: }")"
done
 0
Author: Daniel Alder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-16 15:07:23