Jak stwierdzić, do którego zatwierdzenia wskazuje znacznik w Git?

410

Mam kilka niezanotowanych znaczników w repozytorium i chcę się dowiedzieć, do których zatwierdzeń wskazują. Czy istnieje polecenie, które wyświetli tylko tagi i ich zatwierdzenia SHA? Sprawdzanie tagu i patrzenie na HEAD wydaje mi się trochę zbyt pracochłonne.

Aktualizacja

Po przejrzeniu odpowiedzi zdałem sobie sprawę, że tak naprawdę chciałem po prostu spojrzeć na historię prowadzącą do tagu, co git log <tagname>jest wystarczające.

Odpowiedź oznaczona jako odpowiedź jest przydatna do uzyskania listy tagów i ich zatwierdzeń, o co prosiłem. Przy odrobinie włamań do powłoki jestem pewien, że można je przekształcić w komunikat SHA + Commit.

Igor Zevaka
źródło
3
Chcę wskazać, że git show-refpokazuje sha tagu, a nie sha wersji repo. $ Git show-ref Test 08b9c774ab20e5bdb638339cf4ea2c124b0dae54 bibl / tagów / test $ git checkout HEAD Test jest teraz w c7f8831 ... $ git checkout 08b9c77 HEAD jest teraz w c7f8831 ...
Konstantin Pelepelin
jeśli twoje tagi są opatrzone adnotacjami, potrzebujesz--dereference
Trevor Boyd Smith

Odpowiedzi:

347

Jednym ze sposobów na to byłoby git rev-list. Następujące dane wyjściowe zatwierdzą, do którego wskazuje znacznik:

$ git rev-list -n 1 $TAG

Możesz dodać go jako alias, ~/.gitconfigjeśli często go używasz:

[alias]
  tagcommit = rev-list -n 1

A potem nazwij to:

$ git tagcommit $TAG
mipadi
źródło
30
Dlaczego nie użyć git rev-parse <tag>? Czy git rev-list -1 <tag>?
Jakub Narębski,
51
@ Jakub: git rev-parse $TAGzwraca SHA1 obiektu znacznika, a nie zatwierdzenie, na które wskazuje. git rev-list -1działa jednak.
mipadi
11
@mipadi: W przypadku tagów bez adnotacji nie ma to znaczenia; dla tagów z adnotacjami możesz użyć git rev-parse $TAG^{commit}lub git rev-parse $TAG^{}aby odrejestrować tag z adnotacjami / podpisami
Jakub Narębski
5
Możesz użyć:git rev-list $TAG --max-count=1
b73
4
@RobinHsu: jeśli masz tagi z adnotacjami , które są tworzone przy pomocy git tag -alub git tag -s, wtedy git rev-parse <tag>dałby ci SHA-1 samego obiektu znacznika , podczas gdy git rev-list -1 <tag>dałby SHA-1 zatwierdzenia (rewizji), na który wskazuje, tak samo jak git rev-parse <tag>^{commit}. HTH.
Jakub Narębski
240
git show-ref --tags

Na przykład git show-ref --abbrev=7 --tagspokaże ci coś takiego:

