경량 태그와 주석이 달린 태그에 관심을 가져야하는 이유는 무엇입니까?


346

작년에 일상적인 VCS로 Subversion에서 Git으로 전환했지만 여전히 "Git-think"의 더 좋은 점을 파악하려고합니다.

최근에 나를 귀찮게 한 것은 "가벼운"대 주석이 달린 태그 대 서명 된 태그입니다. 주석이 달린 태그가 모든 실제 용도에 대해 경량 태그보다 우수하다는 것은 보편적으로 인정되는 것처럼 보이지만, 왜 그런지에 대한 설명은 항상 "모범 사례 때문에" 또는 "서로 다르기 때문에" . 불행히도, 이것이 모범 사례인지 또는 그 차이가 내 Git 사용법 과 어떻게 관련 되는지 알지 못하면 매우 불만족스러운 주장 입니다.

처음 Git으로 전환했을 때 얇게 썬 빵 이후로 가벼운 태그가 가장 좋았습니다. 커밋을 가리키고 "1.0"이라고 말할 수 있습니다. 태그가 어떻게 그 이상이어야하는지 파악하는 데 어려움을 겪고 있지만 세계의 Git 전문가가 주석이 달린 태그를 임의로 선호한다고 믿을 수는 없습니다! 그렇다면 허브 브는 무엇입니까?

(보너스 포인트 : 왜 태그에 서명해야합니까?)

편집하다

주석이 달린 태그가 좋은 일임을 확신 했습니다. 누가 태그를 했는지 와 언제 중요한지 아는 것입니다. 후속 적으로 좋은 태그 주석에 대한 조언이 있습니까? 모두 git tag -am "tagging 1.0" 1.0와이 전략을 잃고 같은 이전 태그 느낌 때문에 로그를 저지 요약하려고합니다.


후속 조치에 대한 좋은 답변을 찾았습니까? 같은 것? git log --pretty=oneline master..HEAD | git tag -a -F - $BRANCH.$BUILD_NUMBER
dalore

이전 태그 이후 커밋 로그를 요약하면 태그 메시지에 대한 훌륭한 전략처럼 보입니다.
rooby

참고 (1) 날짜 경량 태그 목록은 여기 . (2.) 날짜 별 주석 태그를 나열하려면 여기로 이동하십시오 .
Trevor Boyd Smith

답변:


272

주석이 달린 태그의 큰 장점은 누가 태그를 만들 었는지 아는 것입니다. 커밋과 마찬가지로 때로는 누가했는지 알 수 있습니다. 개발자이고 v1.7.4에 태그가 지정되어 있고 (준비된 것으로 표시됨) 확실하지 않은 경우 누구에게 이야기합니까? 주석이 달린 태그에 이름이있는 사람! (신뢰할 수없는 세상에 살고 있다면 사람들이하지 말아야 할 것들에 태그를 붙이지 못하게합니다.) 당신이 소비자라면 그 이름은 권위의 도장입니다. 출시.

다른 메타 데이터도 도움이 될 수 있습니다. 때로는 최종 커밋이 이루어진 시점뿐만 아니라 해당 버전이 출시 된 시점을 아는 것이 좋습니다. 때로는 메시지가 유용 할 수도 있습니다. 특정 태그의 목적을 설명하는 데 도움이 될 수 있습니다. 릴리스 후보의 태그에 약간의 상태 / 할 일 목록이있을 수 있습니다.

태그에 서명하는 것은 다른 것에 서명하는 것과 매우 비슷합니다. 편집증에 대한 보안 수준을 한 단계 더 높여줍니다. 우리 대부분은 그것을 사용하지 않을 것이지만, 컴퓨터에 소프트웨어를 넣기 전에 모든 것을 실제로 확인하고 싶다면 원할 것입니다.

편집하다:

