2016-07-20 2 views
0

git log --no-walk --tags --decorate=short을하고 싶습니다.하지만 모든 태그가 아니라 지정된 범위 soley (커밋 범위)의 태그도 확인하고 싶습니다.주어진 범위 내에서만 태그의 로그를 가져옵니다.

+0

어떤 범위의 범위입니까? 날짜별로? 커밋/태그 ID를 시작하고 끝내는 방법? 다른 것? – Wolf

+0

@Wolf 커밋/태그 ID. 그것으로 질문을 업데이트 할 것입니다. –

+0

정확히 "태그 범위"란 무엇입니까? 태그가'fred','barney','betty','wilma'라면 어느 것이 어느 범위에 있습니까? (더 유용하게,'git for-each-ref --format = '% (refname : short)'refs/tags'를 원하는 프로그램으로 파이프하여 태그 선택을 할 수 있습니다. git log --no-walk --decorate = short'에 대한 추가 인수.) – torek

답변

2

편집 : --simplify-by-decoration, 폐기 A (지점 또는) 그들을 가리키는 태그 이름이없는 커밋을 가지고 jthill noted in a comment, git rev-list (따라서 git log)과 같이

git log --simplify-by-decoration --decorate=short X..Y 

할 수 있습니다 그냥 네가 원하는거야. 불행하게도 테스트를 통해 분기 이름이 지정된 커밋을 계속 유지하고 있음을 알 수 있습니다. The documentation이 100 % 확실하지 않다 : 일부 지점 또는 태그에 의해 참조되는

--simplify-by-decoration
커밋이 선택됩니다.

하지만 나중에 :

--simplify-by-decoration 옵션을 사용하면 태그에 의해 참조되지 않는 커밋을 생략하여 역사의 토폴로지의 큰 그림을 볼 수 있습니다. ...

아래의 원래 답변 (정상 작동). 당신이 "그들을 가리키는 태그가있는 경우에만 커밋을 선택"을 X..Y 같은 효과를 결합하려는처럼


OK, 그것은 소리.

작동 이런 종류의 일을위한 두 가지 망할 놈의 명령이 있습니다

  • git for-each-ref, 당신은 어디서나 refs/ 네임 스페이스 내에서 참조 이름-어떤 이름으로 작업 할 수 있습니다; 태그는 refs/tags/입니다.

  • git rev-list 실제로 커밋 메시지를 표시하는 대신 git log과 동일한 명령입니다. 기본적으로 해시가 표시됩니다. (이 다른 약간의 차이가 있지만, 그들은 모두 git loggit rev-list는 하나의 소스 파일에서 내장되어 너무 비슷합니다.)

여기가 가장 큰 문제는 git log 쉽게/git rev-list이 할 수있는 동안 당신이 투입되는 제한이다 예를 들어 Y ^X 또는 X..Y으로 선택하거나 또 다른 예로 --no-walk --tags[=pattern]을 사용하면 교차 설정 작업이 잘되지 않습니다. 예를 들어 git rev-list --no-walk --tags=foo\* --tags=bar\* --branches=baz\*foo* 또는 bar*과 일치하는 이름으로 태그 된 모든 커밋 ID를 인쇄하거나 baz*과 일치하는 지점 이름으로 지정됩니다 (예 : git rev-list --no-walk --tags=foo\* --tags=bar\* --branches=baz\*).

합니다 (rev-list 명령 파이프 및 --stdin 있지만 교차로를 사용하여 전체, 임의의 합집합 연산을한다. 이것은 의욕의 구문이 망할 놈의 박동 한 지역이다.물론 의욕은 파이썬의 모든 내부적으로 다시 위에 떨어해야하는 장점이있다)

당신이 원하는 무엇

하지만, 두 집합의 교집합이다.

  • 세트 1 : 당신의 범위 선택이, X..Y 또는 --since=date1 --until=date2

  • 2 개 세트 같은 아마 뭔가 : 모든이 지적-에 커밋 (일부 또는 전부) 태그에 의해

경화제 이 교차로를 호출하려면 몇 가지 코드가 필요합니다. 유닉스 계열 시스템에는 우리가 필요로하는 모든 도구가있다 : Git 자체와 설정된 교차점을 수행 할 수있는 comm. comm 유틸리티는 입력을 정렬해야하므로 각 세트를 sort으로 파이프합니다. 그래서 우리는 짧은 (7 줄) 스크립트 만 필요합니다. 예컨대 :

tf1=$(mktemp) || die "can't make first temp file" 
trap "rm -f $tf1" 0 1 2 3 15 
tf2=$(mktemp) || die "can't make second temp file" 
trap "rm -f $tf1 $tf2" 0 1 2 3 15 

이제 우리는 설정 얻을 1 git rev-list를 사용하여 우리는 보통 임시 파일 상용구로 시작

:

git rev-list <specifiers> | sort > $tf1 

그런 다음 우리가 git for-each-ref를 사용하여, 세트 2 얻을. 주석이 달린 태그를 객체 (일반적으로 커밋이지만 어노테이션이 추가 된 태그)로 처리하려고한다고 가정하면 다른 주석 태그 인 경우 태그 자체에서 해결됩니다.

git for-each-ref --format='%(object)' refs/tags | sort > $tf2 

%(object)이 아니라 %(objectname); 후자는 주석이 달린 태그 객체의 ID 만 가져올 것입니다.

comm -12 $tf1 $tf2 

의 출력 :

마지막으로, 우리는하지만, 3 열 (두 파일에 라인)을 억제하는 즉, 두 임시 파일, 우리는 comm -12을 원하는 에있는 ID를 커밋만을 원하는 이 스크립트는 커밋 해시를 정렬하여 결정된 순서로 표시 할 커밋 집합이므로 git log을 사용하여 정렬 순서를 수정합니다. 이제 우리가 원래 git log 명령을 사용하지만 선택한 커밋에서 실행 :

git log --no-walk --decorate=short --date-order $(script) 

(이 물론 모든 테스트되지 않은 것입니다).

git rev-list 경우 우리는 망할 놈의 쉘 내의 모든이 작업을 수행 할 수있는 --stdin-intersect 옵션을했다 :

git log --no-walk --decorate=short $(\ 
    git for-each-ref --format='%(object)' refs/tags | \ 
    git rev-list --stdin-intersect X..Y \ 
) 

을하지만,하지 작은 스크립트 따라서 필요하지 않습니다.

+0

또한'git log --simplify-by-decoration X..Y'가 있습니다. – jthill

+0

@jthill : 오, 그래요, 여기서 잘 작동 할 것입니다. – torek

+0

@jthill 감사합니다! –

관련 문제