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?
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
.
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.
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.
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
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
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
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.
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
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)
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
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
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.
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
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.
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.
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
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
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
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