Github 잔디 안심어지는 문제 원인과 해결 과정

D uuu·2024년 6월 20일
0

에러해결

목록 보기
1/7

문제 상황

지금까지 작업했던 커밋이 contribution(일명 잔디) 에 반영이 안되는 문제가 발생했다. 커밋할때마다 git 에 커밋수가 올라갔기 때문에 전혀 눈치채지 못하고 있었는데, 잔디가 얼마나 심어졌나하고 궁금증에 들어가보니 잔디가 전혀 심어져 있지 않은 걸 발견했다...! (90커밋이 넘었는데.....)

원인

이유를 찾아보니 주로 github 계정에 등록된 이메일과 커밋해서 푸시를 날리는 local 환경의 이메일 설정이 다르기 때문에 발생한다고 되어 있었는데, 나 역시 이메일이 서로 달라서 생긴 문제였다.

확인

우선 깃허브 이메일을 확인하려면 git 오른쪽 상단에 "내 계정 > setting" 에 들어가 왼쪽 navbar 에서 email 을 클릭하면 git 계정에 등록된 이메일 주소를 볼 수 있다.

그 다음 git log 를 통해서 지금까지 작성한 commit 들을 살펴봤다.
commit 의 author 부분을 보면 이메일 주소가 git 계정에 등록된 이메일 주소와 달랐다.

$ git log

해결 방법

우선 이메일 주소를 git 계정에 등록된 이메일로 고쳐줘야 했고, 누락된 잔디 역시 다시 찾아와야 했다.

이메일 설정하기

먼저 local 환경의 git전체에 email값을 설정하기 위해 터미널에 아래와 같이 올바른 이메일 주소를 넣어 수정해준다.

$ git config --global user.email "올바른 이메일 주소"

그 다음 터미널에 아래 명령어를 치면 올바른 이메일 주소로 바뀐 걸 확인할 수 있다.

$ git config --list

누락된 잔디 되찾는 방법

우선 주의해야 할 점은 원본 리포지토리를 변경하는 작업이기 때문에 신중해야 한다는 점이다.
보다 안전하게 진행하기 위해 백업 후 진행하는 걸 권장하며 특히 --force 와 같은 명령어는 강제로 실행시키는 명령어이기 때문에 유의해서 사용해야 할 필요가 있다!

나는 개인 프로젝트이고 지금까지 작업한 것들이 모두 누락됐기 때문에 진행하기로 했다.

첫번째 방법 - rebase 사용하기

git rebase 는 커밋의 메시지를 수정하거나, 여러 커밋을 하나로 합치거나 또는 반대로 하나의 커밋을 여러개로 나누는 등 세밀한 작업을 할 수 있는 도구이다.
따라서 rebase 는 세밀한 작업을 할 때는 매우 유용하지만, 일일이 수정을 해줘야 하는 번거로움이 따른다.

나는 수정해야 할 커밋수가 90개가 넘었기 때문에 중간에 실수 할 수도 있고, 충돌이 날 수도 있기 때문에 rebase 는 적합하지 않다고 판단했다.

$ git rebase -i HEAD~n  # n은 변경하고자 하는 커밋 수

만약에 90개의 커밋을 수정해야 한다면
$ git rebase -i HEAD~90 

두번째 방법 - git-filter-repo 사용하기

한번에 수정할 방법이 없을까 하고 찾던 중 git-filter-repo 를 알게 됐다.
git-filter-repo는 전체 Git 저장소의 히스토리를 대규모로 변경하는 데 사용되는 강력한 도구이다.

git-filter-repo 설치하기

우선 git-filter-repo 를 사용하기 위해서는 설치가 필요하다.
git-filter-repo 는 pyhton 스크립트로 만약 python 이 설치되어 있지 않다면 python 도 설치해줘야 한다!

나는 새 터미널을 열어서 아래 명령어를 입력해 설치했다.

*mac 기준

  1. Python 설치 안되어 있는 경우, 설치 필요
$ brew install python
  1. Python 3 설치 버전 확인 (Python 3을 권장한다고 함)
$ python3 --version
  1. Python 이미 설치되어 있거나, 설치 이후 git-filter-repo 설치

터미널에서 나는 홈 디렉토리로 이동한 다음 git-filter-repo.git 을 clone 해줬다. 여기까지 했으면 이제 프로젝트 디렉토리로 이동해서 정보를 변경하는 작업을 수행할 수 있게 된다.

$ cd ~ 
$ git clone https://github.com/newren/git-filter-repo.git
$ cd ~/git-filter-repo
$ python3 git-filter-repo --analyze  (옵션 해도되고 안해도 됨)

git-filter-repo 사용하기

  1. 먼저 내 프로젝트 디렉토리로 이동한다.
    예를들어 프로젝트가 ~/Desktop/project-name 에 있다고 가정하면, 아래와 같다.
$ cd ~/Desktop/project-name
  1. .mailmap 파일 생성 및 작성

.mailmap 파일은 기존 이메일 주소를 새로운 이메일 주소로 매핑하는 데 사용된다. 아래 명령어를 통해 디렉토리에 .mailmap 파일을 생성해준다.

$ touch .mailmap

그 다음 아래 명령어를 통해 .mailmap 파일을 열어 작성해준다.

$ nano .mailmap

적용할이름 <적용할이메일> <구이메일> 이런식으로 작성해준 다음 아래 명령어로 빠져나온다.

Ctrl + O를 눌러 파일을 저장합니다.
Enter를 눌러 파일 이름을 확인 후 저장합니다.
Ctrl + X를 눌러 편집기를 종료합니다.

서유덕 <awesome36@daum.net> <duu@seoyudeog-ui-MacBookPro.local>
  1. git-filter-repo 실행

아래 명령어를 입력하면 git-filter-repo 가 실행되어 정보 변경이 이루어진다.

$ python3 ~/git-filter-repo/git-filter-repo --force --mailmap .mailmap
  1. 변경 사항 확인

git log 를 입력해보면 90여개의 커밋이 모두 제대로 수정된 걸 볼 수 있었다.

$ git log

  1. 원격 저장소에 변경 사항 푸시
$ git push --force origin main

위 명령어를 입력한 후 git 에 들어가보니 잔디가 잘 심어져 있었다😆

rebase vs git-filter-repo 어떤 방법이 나은가?

둘 중 어느 방법이 더 나은지는 사용 목적과 상황에 다르기 때문에 적절한 걸 잘 선택하면 된다. 나는 많은 커밋을 수정해야 했기 때문에 git-filter-repo 를 사용했는데, 만약 수정해야 할 갯수가 적다면 rebase 를 통해 수정하는 편이 낫다는 생각이 든다.

어쨋든 리포지토리를 수정하는 일은 어느정도 위험을 감수해야 하기 때문에 특히, 협업일 경우엔 충돌 위험성도 크고 크리티컬할 수 있다... 따라서 앞으로 이런일이 발생하지 않도록 미리 확인하는 습관을 들여야 겠다는 생각이 들었다..!

profile
배우고 느낀 걸 기록하는 공간

0개의 댓글

관련 채용 정보