git filter-branch

Published at 2025-07-01

TIL - git filter-branch

날짜: 2025년 7월 1일

imageㄹㅇㄴㄹ.png

과거 커밋 중 빨간색 그래프인 커밋의 작성자를 변경하고 싶다.

git rebase 로 변경하고 —continue 옵션으로 나머지 커밋은 통과했더니 위에 쌓인 커밋들의 날짜가 현재 날짜로 바뀌어버린다.

하지만 다른 커밋은 그대로 유지하고 싶다.

이럴때 깃 전체 히스토리를 수정하는 git filter-branch 를 쓸 수 있다.

git filter-branch -f --env-filter '
if [ "$GIT_COMMIT" = "변경할_커밋의_해시" ]; then
    export GIT_AUTHOR_NAME="변경할 작성자"
    export GIT_AUTHOR_EMAIL="변경할 이메일"
    echo "Changed POST request commit: $GIT_COMMIT"
fi
' --tag-name-filter cat -- --branches --tags

명령어 각 부분 설명

  • git filter-branch
    • 모든 커밋을 하나씩 처리하면서 Git 히스토리를 다시 작성하는 도구
  • -f
    • force. 강제로 덮어씀
  • --env-filter
    • 각 커밋의 환경변수를 수정하는 필터
  • 스크립트 부분
    • $GIT_COMMIT: 현재 처리 중인 커밋의 해시
    • if 조건: 특정 커밋 해시와 일치하는지 확인
    • export: 해당 커밋의 작성자 정보를 새로 설정
    • echo: 터미널에 변경 사실을 출력 (디버깅용)
  • -tag-name-filter cat
    • 태그 이름을 어떻게 처리할지 결정
    • cat: 태그 이름을 그대로 유지
  • - --branches --tags
    • -: 옵션과 대상을 구분하는 구분자
    • -branches: 모든 브랜치를 대상으로 처리
    • -tags: 모든 태그도 함께 처리

실행 과정

  1. Git이 모든 커밋 하나씩 순회
  2. 각 커밋마다 $GIT_COMMIT 변수에 해시 저장
  3. 스크립트에서 조건 확인
  4. 조건에 맞다면 환경변수 변경 후 커밋 재생성
  5. 모든 브랜치에 1~4과정 실행
  • 주의할 점은 전체 Git 히스토리를 변경하기 때문에 백업 브랜치를 생성해야 한다. 그리고 같은 이유로 커밋이 많으면 시간이 오래 걸린다.