sed를 사용하여 git commit sha 및 패턴만 인쇄

sed를 사용하여 git commit sha 및 패턴만 인쇄

OSX의 터미널에서 이것을 실행하면 다음과 같은 git 로그 형식이 제공됩니다.

* 58dbb08 Joe Blogs 5 weeks ago | [ABC-123] Commit message contents 
* 5a9c5e1 Jane Doe 3 weeks ago | Commit Contents with XYZ-987 jira ticket number
* 6070ee0 Some Person 3 weeks ago | Commit which references [MNO-456, MNO-999]

OSX의 CLI(git log, grep, sort, sed 사용)에서 다음 형식으로 로그를 인쇄할 목록을 생성하고 싶습니다.

  58dbb08 │ ABC-123
  5a9c5e1 │ XYZ-987
  6070ee0 │ MNO-456, MNO-999
──────────│──────────────────────
   ꜛ sha  │  ꜛ jira tickets

그 목적은 QA가 git 커밋에서 참조된 Jira 티켓 목록을 추출한 다음 목록을 보고 관련 커밋/티켓을 쉽게 찾을 수 있도록 하는 것입니다.

sed패턴을 추출하고 교체한 후 일치하는 패턴만 인쇄하는 방법을 이해한 경험이 거의 없고 따라가기가 어렵습니다. 문서를 읽었지만 unix/regex에 대한 노출이 거의 없다는 점을 고려하면 일부 언어는 익숙하지 않으며 여러 패턴을 추출하고 일치하지 않는 문자열을 바꾸는 방법을 해독할 수 없습니다.


나는 현재 무엇을 하고 있나요?

git log --oneline 7.2.0..HEAD | 
    grep -iEo "([a-f0-9]{7})(.*[a-zA-Z0-9]{2,6}-[0-9]{1,4})+" | 
    sort -u | 
    sed -n "s/\([a-zA-Z0-9]\{2,7\}-[0-9]\{1,4\}\)/, \1 /pg"

이것이 나를 만든다;

58dbb08 Joe Blogs 5 weeks ago | [, ABC-123
5a9c5e1 Jane Doe 3 weeks ago | Commit Contents with , XYZ-987 
6070ee0 Some Person 3 weeks ago | Commit which references [, MNO-456 , , MNO-999

가깝지만 필요하지 않은 것을 버릴 수는 없어요

답변1

그래서 나는 내 작은 두뇌를 밀어서 처벌하고 알아 냈습니다.추악한 해결책.

나는 이것이 최선이라고 생각하지 않으므로 여전히 도움과 개선 사항에 감사하고 받아들입니다!

git log 7.2.0..HEAD --oneline | 
    grep -iEo "([a-f0-9]{7})(.*[a-zA-Z0-9]{2,6}-[0-9]{1,4})+" | 
    sort -u | 
    sed -E $'s/([a-f0-9]{7}|[a-zA-Z0-9]{2,7}-[0-9]{1,4})/ \\\n\\1\\\n/g' | 
    grep -iEo "([a-f0-9]{7}|[a-zA-Z0-9]{2,6}-[0-9]{1,4})+" | 
    tr '\n' ' ' | 
    sed -E $'s/([a-f0-9]{7})/\\\n\\1 →/g' | 
    sed -E 's/([a-zA-Z0-9]{2,7}-[0-9]{1,4})/\1,/g' | 
    sed -E 's/(..)$//'

sed이 명령은 insert some을 사용하여 일치하는 표현식을 여러 줄로 분할한 \n다음 grep다시 필요한 표현식이 되어 유지만 합니다. 마지막으로 다시 돌아가서 해당 문자를 각각 및 문자 \n로 바꾼 다음 마지막 문자를 자릅니다 .,,

나는 결국 :

58dbb08 → ABC-123
5a9c5e1 → XYZ-987
6070ee0 → MNO-456, MNO-999

나는 이것이 200개 커밋보다 작은 로그 크기에 대해 매우 빠르다는 것을 알았습니다. 그 목적은 릴리스 노트에서 일부 문제 목록을 생성하는 데 도움을 주는 것이므로 그 이상은 아니어야 합니다. 그러나 속도/품질 개선은 호평을 받았습니다!

관련 정보