git filter-branch
Published at 2025-07-01
TIL - git filter-branch
날짜: 2025년 7월 1일
과거 커밋 중 빨간색 그래프인 커밋의 작성자를 변경하고 싶다.
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
: 모든 태그도 함께 처리
실행 과정
- Git이 모든 커밋 하나씩 순회
- 각 커밋마다
$GIT_COMMIT
변수에 해시 저장 - 스크립트에서 조건 확인
- 조건에 맞다면 환경변수 변경 후 커밋 재생성
- 모든 브랜치에 1~4과정 실행
- 주의할 점은 전체 Git 히스토리를 변경하기 때문에 백업 브랜치를 생성해야 한다. 그리고 같은 이유로 커밋이 많으면 시간이 오래 걸린다.