f727215 refs/tags/v2.16.0
56072ac refs/tags/v2.17.0
b670805 refs/tags/v2.17.1
250ed01 refs/tags/v2.17.2
CB Bailey
źródło
Dzięki za to, faktycznie ukrywa semantykę patrząc na obu .git/packed-refslub.git/refs/tags/*
Igor Zevaka
3
hmmm. ma dziwne zachowanie w moim repozytorium: git tag -a v0.1.1-alpha a9dcc1f24cacde535523bddc22f4c69467428550; git show-ref --tags -> b784145a9a71478337f5ceae30aaac4e1b955ee5 refs / tags / v0.1.1-alpha; patrz odpowiedź Jakuba Narebskiego
NickSoft,
6
to działa, choć zastanawiam się, czy nie miałoby sensu git tag --verboseich też pokazywać?
nonpolarity
34
To pokaże ref samego tagu, a nie zatwierdzenie, do którego wskazuje tag. Musisz dodać -dflagę, aby uzyskać odwołanie do zatwierdzenia (w drugim wierszu).
Old Pro
4
@CharlesBailey, dość sprawiedliwe, ale pytanie i odpowiedzi przekształciły się, aby zawierać tagi z adnotacjami, a fakt, że git show-refzachowują się inaczej w przypadku dwóch różnych typów tagów, nie jest oczywisty ani powszechny.
Old Pro
104

Po prostu użyj git show <tag>

Jednak zrzuca także zatwierdzenia różnic. Aby pominąć te różnice, użyj git log -1 <tag>. (Dzięki @DolphinDream i @demisx!)

Hlung
źródło
7
Na SO, gdy pytanie ma wiele różnych możliwych odpowiedzi, odpowiedzi, które są publikowane jako pierwsze, są oceniane jako pierwsze - umieszczając je na górze listy, a tym samym zdobywając więcej głosów pozytywnych później. Jest to pętla zwrotna odchylająca oparta na szybkości odpowiedzi w stosunku do jakości odpowiedzi. Przy wystarczającej wyobraźni problem ten można rozwiązać.
samthebest
6
„Najlepsze rozwiązanie” na co? Jeśli zależy Ci na znalezieniu SHA zatwierdzenia, znacznik wskazuje na „git show <mytag>” NIE jest najlepszym rozwiązaniem. To polecenie pokaże całą różnicę wprowadzoną przez zatwierdzenie. W przypadku wyświetlania tylko SHA zatwierdzenia znacznik wskazuje na „git rev-list <mytag> -n 1” jest poprawnym rozwiązaniem.
DolphinDream
To nie jest odpowiedź na pytanie PO. git show <tag>pokazuje różnicę, a nie zatwierdzenie, do którego wskazuje znacznik.
demisx
@demisx O czym ty mówisz ?? Na pewno pokazuje skrót zatwierdzenia, wraz z taggerem, datą i innymi informacjami. Spróbuj.
Hlung 23.04.16
4
@Hlung Jak zauważył @DolphinDream, git showzrzuca o wiele więcej rzeczy na ekranie, które nie muszą tam być. Ukrywa rzeczywistą wartość skrótu, której szuka. Lepszym poleceniem jest git log -1 [tag-name]lub git log -1 --pretty=oneline [tag-name]jeśli chcesz onelinerów.
demisx,
40

W moim repozytorium git show-ref TAGpokazuje hash znacznika, a nie skrót zatwierdzenia, na który wskazuje.

git show-ref --dereference TAG pokazuje dodatkowo wskazanie zatwierdzenia.

orip
źródło
34

Od Igora Zevaki :

Podsumowanie

Ponieważ istnieje około 4 prawie równie akceptowalnych, ale różnych odpowiedzi, podsumuję wszystkie różne sposoby skórowania tagu.

  1. git rev-list -1 $TAG( odpowiedź ). git rev-listwyprowadza zatwierdzenia, które prowadzą do $TAGpodobnego, git logale pokazującego tylko SHA1 zatwierdzenia. -1Ogranicza moc do popełnienia na to wskazuje.

  2. git show-ref --tags( odpowiedź ) pokaże wszystkie tagi (lokalne i pobrane ze zdalnego) oraz ich SHA1.

  3. git show-ref $TAG( odpowiedź ) pokaże tag i jego ścieżkę wraz z SHA1.

  4. git rev-parse $TAG( odpowiedź ) pokaże SHA1 niezanotowanego tagu.

  5. git rev-parse --verify $TAG^{commit}( odpowiedź ) pokaże SHA1 zarówno z adnotacjami, jak i bez adnotacji. W systemie Windows git rev-parse --verify %TAG%^^^^{commit}(cztery czapki).

  6. cat .git/refs/tags/*lub cat .git/packed-refs( odpowiedź ) w zależności od tego, czy tag jest lokalny, czy pobrany ze zdalnego.

456814
źródło
33

Posługiwać się

git rev-parse --verify <tag>^{commit}

(co zwróci SHA-1 zatwierdzenia nawet dla tagu z adnotacjami).


git show-ref <tag>działałby również, jeśli <tag>nie ma adnotacji. I zawsze tak jest git for-each-ref(szczegóły w dokumentacji).

Jakub Narębski
źródło
11
Wolę, git rev-parse <tag>~0który również wydaje się działać i nie wymaga specjalnego ucieczki w systemie Windows (na którym zamiast jednego potrzebne są cztery czapki (^)). Sufiks ~<number>podaje <numer>-ty zatwierdzenie nadrzędne, dlatego ~0zwraca sam zatwierdzenie. Btw, ^0jest także ważnym skrótem dla ^{commit}sufiksu wersji.
Attila,
15

Co powiesz na to:

git log -1 $TAGNAME

LUB

git log -1 origin/$TAGNAME
Tuong Le
źródło
10

Aby uzyskać sha / hash zatwierdzenia, do którego odnosi się znacznik (nie sha znacznika):

git rev-list -1 <tag>

Daniel Little
źródło
8

Chciałbym również znać „właściwą” drogę, ale w międzyczasie możesz to zrobić:

git show mytag | head -1    
gahooa
źródło
Z zatwierdzonym tytułemgit show --oneline mytag | head -1
Stphane
7

Mimo że jest to dość stare, pomyślałem, że zwrócę uwagę na fajną funkcję, którą właśnie znalazłem dla listowania tagów z zatwierdzeniami:

git log --decorate=full

Wyświetli gałęzie, które kończą się / rozpoczynają od zatwierdzenia, oraz tagi dla zatwierdzeń.

Terrence Reilly
źródło
4

Równie dobrze można uzyskać łatwiejszy do zinterpretowania obraz tego, do czego wskazują tagi

git log --graph |git name-rev --stdin --tags |less

a następnie przewiń do znacznika, którego szukasz /.

Bardziej kompaktowy widok ( --pretty=oneline) plus wszystkie głowice ( -a) również mogą pomóc:

git log -a --pretty=oneline --graph |git name-rev --stdin --tags |less

Wygląda nieco przerażająco, ale w ~/.gitconfigrazie potrzeby można go także zmienić na inny .

~/.gitconfig

[alias]
ls-tags = !git log -a --pretty=oneline --graph |git name-rev --stdin --tags |less
Antony Hatchkins
źródło
4

Krótka odpowiedź po Git-2

Wiem, że to pytanie jest tutaj już od dłuższego czasu. A odpowiedź CB Bailey jest w 100% poprawna:git show-ref --tags --abbrev

Ten bardziej mi się podoba, ponieważ wykorzystuje git tag:

git tag --list --format '%(refname:short) %(objectname:short)'

Prosty. Krótki.

PS pseudonim jak w git taglistprzypadku tego polecenia:

git config --global alias.taglist "tag --list --format '%(refname:short) %(objectname:short)'"
Jesper Rønn-Jensen
źródło
3

Z listy mailingowej git , oto sposób na uzyskanie listy skrótów zatwierdzania dla tagów z automatycznym usuwaniem odniesień dla tagów z adnotacjami:

git for-each-ref --format='%(if)%(*objectname)%(then)%(*objectname)%(else)%(objectname)%(end) %(refname)' refs/tags
anatoly techtonik
źródło
2

To nie pokazuje nazw plików, ale przynajmniej czujesz się jak w repozytorium.

cat .git/refs/tags/*

Każdy plik w tym katalogu zawiera zatwierdzenie SHA wskazujące na zatwierdzenie.

Peter Stuifzand
źródło
To nie zadziałało, ponieważ, jak sądzę, ściągnąłem tagi ze zdalnego. .git/packed-refsdziałał jednak.
Igor Zevaka,
2

Chciałbym również znać właściwą drogę , ale zawsze możesz zajrzeć do:

$ cat .git/packed-refs 

lub:

$ cat .git/refs/tags/*
miku
źródło
Racja, więc zachowanie dla spakowanych referencji i refs / tagów jest nieco inne, spakowane refsy to plik tekstowy zawierający tagi i SHA, podczas gdy refs / tags / jest katalogiem z plikami tekstowymi nazwanymi po tagach zawierających SHA. Właściwie uważam, że jest to właściwy sposób git rev-list.
Igor Zevaka,
2

Otrzymasz bieżący skrót SHA1

Skrót Commit Hash

git show <tag> --format="%h" --> 42e646e

Zatwierdź skrót

git show <tag> --format="%H" --> 42e646ea3483e156c58cf68925545fffaf4fb280
Louis
źródło
1
wydaje się nie działać w wersji, którą mam, ale git log <tag> -n 1 --pretty=%Hdziała
Andy,
2

Jeśli chcesz zobaczyć szczegóły znacznika SOMETAG (tagger, date itp.), Skrót mieszania, na który wskazuje i trochę informacji o zatwierdzeniu, ale bez pełnego różnicowania, spróbuj

git show --name-status SOMETAG

Przykładowe dane wyjściowe:

tag SOMETAG
Tagger: ....
Date:   Thu Jan 26 17:40:53 2017 +0100

 .... tag message .......

commit 9f00ce27c924c7e972e96be7392918b826a3fad9
Author: .............
Date:   Thu Jan 26 17:38:35 2017 +0100

 .... commit message .......

..... list of changed files with their change-status (like git log --name-status) .....
Avy Sharell
źródło
0

Mam więc mnóstwo folderów wydań, w których foldery te można wyewidencjonować z jednego z kilku różnych repozytoriów i mogą to być gałęzie deweloperskie, qa lub master, albo wydania produkcyjne, wyewidencjonowane ze znacznika, a znacznik może być z adnotacjami czy nie. Mam skrypt, który spojrzy na folder docelowy i otrzyma odpowiedź w formie -. Problem polega na tym, że różne wersje programu git zwracają inny status dla kasy.

Więc znalazłem git show-ref --tagsdziałał na początku, z wyjątkiem tagów z adnotacjami. Jednak dodanie -d dodało osobny wpis do listy znaczników, jeden dla znacznika, drugi dla adnotacji (zatwierdzenie adnotacji zostało zidentyfikowane jako ^ {}, które usunąłem z sed).

To jest rdzeń mojego skryptu dla każdego, kto tego chce:

REPO=`git --git-dir=${TARGET} remote show origin -n | \
         grep "Fetch URL:" | \
         sed -E "s/^.*\/(.*)$/\1/" | \
         sed "s/.git$//"`

TAG=`git --git-dir=${TARGET} show-ref -d --tags | \
         grep \`git --git-dir=${TARGET} show --quiet --format=format:%H HEAD\` | \
         cut -d\  -f2 | \
         cut -d/ -f3 | \
         sed "s/\^{}$//"`

if [ "${TAG}" == "" ] ; then 
  BRANCH=`git --git-dir=${TARGET} show-ref --heads | \
         grep \`git --git-dir=${TARGET} show --quiet --format=format:%H HEAD\` | \
         cut -d\  -f2 | \
         cut -d/ -f3`
  TAG=${BRANCH}
fi
Sibaz
źródło
0

Można użyć poniżej, da hash zatwierdzenia
git show -s --format=%H <tag>^{commit}

Jeśli wymagany jest skrót skrótu zatwierdzenia, git show -s --format=%h <tag>^{commit}

Reddysekhar Gaduputi
źródło