programing

rc-X 양식의 버전 문자열 순서에 따라 git 태그를 정렬하는 방법Y.Z.W?

mailnote 2023. 9. 8. 21:40
반응형

rc-X 양식의 버전 문자열 순서에 따라 git 태그를 정렬하는 방법Y.Z.W?

명령을 입력할 때:

git tag -l

결과는 다음과 같습니다.

rc-0.9.0.0
rc-0.9.0.1
rc-0.9.0.10
rc-0.9.0.11
rc-0.9.0.12
rc-0.9.0.2
rc-0.9.0.3
rc-0.9.0.4
rc-0.9.0.5
rc-0.9.0.6
rc-0.9.0.7
rc-0.9.0.8
rc-0.9.0.9

이것 대신에 나는 다음을 원합니다.

rc-0.9.0.0
rc-0.9.0.1
rc-0.9.0.2
rc-0.9.0.3
rc-0.9.0.4
rc-0.9.0.5
rc-0.9.0.6
rc-0.9.0.7
rc-0.9.0.8
rc-0.9.0.9
rc-0.9.0.10
rc-0.9.0.11
rc-0.9.0.12

현재 목록을 정렬하여 그러한 결과를 얻을 수 있는 방법은 무엇입니까?

버전 정렬 사용

git tag -l | sort -V

또는 forgit version >= 2.

git tag -l --sort=v:refname
git tag -l --sort=-v:refname # reverse

Git 2.0(2014년 6월)을 사용하면 정렬 순서를 지정할 수 있습니다!

Nguyn Thai Ngc Duy()가 작성한 commit 9ef176b의 commit b6de0c6 참조:

 --sort=<type>

특정 순서대로 정렬합니다.
지원되는 유형은 다음과 같습니다.

  • "refname " (),
  • "version:refname" 또는 "v:refname" 태그 이름은 버전으로 처리됩니다.

"pread" 앞에-로 정렬합니다."라고 .


그렇다면 다음과 같은 것이 있습니다.

git tag foo1.3 &&
git tag foo1.6 &&
git tag foo1.10

다음은 다음과 같습니다.

# lexical sort
git tag -l --sort=refname "foo*"
foo1.10
foo1.3
foo1.6

# version sort
git tag -l --sort=version:refname "foo*"
foo1.3
foo1.6
foo1.10

# reverse version sort
git tag -l --sort=-version:refname "foo*"
foo1.10
foo1.6
foo1.3

# reverse lexical sort
git tag -l --sort=-refname "foo*"
foo1.6
foo1.3
foo1.10

커밋 b150794(Jacob Keller, git 2.1.0, 2014년 8월) 이후로 기본 순서를 지정할 수 있습니다.

tag.sort

이 변수는 에 표시될 때 태그 정렬 순서를 제어합니다.
"" --sort=<value> 이 option 의 이 으로 됩니다 됩니다 으로 이 의 .

robinst comments:

버전 정렬 순서(Git 2.1+)를 기본값으로 구성할 수 있습니다.

git config --global tag.sort version:refname

레오 갈레길로스(Leo Galleguillos)가 코멘트에서 언급한 바와 같이:

최신 태그를 먼저 표시하도록 Git을 구성하려면(하행 순서) 버전 전에 하이픈만 추가하면 됩니다.
는 다음과

git config --global tag.sort -version:refname

Git 2.4(2015년 2분기)를 사용하면 구성 변수를 사용하여 다음을 지정할 수 있습니다.

Junio C Hamano()gitster의 커밋 f57610a 참조.

) ( )versionsort.prereleaseSuffix는 현재는재의지다r다의d의 감가상각 별칭입니다.versionsort.suffix.


22016년은 git 2.7.1(2016년 2월)의 입니다.git tag그 자체.

제프 킹의 peff커밋 0571979(2016년 1월 26일) 및 커밋 1d094db(2016년 1월 24일)를 참조하십시오.
(2016년 2월 1일, 준오 C 하마노 ---- 커밋 8bad3de에서 합병)

tag 로 하지 을 하지 로 을 "로 표시하지 않음tags/foo"

B7cc53e 이후 (tag.c: '를 사용합니다.ref-filter 'APIs, 2015-07-11),git tag이름을 한기했습니다즉둘즉다다둘hs",이기shd(ig한s "heads/foo" 그리고"tags/foo "" "로tags/foo "" foo".
이것은 둘 다입니다.

  • "한"의, "의"의 출력.git tag" 만 합니다 만을 합니다.refs/tags, 그래서 우리는 그것을 알고 있습니다.foo" "에 있는 것을 의미합니다.refs/tags".
  • 모호하다;행 " 에서 의 라는 이 는 을 라는 을 이 foo""는 라는"를 의미합니다.refs/tags/foo" 존재합니다.새로운 결과물에서는 ""을 의미하는지 여부가 불분명합니다.refs/tags/foo" 또는 "refs/tags/tags/foo".

