문자열의 특정 부분의 변수에서 에코

문자열의 특정 부분의 변수에서 에코

좋은 명령을 내리려고 합니다 git log. 다음이 있다고 가정해 보겠습니다.

git log --color --pretty=format:"%C(cyan)<%an>" --abbrev-commit

내가 원하는 것은 %an출력 문자열을 기반으로 색상을 결정하는 변수를 만드는 것입니다.
지금까지 나는

USER=$(if [ ! %an = "my own user name" ]
    then
        echo "%C(cyan)<%an>"
    else
        echo %C(bold blue)<%an>
    fi)

그런 다음 변수를 git log에 넣어서

git log --color --pretty=format:"$USER" --abbrev-commit

해야 할 일은 커밋이 완료된 경우입니다.을 선택하면 내 사용자 이름이 청록색으로 인쇄되고, 그렇지 않으면 공동작업자의 사용자 이름이 굵은 파란색으로 인쇄됩니다. 그러나 그렇지 않습니다.

내가 여기서 뭘 잘못하고 있는지 아는 사람이 있는지 궁금합니다. 나는 이것이 이미 문자열인 환경에 변수를 인쇄하는 것과 관련이 있다고 생각하지만 문제를 해결하는 방법을 모르겠습니다. 도움을 주시면 감사하겠습니다!

답변1

Git의 형식 매개변수에 쉘 스크립트를 넣으려고 합니다. 물론 이것은 작동하지 않습니다. 1

  • 실제로 쉘 스크립트를 허용하는 몇 가지 Git 매개변수가 있습니다.git filter-branch; 그러나 해당 매뉴얼 페이지에 명시적으로 지정됩니다.

달성하려는 작업은 실제로 Git을 통하는 대신 외부 필터를 사용하여 이름을 일치시키고 색상을 구분하여 수행할 수 있습니다.ANSI 이스케이프 시퀀스.

예를 들어 작성자 이름이 "조 민"인 경우 이름과 꺾쇠 괄호를 청록색으로 강조 표시합니다. 그렇지 않으면 이름과 꺾쇠 괄호를 굵은 파란색으로 강조 표시합니다. 2 두 경우 모두 나머지 텍스트는 변경하지 않고 그대로 둡니다...

Perl 5를 필터로 사용하여 구현되었습니다.

git log "--pretty=tformat:%h <%an> %s" | perl -n -e '
chomp;
if(/^(.*)<([^>]*)>(.*)$/) {
    if ($2 eq "Joe Average") {
        print $1."\e[36m<".$2.">\e[39m".$3."\n";
    } else {
        print $1."\e[1m\e[34m<".$2.">\e[39m\e[0m$3\n";
    }
} else {
    print $_."\n";
}'

필터 로 사용하여 달성됨 sed(약간 해키 3 )...

git log "--pretty=tformat:%h <%an> %s" | sed '
s/<\(Joe Average\)>/\x1B[36m<\1>\x1B[39m/g;
t matched;
s/<\([^>]*\)>/\x1B[1m\x1B[34m<\1>\x1B[39m\x1B[0m/g;
:matched'

테스트 저장소의 일반 출력(필터 없음):

$ git log "--pretty=tformat:%h <%an> %s"
e7f3209 <Joe Average> improving portability
e3ebe74 <Jim Sixpack> adding first working prototype

강조 표시된 출력(두 필터 중 하나):

다음과 같은 경우 출력 형식을 변경하더라도 git log이러한 필터 명령은 계속 작동합니다 .

  • 작성자의 이름은 항상 포함됩니다 < >.
  • 한 줄에 한 명 이상의 작성자가 나타날 수 없습니다.
  • 다른 것은 포함되어 있지 않습니다 < >.

요청한 작업을 수행하는 또 다른 방법은 git log서로 다른 두 가지 호출을 수행하고 결과를 병합한 다음 타임스탬프별로 정렬하는 것입니다. 그러나 까다로운 부분은 두 호출의 출력이 겹치는 출력을 제공하지 않도록 하는 것입니다. (그렇게 하면 다른 이스케이프 시퀀스로 표시되므로 사용할 수 없습니다.)--author--prettygit loguniq


각주

  • 1 사실 인용부족으로 인해 귀하의if [ ! %an = "my own user name" ] ... USER=이 줄에서는 이미 실행되었습니다.( %an비교는 문자 그대로 수행됩니다. 셸에서는 특별한 의미가 없습니다.) USER="%C(cyan)<%an>"이는 명령을 호출하기 전에 효과적으로 수행됩니다 git log.
  • 2 또한 자신의 이름은 하늘색으로, 다른 사람의 이름은 굵은 파란색으로 강조하고 싶지만 원래 코드에서는 그 반대를 시도합니다.if (저자 이름)아니요(내 사용자 이름), 청록색으로 강조 표시됨, 그렇지 않으면 굵은 파란색으로 강조 표시됨. 나는 당신의 설명을 지지합니다.
  • 3 \xGNU sed 확장, GNU가 아닌 시스템에서 사용하는 경우 마일리지가 다를 수 있습니다.

답변2

[ ! %an = "my own user name" ]%an사용자 이름이나 다른 사용자 이름과 결코 동일하지 않기 때문에 항상 true입니다 . %anbash에 관한 한 이는 단지 리터럴 문자열이기 때문에 동일하다는 유일한 것입니다. 특별한 의미("저자 이름")만 가지고 있습니다.자식에서.

아마도 당신이 요구하는 것을 수행하는 영리한 방법이 있을 것입니다. 그러나 ATM 기계는 생각나지 않습니다. 나는 당신이하려는 것처럼 bash와 git을 혼합하여 그것을 할 수 없다고 생각합니다. 그러한 해결책이 있다면 아마도 매우 다루기 어려울 것입니다. 기본적으로 bash 수준과 git 수준 사이를 트램폴린해야 하며 git은 모든 커밋을 반복하지만 어떻게든 bash에 작성자 이름을 알려주어야 합니다.bash 레벨이 git에게 어떤 색상을 사용할지 알려줄 수 있도록 커밋하세요.

그 경우할 수 있는일단 완료되면 이것이 bash와 git의 혼합이 아닌 순수한 git 솔루션이 될 가능성이 높다고 생각합니다.

답변3

좋은 연습을 위해:

변수는 데이터를 보유합니다. 함수는 코드를 저장합니다. 변수에 코드를 넣지 마세요!

바라보다위키 울 프린지

관련 정보