2010-03-04 12 views
40

Jak mogę wymienić tagów zawartych przez dany oddział, przeciwieństwo:lista tagów zawartych przez oddział

git tag --contains <commit> 

Które „tylko lista tagów, które zawierają określony popełnić”.

Jeśli coś takiego nie istnieje, w jaki sposób mogę sprawdzić, czy zatwierdzenie jest zawarte w innym zatwierdzeniu, aby można je było skryptować?

mogę to zrobić:

commit=$(git rev-parse $branch) 
for tag in $(git tag) 
do 
    git log --pretty=%H $tag | grep -q -E "^$commit$" 
done 

Ale mam nadzieję, że istnieje lepszy sposób, jak to może trwać długo w repozytorium z wielu tagów i zobowiązuje.

+0

Zobacz [odpowiedź na ten duplikat postu] (http://stackoverflow.com/a/10603278/11343) dla innego dobrego sposobu na zrobienie tego. – CharlesB

Odpowiedz

37

To może być zbliżony do tego, co chcesz:

git log --simplify-by-decoration --decorate --pretty=oneline "$committish" | fgrep 'tag: ' 

Ale im bardziej powszechna sytuacja jest po prostu znaleźć najnowszą tag:

git describe --tags --abbrev=0 "$committish" 
  • --tags wyszuka przeciwko lekkich tagów , nie używaj go, jeśli chcesz brać pod uwagę tylko znaczniki z adnotacjami.
  • Nie używaj --abbrev=0, jeśli chcesz zobaczyć również zwykły "numer" zatwierdzeń na górze "i skrócony hash" (np. V1.7.0-17-g7e5eb8).
+1

Od Git 1.7.10 to nie działa '--pretty = format:% d' wylicza pliki bez informowania, czy jest to znacznik czy gałąź – CharlesB

+1

@CharlesB: Edytowane w celu zmiany na 'log'. Nie rozdzieliłem go właściwie, ale wygląda na to, że zmiana (regresja?) Mogła nastąpić w wersji 1.7.2: [a7524128] (https://github.com/git/git/commit/a7524128750ebf34fe0639e1e5d7abd03aff0302) zmienił wewnętrzną dekorację tekst, ale tylko dostosował jedną z funkcji formatowania, aby zrekompensować (log-tree.c: show_decoration została skorygowana, podczas gdy pretty.c: format_decoration został trafiony z (niezamierzoną?) zmianą). –

+0

Daje mi to: fatal: niejednoznaczny argument '': nieznana wersja lub ścieżka nie znajduje się w drzewie roboczym. Użyj "-", aby oddzielić ścieżki od wersji (git w wersji 1.7.9.5) – rooby

0

(lub jakiś jej wariant) może być tym, czego szukasz.

+1

Nie, "git description" wyświetli tylko jeden tag/ref. – sleske

11

notować wszystkie znaczniki dotrzeć na obecnym Branża:

git log --decorate=full --simplify-by-decoration --pretty=oneline HEAD | \ 
sed -r -e 's#^[^\(]*\(([^\)]*)\).*$#\1#' \ 
     -e 's#,#\n#g' | \ 
grep 'tag:' | \ 
sed -r -e 's#[[:space:]]*tag:[[:space:]]*##' 
+0

Zamień 'sed -r' na' sed -E 'na OS X. – CharlesB

+0

Format' git log --decorate = full --symplify-by-decoration --pretty = oneline HEAD' zmienił się nieco, ponieważ ta odpowiedź została zmieniona – CharlesB

+0

'git log --decorate --oneline | egrep '^ [0-9a-f] + \ (tag:' | sed -r 's /^.+ tag: ([^] +) [, \)]. + $/\ 1/g'' – shkschneider

0

można użyć to:

# get tags on the last 100 commits: 
base_rev=master~100 
end_rev=master 
for rev in $(git rev-list $base_rev..$end_rev) 
do 
    git describe --exact-match $rev 2> /dev/null 
done 
+0

Działa to tylko wtedy, gdy twoje repo ma> 100 commitów i jeśli tag, którego potrzebujesz, jest> 100 commitów temu, nie masz szczęścia. –

0

Jest git branch --contains (Git od 1.5.7, przynajmniej)

+0

to nawet nie robi tego, o co prosi. "With --contains, pokazuje tylko gałęzie, które zawierają nazwany commit" ... nie prosił o gałęzie zawierające commit. Poprosił o znaczniki w oddziale. – masukomi

5

Nie mam wystarczającej reputacji, aby komentować posty innych osób, ale jest to odpowiedź na odpowiedź i jej komentarze pod adresem https://stackoverflow.com/a/7698213/2598329. W celu pokazania wszystkich tagów osiągalny przez obecnego oddziału, w tym znaczniku na głowie popełnienia, można użyć następujący:

git log --decorate --oneline | egrep '^[0-9a-f]+ \((HEAD,)?tag: ' | ssed -r 's/^.+tag: ([^ ]+)[,\)].+$/\1/g' 

Jedno zastrzeżenie - używam bardzo sed, więc być może trzeba zmienić mój "ssed" do sed.

I za to piekło, to jest tutaj w PowerShell:

git log --decorate --oneline | % { if ($_ -match "^[0-9a-f]+ \((HEAD,)?tag: ") { echo $_} } | % { $_ -replace "^.+tag: ([^ ]+)[,\)].+$", "`$1" } 

- -a

+1

Czy istnieje powód, dla którego nie zmieniasz swojej odpowiedzi, aby używać sed zamiast ssed, ponieważ to będzie bardziej prawdopodobne, co mają inni użytkownicy? – rooby

+0

Zgadzam się, ale należy zauważyć, że na os x domyślny sed nie ma opcji '-r'. musisz przełączyć się na 'gnu-sed' przez homebrew ... lub cokolwiek innego. – masukomi

1

Oto jak listy adnotacją tagów pasujące do wzorca (TAG_PREFIX *) w odwrotnym porządku chronologicznym . Ten przepis używa git-description.

#!/usr/bin/env bash 

tag=$(git describe --abbrev=0 --match TAG_PREFIX*) 
until [ -z $tag ]; do 
    echo $tag 
    tag=$(git describe --abbrev=0 --match TAG_PREFIX* $tag^ 2>/dev/null); 
done 

Nie zadziała, jeśli wiele znaczników pasujących do wzorca wskazuje na ten sam commit.W tym przypadku jest to kolejny przepis, który używa git-rev-list i git-tag do wyświetlenia wszystkich tagów, pasujących do TAG_PREFIX *, zaczynając od commit (HEAD w tym przykładzie).

#!/usr/bin/env bash 

git rev-list HEAD | while read sha1; do 
    tags=("$(git tag -l --points-at $sha1 TAG_PREFIX*)") 
    [[ ! -z ${tags[*]} ]] && echo "${tags[@]}" | sort -r 
done 
0

wydajna dla dużej liczby znaczników i dostaje łatwy elastyczność format:

{ git rev-list --first-parent ${1:-HEAD} 
    git for-each-ref --format='%(objectname) %(objecttype) %(refname) 
          %(*objectname) *(%(objecttype)) %(refname)' 
} \ 
| awk ' 
    NF==1 { revs[$1]=1; next } 
      { if ($1 in revs) print $1,$2,$3 } 
' 

który zbiera wszystkie pozycje literaturowe, dodawania refs/tags do F-e-r jego ograniczenie.

28
git tag --merged <branch> 

Od strony man:

--[no-]merged <commit> 

Only list tags whose tips are reachable, or not reachable if --no-merged is used, from the specified commit (HEAD if not specified). 

Wierzę, że ta opcja została dodana całkiem niedawno - to na pewno nie był dostępny z powrotem, gdy oryginalny pytanie zostało zadane i powyższe odpowiedzi sugerowane. Ponieważ ten wątek jest wciąż pierwszym hitem w Google, który dotyczył pytania, doszedłem do wniosku, że każdy, kto przewinie się na dół szuka odpowiedzi, która wymaga mniej pisania niż zaakceptowana odpowiedź (i dla mojego własnego odniesienia, gdy zapomnę ta odpowiedź ponownie w przyszłym tygodniu).

+1

Został dodany na wrzesień 2015, [wydaje się] (http://stackoverflow.com/a/32991687/777285).Powinna być teraz zaakceptowaną odpowiedzią IMO. –

+0

zgodził się, to było dokładnie to, czego szukałem. – Mobius

+1

wyświetlanie tagów w oddziale, ale nie w innym, jest również możliwe: 'tag git - scheded debian --no-merged upstream' (użyteczne, gdy jeden oddział jest scalony w drugim) –

Powiązane problemy