programing

브랜치에 포함 된 목록 태그

nasanasas 2021. 1. 6. 08:24
반응형

브랜치에 포함 된 목록 태그


다음과 반대로 지정된 분기에 포함 된 태그를 나열하려면 어떻게해야합니까?

git tag --contains <commit>

"지정된 커밋을 포함하는 태그 만 나열"합니다.

이와 같은 것이 존재하지 않는 경우이를 스크립팅 할 수 있도록 커밋이 다른 커밋에 포함되어 있는지 어떻게 테스트합니까?

나는 이것을 할 수있다 :

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

그러나 태그와 커밋이 많은 저장소에서 시간이 오래 걸릴 수 있으므로 더 나은 방법이 있기를 바랍니다.


이것은 당신이 원하는 것에 가깝습니다.

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

그러나 더 일반적인 상황은 가장 최근의 태그를 찾는 것입니다.

git describe --tags --abbrev=0 "$committish"
  • --tags 경량 태그를 검색하므로 주석이 달린 태그 만 고려하려는 경우에는 사용하지 마십시오.
  • --abbrev=0일반적인 " '상위 커밋 수'및 축약 된 해시 수"접미사 (예 : v1.7.0-17-g7e5eb8)도 보려면 사용하지 마십시오 .

git tag --merged <branch>

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

나는이 옵션이 아주 최근에 추가되었다고 생각합니다. 원래 질문이 제기되고 위의 답변이 제안되었을 때 확실히 다시 사용할 수 없었습니다. 이 스레드는 여전히 Google에서 질문에 대한 첫 번째 히트이므로 허용 된 답변보다 입력이 적은 답변을 찾는 사람을 위해 아래로 스크롤하는 사람을 위해 던질 것입니다 (잊었을 때 내 자신의 참조를 위해 이 답변은 다음 주에 다시).


현재 브랜치에서 도달 할 수있는 모든 태그를 나열하려면 :

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:]]*##'

나는 다른 사람들의 게시물에 댓글을 달 수있는 충분한 평판을 갖고 있지 않지만 이것은 https://stackoverflow.com/a/7698213/2598329 의 답변과 댓글에 대한 응답 입니다. HEAD 커밋의 태그를 포함하여 현재 분기에서 도달 할 수있는 모든 태그를 표시하려면 다음을 사용할 수 있습니다.

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

한 가지주의 사항-저는 super sed를 사용하므로 "ssed"를 sed로 변경해야 할 수도 있습니다.

그리고 지옥을 위해 여기 PowerShell에 있습니다.

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

-- -ㅏ


패턴 (TAG_PREFIX *)과 일치하는 주석이 추가 된 태그를 시간 역순으로 나열하는 방법은 다음과 같습니다. 이 레시피는 git-describe를 사용합니다.

#!/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

패턴과 일치하는 여러 태그가 동일한 커밋을 가리키는 경우에는 작동하지 않습니다. 이를 위해 git-rev-list 및 git-tag를 사용하여 커밋 (이 예에서는 HEAD)에서 시작하여 TAG_PREFIX *와 일치하는 모든 태그를 나열하는 또 다른 레시피가 있습니다.

#!/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

git describe (또는 일부 변형)이 당신이 찾고있는 것일 수 있습니다.


이것을 사용할 수 있습니다.

# 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

많은 수의 태그에 효율적이고 간편한 형식 유연성 확보 :

{ 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 }
'

모든 참조를 가져 오면 refs/tagsfer에 추가 하여 제한합니다.


있다 git branch --contains(힘내 1.5.7 이후, 적어도)

ReferenceURL : https://stackoverflow.com/questions/2381665/list-tags-contained-by-a-branch

반응형