gitbranch --format 문자열 길이를 제한하는 방법

gitbranch --format 문자열 길이를 제한하는 방법

나는 다음과 같은 ~/.gitconfig별칭을 가지고 있습니다:

b = "!r() { count=10; git for-each-ref --sort=-committerdate refs/heads --format='%(HEAD)%(color:bold green)%(committerdate:relative)|%(color:yellow)%(refname:short)|%(color:red)%(objectname:short)%(color:reset)|%(color:blue)%(subject)|%(color:magenta)%(authorname)%(color:reset)' --color=always --count=${count:=10} | column -c 10 -ts '|'; }; r"

이 함수의 문제점은 가장 긴 행을 기준으로 문자열의 형식을 지정한다는 것입니다. 즉, 다음 값이 포함된 테이블이 있는 경우이는 출력이 아니며, 동작을 보여주는 git branch --format예일 뿐입니다.column):

a, b, c
x, yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy, z

그러면 다음과 같습니다

a, b                                                  , c
x, yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy, z

이는 좋은 동작 column이지만 문자열 길이를 자르고 싶습니다. 예를 들어 4보다 긴 열은 없습니다.

a, b   , c
x, yyyy, z

awk나는 다음과 같은 작업을 수행하기 위해 파이프를 추가했습니다 (25자 사용).

b = "!r() { count=10; git for-each-ref --sort=-committerdate refs/heads --format='%(HEAD)%(color:bold green)%(committerdate:relative)|%(color:yellow)%(refname:short)|%(color:red)%(objectname:short)%(color:reset)|%(color: blue)%(subject)|%(color:magenta)%(authorname)%(color:reset)' --color=always --count=${count:=10} | column -c 10 -ts '|' | awk '{for(i=1;i<NF;i++){$i=substr($i,1,25)}; print $0}'; }; r"

하지만 테이블이 엉망이 되었어요 :(

*또한 현재 분기 시작 부분에서도 오류가 발생합니다.

이 문제를 어떻게 해결할 수 있나요?

  • column너비를 제어 할 수 있는 옵션이 있는 최신 버전을 설치하려고 했지만 -c할 수 없습니다. :((에서 다운로드함)여기그런 다음 시도해 보세요 ./configure && make install. 예상대로 작동하지 않습니다).
  • 개행 형식 지정 기능을 사용해 보았지만 \성공하지 못했습니다. 함수가 gitconfig그렇게 보기 흉해 보여야 하나요?
$ git --version
git version 2.34.1

답변1

column출력 너비 제한을 이해하는 구현 에 액세스할 수 없는 경우 한 가지 접근 방식은 에서 이를 수행하는 것입니다 awk. 그러나 구현 논리는 간단하지만 함수의 길이를 늘립니다 gitconfig.

awk -F'|' -v maxw=4 '{for (i=1;i<=NF;i++) {l=length($i); if (l>maxw) l=maxw; if (l>mw[i]) mw[i]=l; lines[NR]=$0}}
    END{for (j=1;j<=NR;j++) {n=split(lines[j],f,/\|/); for(i=1;i<=n;i++) {printf("%*s%s",mw[i],substr(f[i],1,maxw),i==n?ORS:OFS)}}}'

보시다시피, awk프로그램은 입력을 다음으로 분할합니다 |(이것이 명령의 실제 출력이라고 부르는 것입니다 git branch).

  • 각 행에 대해 모든 필드를 반복하고 mw배열의 각 열에 대한 최대 필드 너비를 저장하지만 변수에 지정된 최대 너비까지만 저장합니다 maxw.
  • 그런 다음 각 행의 "원시" 내용(원래 필드 구분 기호 포함)을 버퍼링된 배열에 저장합니다 lines.
  • 입력이 끝나면 버퍼를 반복 lines하고 행을 다시 |배열로 분할합니다 f. 각 항목에 대해 최대 필드 문자를 인쇄합니다 f. 여기서 필요한 필드 너비는 해당 열의 배열에서 가져옵니다.maxwprintfmw

귀하의 예에서 (그러나 표시된 |것 대신 실제 -separation을 가정하면) 출력은 다음과 같습니다.,

a    b c
x yyyy z

관련 정보