⚠ 깃허브 commit의 작성자 변경하기(위험, feat. git-filter-repo)

두선아 Dusuna·2023년 5월 6일
0

📖 reference & guide
1. git-filter-repo : https://github.com/newren/git-filter-repo/
2. git-filter-repo 설치 : https://github.com/newren/git-filter-repo/blob/main/INSTALL.md
3. mailmap이란? : https://git-scm.com/docs/gitmailmap#_examples

  1. 참고 레퍼런스 : https://medium.com/oktroco/git-hub에서-잘못된-author-바꾸기-4b1c95a68ad8

🚫 이 게시물은 --force를 통해 원격 레포지토리를 덮어쓰는 내용을 포함하고 있습니다.

개인 레포지토리 외에 협의 없이 사용하지 않으실게요~ 🙏

구분내용
문제 상황WSL에서 커밋 작성해서 원격 레포지토리로 올렸을 때, 기여도가 적용되지 않음
문제 확인하기Github과 Git log 확인, 기여도 Contribution activity의 기준 확인
문제 해결하기git-filter-repo를 사용해서 github 이전 커밋 변경

⚠ 깃허브 commit의 작성자 변경하기

교훈: config은 미리 잘 확인하자.


0. 요약

😰 오늘 분명 커밋했는데?

문제 상황

  • WSL(Windows Subsystem for Linux)에서 작업했던 커밋을 push 했을 때, 깃헙에서 activity로 나타나지 않는 현상이 발생했습니다.

문제 확인하기

  • git log 작성자 이메일 확인
    • Contribution activity의 기준

문제 해결하기

  • github 이전 커밋 변경
    - git-filter-repo 사용하기

1. 문제 파악하기 🤔

억울해요😭

  • Github에 작업을 올릴 때 Contribution activity가 보이지 않는 경우 발생했습니다.
  • 해당 repository에서 commit 기록을 살펴보니 5월 4일, 5월 5일의 커밋 내용이 있지만 뭔가 이상합니다.
    • 두 가지의 커밋 스타일이 보입니다.
      • dusunax authored and dusunax committed
      • dusunax committed

터미널의 git log으로 정확히 확인해봅니다.

  • git log를 살펴보니, 상단 두 개의 커밋과 세 번째 커밋의 Author의 이름과 이메일이 다른 것을 확인할 수 있었습니다.

항상 궁금했지만 그냥 넘어갔었던 깃허브 기여도 Contribution activity의 기준

  • 깃허브 Contribution activity는 다음 4가지 요소를 고려하여 계산됩니다.
    Contribution 유형기준
    Commit새로운 코드를 기여할 때
    Pull Request코드를 검토하고 머지할 때
    Issue새로운 이슈를 만들거나 기존 이슈에 코멘트를 작성할 때
    ReviewPull Request, Issue, Gist 등에 대한 리뷰를 작성할 때

사용자 기준 === 이메일

  • 또한 github에서 사용하는 이메일과 기기의 git config의 이메일이 일치해야 합니다.
    • author의 이름은 달라도 되지만 이메일이 다르다면 기여도에 포함되지 않습니다.

2. 문제 해결하기

author를 수정하기 vs 그냥 살기

  • 문제의 원인을 알았으니, 1) 이전 기여도를 포기하거나 2) 이전 커밋의 author를 수정하는 방법이 있습니다.
    원격 레포지토리의 이전 커밋을 수정하는 위험을 감수하느냐에 따라서 결정해 주세요!
  • 저는 호기심과 깃헙 잔디를 위해 author를 수정하기로 했습니다.

해결 방법 A. git filter-branch ❌

  • 예전에는 git filter-branch를 사용하여 작성자를 변경하는 것이 일반적이었다고 합니다.
    • 하지만 이제는 git filter-repo를 사용하는 것이 좋습니다.
  • 실제로 VSC 터미널에 filter-branch를 입력하면, Warning 메시지와 함께 실행되지 않고, git filter-repo 링크를 보여줍니다.
    set FILTER_BRANCH_SQUELCH_WARNING=1로 경고을 무시할 수 있습니다. 하지만 대안이 있는 경우, 경고를 따르는 것이 경험상 대체로 맞습니다.
    - git filter-branch로 이메일 주소를 변경하는 쿼리
git filter-branch --commit-filter '
  	if [ "$GIT_AUTHOR_EMAIL" = "dusuna@DESKTOP-GOH013C" ];
        then
          	GIT_AUTHOR_NAME="두선아 Dusuna";
   			GIT_AUTHOR_EMAIL="94776135+dusunax@users.noreply.github.com";
      	git commit-tree "$@";
	else
      	git commit-tree "$@";
	  	fi' HEAD
  • 경고 메시지
# WARNING: git-filter-branch has a glut of gotchas generating mangled history rewrites.
# Hit Ctrl-C before proceeding to abort, then use an alternative filtering tool
# such as 'git filter-repo' (https://github.com/newren/git-filter-repo/) instead.
# See the filter-branch manual page for more details;
# to squelch this warning, set FILTER_BRANCH_SQUELCH_WARNING=1.