태그 주석에 쓸 내용에 관해서는 맞습니다. 항상 유용한 것은 아닙니다. 버전 번호 태그의 경우 해당 버전이 해당 버전을 표시한다는 것을 암시 적으로 이해하고 있으며 다른 곳에서 변경 로그에 만족하는 경우 태그를 넣을 필요가 없습니다. 이 경우 실제로 가장 중요한 태그와 날짜입니다. 내가 생각할 수있는 유일한 다른 것은 테스트 스위트의 승인 스탬프입니다. git.git의 태그를 살펴 보자. "Git 1.7.3 rc1"; 우리가 정말로 염려하는 것은 Junio ​​Hamano의 이름입니다.

그러나 이름이 분명하지 않은 태그의 경우 메시지가 훨씬 더 중요해질 수 있습니다. 단일 사용자 / 클라이언트, 특정 비 버전 이정표 또는 추가 정보가있는 릴리스 후보에 대해 특정 특수 목적 버전에 태그를 지정할 수 있습니다. 그러면 메시지가 훨씬 더 유용합니다.


4
OP는 해당 시스템에서 나오기 때문에 SVN과 비교하기 만하면됩니다. 주석이 달린 태그 메타 데이터는 SVN에 고유 한 작성자와 메시지가있는 태그 분기를 만드는 실제 SVN 변경과 같습니다. 그리고 잠재적으로 태그를 만들 수있는 사람에 대한 별도의 제한 사항, 변경 사항을 확인할 수있는 사람과 구별됨-시스템을 자신의 용도로 사용하는 경우에는 관련이없는 구분입니다.
araqnid

10
아하! 지금까지의 모든 Git 프로젝트가 독창적이라는 사실로 인해 이해가 방해되는 것처럼 들립니다. 나는 누군가를 비난하는 사람을 알 필요가 없었습니다 (항상 나입니다!). 가벼운 태그가 태그를 추적하지 않는다는 것을 알지 못했습니다.
Ben Blank

5
git help log"애노테이션이있는 태그는 릴리스 용이며 경량 태그는 개인용 또는 임시 객체 레이블 용입니다."
Jon Gjengset

1
@javabrett 이것이 "주석과 경량 태그의 차이점은 무엇인가"에 대한 해답의 좋은 부분이기는하지만 사람들이 왜 추가 정보를 저장하고 주석이 달린 태그를 사용하고 싶어하는지에 대한 질문이 여기에있었습니다. (그리고 나는 "블롭을 만든다"는 단점이라고 진지하게 말할 수 없다고 생각한다. 당신은 당신이 저장하고자하는 정보를 저장하기 위해 당신이해야 할 일을하고, 그것이 중요한 정보라면, 블롭이 필요할 것이다. )
Cascabel

1
@Chris 예, 답변에 따르면 "주석 태그의 큰 장점은 누가 태그를 만들 었는지 아는 것입니다." 당신은 항상 스스로 알아낼 수 있습니다 :git tag -a -m 'my message' my-tag; git show my-tag
Cascabel

64

그 주제에 대한 나의 개인적이고 약간 다른 견해 :

  • 주석이 달린 태그는 다른 개발자, 아마도 새 버전 (서명해야 함)을 위해 게시 된 태그입니다. 누가 태그를했는지, 언제 태그를했는지뿐만 아니라 이유 (보통 변경 로그)도 볼 수 있습니다.
  • 가벼움은 개인 용도에 더 적합합니다. 즉, 특수 커밋에 태그를 지정하여 다시 찾을 수 있습니다. 그것들을 검토하고, 무언가 또는 무엇이든 테스트하기 위해 점검하십시오.

4
man git-tag에도 언급되어있다 : "주석을
붙인

28

기본적으로 Git은 주석이 달린 태그 만과 같은 명령에 대한 기준으로 간주합니다 git describe. 주석이 달린 태그는 자신과 타인에게 지속적인 의미를 갖는 푯말로 생각하는 반면, 가벼운 태그는 나중에 찾을 수있는 북마크와 비슷합니다. 따라서 주석이 달린 태그는 참조로 사용할 가치가 있지만 경량 태그는 그렇지 않습니다.

태그에 서명하는 것은 서명자의 신원을 보증합니다. 예를 들어 사용자가 선택한 Linux 커널 코드가 Linus Torvalds가 실제로 릴리스 한 코드와 같은지 확인할 수 있습니다. 서명은 서명자가 해당 커밋에서 소프트웨어의 품질과 무결성을 보증한다고 주장 할 수도 있습니다.