switched 는 b7cc53e 입니다 입니다 git tag재필터를 사용하다"%(refname:short)" 출력 포맷, 에서 조정된for-each-ref. 이 보다 일반적인 코드는 우리가 태그에만 관심이 있다는 것을 알지 못하고 사용합니다.shorten_unambiguous_ref을 얻다short-name.
우리는 오직 "만 신경 쓴다는 것을 말할 필요가 있습니다."refs/tags/", 그리고 그 값에 관해서는 짧아져야 합니다.

특정 접두사 구성 요소 집합을 제거하기 위해 서식 언어인 strip""에 새로운 수식어를 추가해 보겠습니다.
이로 인해 "git tag", 사용자가 자신의 사용자 지정 형식에서 동일한 동작을 호출할 수 있습니다(for ").tag" 또는 "for-each-ref") 나가면서":short" 모든 장소에서 동일한 의미를 가지고 있습니다.

한다면strip=<N>첨부, 스트립(strip)<N>refname 앞에서 슬래시로 구분된 경로 구성요소(예:%(refname:strip=2)돌돌돌돌돌돌돌돌돌림판들refs/tags/foo안으로foo.
<N>양의 정수여야 합니다.
표시된 참조의 성분 수가 다음보다 적을 경우<N>, 명령이 오류로 중단됩니다.

위해서git tag, 지정되지 않은 경우 기본값은%(refname:strip=2).


Git 2.12 업데이트 (2017년 1분기)

SZEDER Gabor()szederc026557, commit b178464, commit 51acfa9, commit b823166, commit 109064a, commit 0c1b487, commit 9ffda48, commit eba286e(2016년 12월 8일)를 참조하십시오.
(2017년 1월 23일 주니오 C 하마노 ---- 커밋 1ac244d에서 합병)

versionsort.prereleaseSuffix는 에 대한 사용되지 않는 별칭입니다.versionsort.suffix.

prereleaseSuffix"에서 사용되는 버전 비교 기능git tag -l" 동일한 릴리스에 대해 둘 이상의 사전 릴리스가 있을 때(예:2.0,2.0-beta1,그리고.2.0-beta2거기에 있고 코드는 비교해야 합니다.2.0-beta1그리고.2.0-beta2).

여기에 이미 나와 있는 답변을 종합하면 다음과 같습니다.

로컬 저장소

git -c 'versionsort.suffix=-' tag --list --sort=-v:refname
  • suffix=-예방할 것입니다2.0-rc"이후"에 오는 것2.0
  • --sort=-가장 높은 버전 번호가 맨 위에 표시됩니다.

원격 저장소

git -c 'versionsort.suffix=-' ls-remote -t --exit-code --refs --sort=-v:refname "$repo_url" \
    | sed -E 's/^[[:xdigit:]]+[[:space:]]+refs\/tags\/(.+)/\1/g'

원격에서 다운로드되는 개체가 없다는 것이 장점입니다.

자세한 내용은 이 답변을 참조하십시오.

답변에 따르면, 지원하지 않는 플랫폼에서sort -V윈도우와 OSX처럼 사용할 수 있습니다.

git tag -l | sort -n -t. -k1,1 -k2,2 -k3,3 -k4,4

역순 정렬을 가져오려면sort -V접근 방식:

git tag -l | sort -V --reverse

다음과 같은 태그를 정렬하는 이 Perl 스크립트를 조정합니다.client_release/7.2/7.2.25, 특정 태그 지정 방식으로 변경할 수 있습니다.

저는 이 작업을 단순화하기 위해 간단한 셸 스크립트를 작성하게 되었습니다.

#!/usr/bin/env bash

TAGS=$(git tag)
CODE=$?

if [ $CODE = 0 ]; then
    echo "$TAGS" | sort -V
fi

exit $CODE

라고 저장했습니다.git-tags내 안에$PATH그리고 달리다git tags태그 목록을 작성해야 할 때마다.

Linux를 사용하고 ZSH를 사용하는 경우 단순하게 사용gtl지휘.Alias로 미리 정의되어 있어야 합니다.

별칭 코드:
gtl='gtl(){ git tag --sort=-v:refname -n -l "${1}*" }; noglob gtl'

마지막으로 특별한 형식에 대한 시도 목록

git tag -l --sort=refname | grep -E '^\d+\.\d+\.\d+.*' | tail -n 1

아니면 첫번째

git tag -l --sort=refname | grep -E '^\d+\.\d+\.\d+.*' | head -n 1

언급URL : https://stackoverflow.com/questions/14273531/how-to-sort-git-tags-by-version-string-order-of-form-rc-x-y-z-w

반응형