Git diff driver를 구축하는 방법
Source: Hacker News
제가 2024년 11월부터 쓰고 싶어 했던 주제 중 하나는 git diff를 사용할 때 파일 간 차이를 비교하기 위한 외부 명령을 만드는 방법입니다.
renovate-packagedata-diff를 구현하면서 이와 관련된 문서가 부족하다는 것을 발견했기 때문에, 이에 대해 블로그에 정리하면 좋겠다고 생각했습니다.
(그 후에 Git Diffs 매뉴얼 페이지(the Git Diffs man page)에 일부 문서가 있다는 것을 알게 되었지만, 찾기 쉽지는 않았습니다.)
이 주제는 한동안 TODO 리스트에 남아 있었고, 최근에 Andrew Nesbitt님의 훌륭한 글(Git Diff Drivers)과 이번 주에 oasdiff를 사용해 OpenAPI 스펙을 비교하는 작업을 하면서 다시 주목하게 되었습니다.
이번 기회를 통해 이 동작 방식을 블로그에 정리하고, oasdiff를 diff driver로 사용하는 별도 포스트(a separate post for oasdiff as a diff driver)도 추가하려 합니다.
Note: 이것은 출력에 더 많은 정보를 노출하고 싶을 때이며,
(binary)파일을 더 차이‑가능한 텍스트 형식으로 변환하기 위해textconv방식을 사용할 수 없는 경우입니다. 많은 경우에textconv를 사용하는 것으로 충분합니다.
Source: …
어떤 인수를 처리해야 할까요?
많은 도구가 tool [before] [after] 형태로 실행된다고 가정하면 바로 사용할 수 있지만, git diff는 외부 도구에 7개의 인수를 전달합니다. 이는 더 풍부한 데이터를 제공하여 유용하게 활용될 수 있습니다.
작동 예시
기존 파일 업데이트
renovate-packagedata-diff
renovate/github-co-cddo-api-catalogue.json # 1: 저장소 내 파일명
/tmp/git-blob-shryRa/github-co-cddo-api-catalogue.json # 2: "before"
f0a1311ae439fff36f994a3be5d5a7eb7d7a34dc # 3: "before" 파일의 SHA‑1 해시
100644 # 4: "before" 파일의 8진수 모드
/tmp/git-blob-y2mrZp/github-co-cddo-api-catalogue.json # 5: "after"
e39975894a72f706e6a59bccf31120ffaa219ff3 # 6: "after" 파일의 SHA‑1 해시
100644 # 7: "after" 파일의 8진수 모드새 파일 추가
renovate-packagedata-diff
renovate/github-co-cddo-api-catalogue.json # 1: 저장소 내 파일명
/dev/null # 2: "before"
. # 3: "before" 파일의 SHA‑1 해시
. # 4: "before" 파일의 8진수 모드
/tmp/git-blob-iAbnMD/github-co-cddo-api-catalogue.json # 5: "after"
5c55e5b99b21db68c360419d44dac906c336bec6 # 6: "after" 파일의 SHA‑1 해시
100644 # 7: "after" 파일의 8진수 모드파일 삭제
renovate-packagedata-diff
renovate/github-co-cddo-api-catalogue.json # 1: 저장소 내 파일명
/tmp/git-blob-aBldZ4/github-co-cddo-api-catalogue.json # 2: "before"
6b24e38aa4aac8e00e44ab68e156744138ef6afc # 3: "before" 파일의 SHA‑1 해시
100644 # 4: "before" 파일의 8진수 모드
/dev/null # 5: "after"
. # 6: "after" 파일의 SHA‑1 해시
. # 7: "after" 파일의 8진수 모드- 파일이 생성되거나 삭제될 때는
/dev/null을 사용합니다. - 해당 경우에 관련 없는 인수는
.로 전달됩니다.
또한 GIT_PAGER_IN_USE 환경 변수가 설정되어 있는지 확인하면, 일반 호출과 git diff 인수 모두를 처리하도록 명령을 구성할 수 있습니다.
oasdiff 사용 예시
위에서 언급한 바와 같이 my separate post about this에 따라, 위 정보를 사용하면 OpenAPI 사양을 비교하기 위해 oasdiff 도구에 대한 가벼운 래퍼를 쉽게 작성할 수 있습니다.
간단한 구현 예시:
#!/usr/bin/env bash
# A diff driver for `git diff` to provide a human‑readable changelog for a given OpenAPI spec
# (based on https://www.jvt.me/posts/2026/04/11/oasdiff-driver/)
if [[ "$2" == "/dev/null" ]]; then
echo "$1 was added"
exit 0
elif [[ "$5" == "/dev/null" ]]; then
echo "$1 was deleted"
exit 0
fi
# Prefer colour always reported
oasdiff changelog "$2" "$5" --color always이 스크립트는 권한 변경을 처리하지 않으며, 필요에 따라 보고할 수 있습니다. 또한 파일의 SHA‑1 체크섬을 기반으로 결과를 캐시하는 것이 좋을 수 있습니다.