-----------
(번역)
-----------
# 경고: git-filter-branch는 엉망으로 된 히스토리 재작성을 생성하는 많은 함정이 있습니다.
# 계속하기 전에 Ctrl-C를 눌러 중단하고 대신 'git filter-repo' (https://github.com/newren/git-filter-repo/)와 같은 대체 필터링 도구를 사용하세요.
# 자세한 내용은 filter-branch 매뉴얼 페이지를 참조하세요.
# 이 경고 메시지를 제거하려면 FILTER_BRANCH_SQUELCH_WARNING=1로 설정하세요.

해결 방법 B. git-filter-repo 👍

B-a. git-filter-repo 설치하기

  • git-filter-repo를 사용하기 위해서는 설치가 필요합니다. 해당 깃헙 repo를 참고하자면 git-filter-repo는 single-file python script로 구성되어 있습니다.
    • https://github.com/newren/git-filter-repo/#how-do-i-install-it
    • 저는 링크의 law 파일을 직접 다운로드 해서 사용했습니다.
      # 소스 파일 다운로드
      $ git clone https://github.com/newren/git-filter-repo.git
      $ cd git-filter-repo
    • python3으로 git-filter-repo를 분석합니다.
      # git-filter-repo 분석
      $ python3 git-filter-repo --analyze

🤔 analyze 관련 내용
analyze를 실행 했을 때, 이미 .git/filter-repo/analysis 폴더가 있다면 다음 에러가 발생합니다.

  • Error: dir already exists (use --force to delete): ".git/filter-repo/analysis”
    .git 폴더는 Git 저장소의 모든 정보가 저장되는 폴더입니다.
    이 폴더 안에 filter-repo 라는 폴더가 있으면, 이는 git-filter-repo 도구에서 필터링을 수행할 때 생성되는 폴더입니다.
    filter-repo 폴더는 다음과 같은 파일들을 포함합니다:
  • rev_list: Git 커밋 히스토리에서 필터링 대상인 커밋들의 리스트를 담고 있는 파일입니다.
  • map: 커밋의 해시 값을 새로운 해시 값으로 변경하는 매핑 정보가 담긴 파일입니다.
  • tag-rename-map: 태그 이름을 변경하기 위한 매핑 정보가 담긴 파일입니다.

이 폴더 안의 파일들은 git-filter-repo 도구에서 필터링 작업을 수행할 때 사용됩니다.
필터링 작업이 완료되면, filter-repo 폴더와 그 안에 있는 파일들은 더 이상 필요하지 않기 때문에, 작업이 끝나면 삭제할 수 있습니다.

B-b. .mailmap이란?, .mailmap 생성 & 작성하기

Git - gitmailmap Documentation

mailmap이란?

  • git의 mailmap은 작성자 이름, 이메일 주소 및 서명을 매핑하는데 필요한 정보를 담은 파일입니다.
    • 이를 통해 커밋 로그 및 다른 Git 도구에서 보여지는 작성자의 이름과 이메일 주소를 사용자가 원하는 대로 매핑할 수 있습니다.
  • 기본적으로 프로젝트 루트 디렉토리의 .mailmap에 작성합니다.

mailmap 작성 예시

  • 작성자 변경을 위해 .mailmap 파일을 생성합니다.
touch .mailmap
  • 아래는 두선아 Dusuna라는 이름의 사용자의 dusuna@DESKTOP-GOH013C 라는 이전 이메일 주소를 가진 커밋을, 94776135+dusunax@users.noreply.github.com라는 이메일 주소로 매핑하고자 하는 예시입니다.
두선아 Dusuna <94776135+dusunax@users.noreply.github.com> <dusuna@DESKTOP-GOH013C>
  • .mailmap 파일을 적용하여 이전 git 커밋에 이메일 주소를 강제로 필터, 매핑합니다.
    • !위험! git clone해서 사용하지 않았다가 큰일 날 수 있음!

      python3 git-filter-repo --force --mailmap .mailmap 
  • git log를 통해서 변경 사항을 확인합니다.
    • 잘 변경되었나요?
    • 의도한 대로 상단 두 개 커밋의 author 내용이 세 번째 커밋과 동일하게 변경된 것을 확인할 수 있습니다.
  • git push --force origin main
    • 충돌 걱정 없는 개인 레포지토리이므로 다시 --force로 push했습니다.
  • 그리고 또 이런 현상이 발생하지 않도록 git config을 github의 author와 같도록 고쳐줍니다.
    // git config user.email "내 이메일 주소"
    $ git config --global user.email 94776135+dusunax@users.noreply.github.com
    
    // git config user.name "내 사용자 이름"
    $ git config --global user.name 두선아 Dusuna

3. 적용 결과 확인 😄

  • 잔디 3개가 살아났습니다! 짝짝짝!
  • 이런 문제가 발생하지 않도록 가상 운영체제 환경에서 커밋하거나, 기기가 변경되었을 때 Author를 잘 설정해야 하겠습니다.
profile
안녕하세요.

0개의 댓글