Git commit 이력 timestamp 변경 없이 작성자 변경하기

Lina·2022년 5월 27일
0

macOS 에서 작성 및 커밋했던 이력의 작성자 한글 분리 현상이 거슬려서 영문 이름을 쓰기로 했다. 하지만 이미 푸시된 과거의 이력들.. 결국 전체 이력에서 작성자 정보만을 변경하기로 결정하고 폭풍 구글링으로 방법을 찾았다. 나중에 또 필요할지 몰라서 내가 필요해서 하는 기록.

(!) 참고 : 이 방법은 rebasefilter-branch 명령어를 사용하므로 기존과 다른 branch 이력이 만들어집니다. 따라서 이력 수정 후 완전히 달라진 branch를 강제로 밀어넣기가 불가능할 경우에는 적용하지 않는 것을 권고합니다.

1. 프로젝트 디렉토리에서 git log 백업 (timestamp 보관용)

git log --pretty='%ct %at %s' --all > ../hashlog
  • 나는 모든 이력 변경이 필요해서 --all 옵션을 주었으나, 필요한 부분이 따로 있는 경우에는 <revision-range> 형태로 입력하면 된다.
    • cf. BASE..HEAD
    • 다른 형태의 범위 지정이 필요할 경우 구글링을 추천

2. rebase 수행 (일일이 입력할 필요 없이 한 번에 수행됨)

GIT_AUTHOR_EMAIL=lina@aterilio.kr git rebase --root -x "bash -c 'git commit --amend --reset-author -CHEAD --date=\"\$(git show --format=%ad -s)\"'"
  • 맨 앞의 메일 주소에 작성자 정보 형태("Lina <lina@aterilio.kr>")로 입력했더니 중복된 정보(Lina <Lina lina@aterilio.kr>)로 저장됨
  • 저장된 사용자 정보 중 메일로 매칭해서 정보를 읽어오는 것으로 추정
    • git global 정보에 name : Lina / email : lina@aterilio.kr 로 저장되어 있을 때 lina@aterilio.kr 만 입력해도 Lina <lina@aterilio.kr> 로 표기됨
  • 원래 이 명령어 하나로 본 포스팅의 목적을 달성할 수 있을 것으로 기대했으나 timestamp 유지가 안되는 것으로 확인되어 추가 작업을 진행함 (필요없는 명령어 포함되었을 수 있음)

3. 백업해 놓은 로그 파일에서 timestamp 복구하기

git filter-branch --env-filter '__date=$(__log=$(git log -1 --pretty="%at %s" $GIT_COMMIT); grep -m 1 "$__log" ../../../hashlog | cut -d" " -f1); test -n "$__date" && export GIT_COMMITTER_DATE=$__date || cat'
  • 주의사항 : 1번에서 지정한 백업 파일 경로보다 3번에서 지정하는 백업 파일 경로는 2단계 더 상위에 위치
    • 1번에서 ../hashlog 로 저장 > 3번에서 ../../../hashlog 로 지정해야함
  • filter-branch 역시 커밋 내역을 변경할 수 있는 명령어 이므로 매우 주의해서 사용 필요!!

4. 원격 저장소에 이미 올라갔다면 원격 저장소에도 업데이트

 git push origin -f master
  • git push [remote_repo] -f [remote_branch]
  • 단, 원격 저장소에 강제 밀어넣기 (push --force) 가능한 경우에만 사용

출처


덧.

* interactive 하게 작성자 변경하기

# case1. root 부터 선택
git rebase -i --root

# case2. 특정 커밋부터 선택
# git rebase -i {변경할 커밋의 해시값}^
git rebase -i 629dae1^
  • 명령어 실행 후 편집기로 커밋 로그 목록이 나오면, 수정할 커밋만 특정하여 pick -> edit 으로 수정 후 저장
  • 선택(edit 으로 수정)한 commit 들의 rebase 를 아래와 같이 진행
    # 수정할 내용 작성
    git commit --amend --author="Lina <lina@aterilio.kr>"
    # 다음 항목으로 이동
    git rebase --continue
    • git commit --amend 를 입력하면 각각의 커밋 내용이 뜨면서 커밋 내용을 수정할 수 있다.
    • 수정할 부분을 모두 반영한 뒤에 저장하고 밖으로 나오면 git rebase --continue 를 입력하여 다음 항목으로 진행한다.
    • 모든 수정할 항목을 반영하면 rebase 가 완료된다.

0개의 댓글