git 로그에 모든 태그 표시 소스 제어를 위해 직장에서

git log --decorate커밋 당 하나 이상의 태그를 표시 하지 않는 이유는 무엇 입니까?

편집 : Charles Bailey가 대답을 내놓았습니다 (적어도 내 경우에는)
본질적으로 커밋을 가리키는 다른 태그를 가리키는 태그가 하나 있습니다. 이 추가 간접 레이어로 인해 태그가 로그에 표시되지 않았습니다. 이 문제를 해결해야합니다. 태그 지정 스크립트를 수정하여 올바르게 태그를 지정하거나 일부 쉘 스크립트 부두가 태그를 재귀 적으로 따르도록합니다. 어쨌든 누군가가 원할 경우를 대비 하여이 질문을 참고 용으로 남겨 두겠습니다. (저는 스택 오버플로가 처음이지만 올바른 프로토콜이라고 가정합니까?)

… 원래 질문이 이어집니다 …

백 스토리 : 소스 제어를 위해 직장에서 GIT를 사용하고 배포 할 때 항상 커밋에 태그를 지정하는 정책이 있습니다. (실제로 태그를 수행 한 다음 서버에서 태그를 가져 오는 스크립트입니다). 별도의 스테이징 및 프로덕션 서버가있는 웹 애플리케이션이므로 종종 스테이징을 위해 릴리스에 태그를 지정하고 (테스트 또는 기타 용도로) 나중에 프로덕션을 위해 동일한 커밋에 태그를 지정합니다.

따라서 실제로 동일한 커밋에 여러 태그가있는 경우가 매우 자주 있습니다. 텍스트 로그에서 이것을 볼 수 있으면 매우 좋을 것 같지만 지원하지 않는 것 같습니다. 현재 찾고있는 태그를 수동으로 확인하거나 실행하여 문제를 해결하고 있습니다 gitk. 이 두 솔루션이 모두 작동하지만 git log --decorate기본적으로 커밋 당 하나의 태그 만 지원 하는 것이 정말 이상하다고 생각합니다 .

인터넷 검색을 좀했지만 많이 찾지 못했습니다. 나는 명백한 것을 놓치고 있습니까?

추신 ( %d맨 페이지와 몇 가지 빠른 테스트에 따르면 실제로 사용자 정의 형식 문자열을 사용 합니다. --decorate)



답변

Charles Bailey 가 주석에서 올바르게 지적했듯이 문제의 원인 인 태그 태그 (태그에 태그 지정)에 대한 참고 사항 :

서명 된 태그를 재정의하는 것이 쉽지 않으므로이 스레드 를 연구해야합니다 .

  • 이미 태그를 푸시했다면 git tagman 페이지git tag -f B 는 태그 이름 ” A“을 간단히 바꾸지 말라고 진지하게 조언했습니다.
  • 로 서명 된 태그를 다시 만들려고하지 마십시오 git tag -f(아래 스레드 추출 참조).

    (이것은 코너 케이스에 관한 것이지만 일반적으로 태그에 대해 매우 유익하며 다른 SO 기고자 Jakub Narębski에서 제공합니다 ) :