1
git push --follow-tags두 가지를 다르게 취급하는 또 다른 명령입니다 : stackoverflow.com/a/26438076/895245
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

1
에 대한 힌트를 주셔서 감사합니다 git describe. 나는 지속적인 통합 시스템에서 그것을 사용하고 버전 문자열이 내가 기대했던 것이 아닌 몇 번이되었습니다.
jjmontes

9

태그에 서명하면 릴리스의 진위를 확인하는 쉬운 방법입니다.

누구나 저장소를 복제하고 히스토리를 수정할 수 있기 때문에 (예 : git-filter-branch를 통해) DVCS에 특히 유용합니다. 태그에 서명 한 경우 서명은 git-filter-branch 작업에서 유지되지 않으므로 모든 릴리스에 커미터가 태그를 지정하고 서명 한 정책이 있으면 리포지토리에서 가짜 릴리스 태그를 감지 할 수 있습니다.

서명하지 않은 경우 주석이 달린 태그에서 많은 점을 보지 못할 것입니다.


1
실제로 이것은 전체 기록이 아닌 커밋 된 트리에만 서명하는 서명을 갖는 것이 유용 할 수 있습니다 (나는 누군가가 기록을 무단 변경했는지 여부는 신경 쓰지 않고 올바른 코드가 있는지 확인하고 싶습니다).
Paŭlo Ebermann

9

주석이 달린 태그를 푸시하고 가벼운 로컬을 유지하십시오

특정 Git 동작은 다음과 같은 권장 사항이 유용한 방식으로 이들을 구별합니다.

  • 주석이 달린 태그에는 커밋과 다른 메시지, 작성자 및 날짜가 포함될 수 있습니다. 따라서 릴리스 커밋을하지 않고도 릴리스를 설명하는 데 사용할 수 있습니다.

    경량 태그에는 추가 정보가 없으므로 개발에 직접 사용하기 때문에 필요하지 않습니다.

  • git push --follow-tags 는 주석이 달린 태그 만 푸시합니다.
  • git describe 명령 행 옵션이 없으면 주석이 달린 태그 만 표시됩니다.

man git-tag 말한다 :

주석이 달린 태그는 릴리스 용이며 경량 태그는 개인용 또는 임시 객체 레이블 용입니다.

내부 차이

  • 경량 태그와 주석이 달린 태그는 .git/refs/tagsSHA-1이 포함 된 파일 입니다.

  • 경량 태그의 경우 SHA-1은 커밋을 직접 가리 킵니다.

    git tag light
    cat .git/refs/tags/light
    

    HEAD의 SHA-1과 동일하게 인쇄합니다.

    따라서 다른 메타 데이터를 포함 할 수없는 것은 당연합니다.

  • 주석이 달린 태그는 객체 데이터베이스의 태그 객체를 가리 킵니다.

    git tag -as -m msg annot
    cat .git/refs/tags/annot
    

    주석이 달린 태그 객체의 SHA를 포함합니다.

    c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef
    

    다음과 같이 내용을 얻을 수 있습니다.

    git cat-file -p c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef
    

    샘플 출력 :

    object 4284c41353e51a07e4ed4192ad2e9eaada9c059f
    type commit
    tag annot
    tagger Ciro Santilli <your@mail.com> 1411478848 +0200
    
    msg
    -----BEGIN PGP SIGNATURE-----
    Version: GnuPG v1.4.11 (GNU/Linux)
    
    <YOUR PGP SIGNATURE>
    -----END PGP SIGNAT
    

    그리고 이것이 추가 메타 데이터를 포함하는 방법입니다. 출력에서 볼 수 있듯이 메타 데이터 필드는 다음과 같습니다.

    형식에 대한 자세한 분석은 git tag 객체의 형식과 SHA를 계산하는 방법에 있습니다.

보너스


6

