git 태그 버전의 경우: 'v' 접두사가 아닌 주석 태그를 사용하십시오.

8711 단어 git
major.minor.patch ( Semantic Versioning 2.0.0 | Semantic Versioning 참조)와 같은 의미 있는 버전 번호로 커밋에 태그를 지정하는 것은 소스 트리의 이름을 지정하는 일반적인 방법입니다.

'v' 접두사를 사용하는 것이 유용하지 않은 이유는 무엇입니까?



일반적인 관행은 v1.0.0 와 같이 버전 태그에 'v' 접두사를 붙이는 것이지만 왜 그런지 이해가 되지 않습니다.

패턴v*이 있는 버전을 참조하는 태그를 쉽게 식별하기 위함이 아니다. 이 패턴은 문자 v 로 시작하는 버전이 아닌 태그도 가져오기 때문입니다. 따라서 v*.*.*와 같은 더 복잡한 패턴을 사용하거나 regexp를 지원하는 도구를 결합해야 합니다.

# accept v1.0.0 and 1.0.0
git tag -l '*.*.*'

# combine with grep to have a more selective pattern
git tag -l | grep -P '\d+\.\d+\.\d+'


버전에 대해서만 태그를 사용하는 경우 "접두사를 사용하는 이유는 무엇입니까?"그렇지 않은 경우 버전 태그는 문자로 시작하는 태그와 잠재적으로 혼합됩니다( a... , b... , ..., v... , w... ). 'v' 접두어가 없으면 숫자가 알파벳 순서로 앞이나 뒤에 오며 시간 기반 순서는 변경되지 않습니다.

태그를 사용하여 소스 트리의 현재 버전을 추출하는 경우 다른 문제가 발생합니다. 접두사를 제거해야 합니다.

따라서 v 접두사 없이 다음과 같이 할 수 있습니다 (github-actions Filter pattern cheat sheet ):

on:
  push:
    tags:
      #- 'v*.*.*'
      - '[0-9]+.[0-9]+.[0-9]+'
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Set env
        run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
      - name: Test
        run: |
          echo $RELEASE_VERSION
          echo ${{ env.RELEASE_VERSION }}


왜 주석이 달린 태그인가?



주석이 달린 태그는 "heavyweight"태그와 같습니다. 즉, 커밋과 마찬가지로 메시지와 작성자도 포함됩니다. IMHO, 버전 번호의 중요성을 표시하고 경량 태그에서 분리하는 완벽한 방법이기도 합니다.

# create an annotated tag
git tag -a "0.1.0" -m ":bookmark: 0.1.0"


버전에 대해서만 주석 태그를 사용하는 경우 git describe를 사용하여 현재 작업 트리의 "반 의미론적 버전"을 알 수 있음을 의미합니다(필터를 적용할 필요 없이).

❯ git describe -h
usage: git describe [<options>] [<commit-ish>...]
   or: git describe [<options>] --dirty

    --contains            find the tag that comes after the commit
    --debug               debug search strategy on stderr
    --all                 use any ref
    --tags                use any tag, even unannotated
    --long                always use long format
    --first-parent        only follow first parent
    --abbrev[=<n>]        use <n> digits to display object names
    --exact-match         only output exact matches
    --candidates <n>      consider <n> most recent tags (default: 10)
    --match <pattern>     only consider tags matching <pattern>
    --exclude <pattern>   do not consider tags matching <pattern>
    --always              show abbreviated commit object as fallback
    --dirty[=<mark>]      append <mark> on dirty working tree (default: "-dirty")
    --broken[=<mark>]     append <mark> on broken working tree (default: "-broken")



내가 가장 좋아하는 주장은 다음과 같습니다.

git describe --always --dirty


왜냐하면 :
  • 주석이 달린 태그가 있는 정확한 커밋에서 태그 값만 반환하는 경우(예: 0.1.0 )
  • 주석이 달린 태그 뒤에 있으면 <last_annotated_tag>-<number_of_commit>-g<last_commit_short_hash>를 반환합니다(예: 0.1.0-2-ge453fae )
  • 주석이 달린 태그가 없으면 짧은 커밋 해시를 출력합니다(따라서 출력을 비우지 않고 항상 (비의미적) 버전).
  • 작업 트리에서 커밋되지 않은 변경이 있는 경우 추가-dirty(추적되지 않은 파일 및 무시된 파일 무시)

  • ❯ git init
    ❯ touch README.md
    ❯ git add README.md
    ❯ git commit -m "add README"
    [development (root-commit) 8edcbdc] add README
     1 file changed, 0 insertions(+), 0 deletions(-)
     create mode 100644 README.md
    ❯ git describe --always --dirty
    8edcbdc
    
    ❯ git tag -a "0.1.0" -m ":bookmark: 0.1.0"
    ❯ git describe --always --dirty
    0.1.0
    
    ❯ echo "toto" > README.md
    ❯ git describe --always --dirty
    0.1.0-dirty
    
    ❯ git commit -a -m "modify README"
    [development 6cfe247] modify README
     1 file changed, 1 insertion(+)
    ❯ git describe --always --dirty
    0.1.0-1-g6cfe247
    
    ❯ echo "toto 33" > README.md
    ❯ git describe --always --dirty
    0.1.0-1-g6cfe247-dirty
    


    따라서 작업 트리의 모든 상태에 대해 고유한 버전 번호가 있으며 커밋 해시보다 인간 친화적입니다.

    버전 번호를 계산할 수 있는 빌드 도구를 사용하는 경우(toml 또는 xml과 같은 선언적 대신) 이 명령을 사용하여 항상 고유한 현재 버전을 가질 수 있습니다. Gradle 기반 빌드의 경우 버전을 다음과 같이 정의할 수 있습니다.

    # build.gradle
    
    version = "git --no-pager describe --always --dirty".execute().text.trim()
    



    0.0.0가 언제 생성될지 모르는 경우 첫 번째 주석이 달린 태그를 가능한 한 빨리 생성하십시오. 초기 커밋 후에 버전0.1.0에 태그를 지정할 수 있습니다.

    주석이 달린 태그는 다음을 통해 단일 명령으로 커밋으로 푸시할 수 있습니다.

    git push --follow-tags
    


    마지막 말



    사실 그것들은 반대가 아니므로 주석 태그를 사용하지 않고 v 접두어 사용을 중지하거나 주석 태그와 함께 v 접두어를 사용하는 것이 가능하지만 더 나은 조합(IMHO)은 v 접두어와 주석 태그를 사용하지 않는 것입니다 버전용.

    좋은 웹페이지 즐겨찾기