태그 이름 (무거운 태그, 즉 태그 개체)은 다음 두 위치에 저장됩니다.

  • ‘태그’헤더의 내용과 태그 개체 자체에 (당신이 “의 출력에서 볼 수 있습니다 git show <tag>“또한 출력에 ” git cat-file -p <tag>“여기서 <tag>예를 들어, 헤비급 태그입니다 v1.6.3git.git저장소)
  • 또한 refs/tags/*태그 객체를 가리키는 태그 참조 ( ” “네임 스페이스의 참조)의 기본 이름입니다 .
    태그 참조 ( ” refs/tags/*“네임 스페이스 의 적절한 참조 )는 순전히 로컬 문제입니다. 예를 들어 한 저장소가 ‘ refs/tags/v0.1.3‘에 있고 다른 저장소는 ‘ ‘에있을 수 있습니다 refs/tags/sub/v0.1.3.

따라서 서명 된 태그 ‘ A‘ 를 만들면 다음과 같은 상황이 발생합니다 (일부 커밋을 가리킨다 고 가정).

  35805ce   <--- 5b7b4ead  <=== refs/tags/A
  (commit)       tag A
                 (tag)

또한 ” git tag -f A A“(주석 태그가되도록 강제하는 옵션이 없음에 유의 )는 noop이며 상황을 변경하지 않습니다.

git tag -f -s A A” 을 수행 하면 태그 를 강제로 작성하고 (git은 사용자가 수행중인 작업을 알고 있다고 가정합니다) -s/ -a/ -m옵션 중 하나를 사용하여 주석이 달린 태그 (태그 객체 생성)를 강제로 작성합니다. 다음 상황

  35805ce   <--- 5b7b4ea  <--- ada8ddc  <=== refs/tags/A
  (commit)       tag A         tag A
                 (tag)         (tag)

또한 ” git show A“는 태그가없는 개체까지 전체 체인을 표시합니다.


답변

git log --no-walk --tags --pretty="%h %d %s" --decorate=full

이 버전은 커밋 메시지도 인쇄합니다.

 $ git log --no-walk --tags --pretty="%h %d %s" --decorate=full
3713f3f  (tag: refs/tags/1.0.0, tag: refs/tags/0.6.0, refs/remotes/origin/master, refs/heads/master) SP-144/ISP-177: Updating the package.json with 0.6.0 version and the README.md.
00a3762  (tag: refs/tags/0.5.0) ISP-144/ISP-205: Update logger to save files with optional port number if defined/passed: Version 0.5.0
d8db998  (tag: refs/tags/0.4.2) ISP-141/ISP-184/ISP-187: Fixing the bug when loading the app with Gulp and Grunt for 0.4.2
3652484  (tag: refs/tags/0.4.1) ISP-141/ISP-184: Missing the package.json and README.md updates with the 0.4.1 version
c55eee7  (tag: refs/tags/0.4.0) ISP-141/ISP-184/ISP-187: Updating the README.md file with the latest 1.3.0 version.
6963d0b  (tag: refs/tags/0.3.0) ISP-141/ISP-184: Add support for custom serializers: README update
4afdbbe  (tag: refs/tags/0.2.0) ISP-141/ISP-143/ISP-144: Fixing a bug with the creation of the logs
e1513f1  (tag: refs/tags/0.1.0) ISP-141/ISP-143: Betterr refactoring of the Loggers, no dependencies, self-configuration for missing settings.

답변

참고 :이 5e1361c 커밋 에서 브라이언 m. carlson ( bk2204) (for git 1.9 / 2.0 Q1 2014)은 태그를 사용한 로그 장식과 관련하여 특별한 경우를 다룹니다.

로그 : 체인 태그로 장식을 올바르게 처리

git log두 번째 태그가 삭제 된 경우와 같이 태그 객체가 더 이상 참조가 아닌 다른 태그 객체를 참조 할 때 장식을 올바르게 처리하지 못했습니다 . 두 번째 태그에서 호출되지 않았고 태그 필드가 채워지지
않았기 때문에 커밋이 올바르게 장식 parse_object되지 않아 관련 커밋과 연결된 태그가 없습니다.

parse_object이 필드가 없으면이 필드를 호출 하여 태그 체인을 역 참조 할 수 있고 커밋을 올바르게 장식 할 수 있습니다.
향후 회귀를 방지하기 위해 테스트도 포함하십시오.

예:

git tag -a tag1 -m tag1 &&
git tag -a tag2 -m tag2 tag1 &&
git tag -d tag1 &&
git commit --amend -m shorter &&
git log --no-walk --tags --pretty="%H %d" --decorate=full