나는 가벼운 태그에 대한 좋은 사용법을 발견했습니다-소급하여 GitHub에서 릴리스를 만듭니다.

우리는 소프트웨어를 출시했고 필요한 커밋이 있었기 때문에 GitHub의 '릴리스'섹션을 유지하지 않아도됩니다. 그리고 약간의주의를 기울 였을 때, 이전 릴리스 날짜와 함께 이전 릴리스도 추가하고 싶다는 것을 깨달았습니다.

이전 커밋에서 주석이 달린 태그를 만들려면 GitHub가 태그 객체에서 릴리스 날짜를 가져옵니다. 반대로이 오래된 커밋에 대해 간단한 태그를 만들면 릴리스에 올바른 날짜가 표시되기 시작했습니다. 출처 @ GitHub 도움말, '릴리스 정보'

주석이 달린 커밋에 원하는 날짜를 지정할 수도 있지만 https://www.kernel.org/pub/software/scm/git/docs/git-tag와 같이 간단하지 않습니다 . html # _on_backdating_tags


오늘 나는 GitHub이 나를 위해 태그 날짜를 준수하지 않았다는 것을 알았습니다 (가벼운 태그와 주석이 달린 태그 모두). 릴리스를 게시 할 때 날짜 만 무시하고 릴리스의 "게시"버튼을 누른 날짜와 시간을 기억합니다.
evilkos

그래, 나는 또한 GitHub과 주석이 달린 태그에 대한이 혼란에 빠져 들었다. 나는 그들이 이런 식으로 그것을 구현 한 이유를 얻지 못했습니다.
YakovL

1

내 사무실에서는 릴리스 웹 페이지 주소를 태그 본문에 넣습니다. 릴리스 웹 페이지에는 마지막 릴리스 이후의 모든 새로운 기능과 수정 사항이 자세히 설명되어 있습니다. 경영진은 변경 사항을 찾기 위해 git repo를 찾지 않을 것이므로 해당 릴리스의 내용을 간결하게 나열하는 것이 좋습니다.


0

주석이 달린 태그는 작성자 이름, 릴리스 정보, 태그 메시지 및 날짜와 같은 추가 메타 데이터를 Git 데이터베이스에 전체 객체로 저장합니다. 이 모든 데이터는 프로젝트의 공개 릴리스에 중요합니다.

자식 태그 -a v1.0.0

경량 태그는 참조하는 커밋의 해시 만 저장하기 때문에 git 저장소에 태그를 추가하는 가장 간단한 방법입니다. 커밋에 대한 "책갈피"처럼 행동 할 수 있습니다. 개인 용도로도 좋습니다.

자식 태그 v1.0.0

기존 태그를 정렬, 나열, 삭제, 표시 및 편집 할 수 있습니다. 이 모든 기능은 특정 릴리스 버전의 코드를 식별하는 데 도움이됩니다. 태그가 무엇을 할 수 있는지 더 잘 알 수있는 이 기사 를 찾았습니다 .


0

나에게 중요한 차이점은 경량 태그에는 타임 스탬프가 없다는 것입니다. 여러 개의 가벼운 태그를 추가했다고 가정 해 보겠습니다.

git tag v1
git tag v2
git tag v3

그리고 나중에 나중에 마지막으로 추가 한 경량 태그를 얻고 싶을 수도 있습니다. 그렇게 할 방법이 없습니다. "git describe"나 "git tag"는 시간적으로 마지막으로 가벼운 태그를 제공하지 않습니다. "git tag -l"은 모든 것을 반환하거나 lex 순서로 정렬 할 수 있지만 날짜 / 시간별로 정렬 할 수는 없습니다. "git describe --tags"는 마지막으로 추가 된 태그가 아닌 "v1"을 반환합니다.

반면에 주석이 달린 태그를 추가하는 경우 :

git tag v1 -m v1
git tag v2 -m v1
git tag v3 -m v1

항상 모든 태그의 타임 스탬프를 얻을 수 있으며 "git describe"는 실제로 마지막으로 추가 된 태그 인 "v3"을 반환합니다.


주석을 달려면 -a를 사용해야합니다.
Alex
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.