개발자는 기록이 답이다

GitHub 잔디 안심어지는 오류 해결 방법 - git filter-branch 본문

카테고리 없음

GitHub 잔디 안심어지는 오류 해결 방법 - git filter-branch

slow-walker 2023. 8. 27. 01:53

 

최근에 백준, 프로그래머스 알고리즘 스터디를 하면서 커밋하고 푸시하는데, 잔디가 심어지지 않는 걸 발견했습니다.

해당 레포들어가서 확인해 보니 맨 위에 커밋빼고는 아래 커밋이 전혀 잔디에 반영이 안되어있었습니다.

 원인은 정확히 모르지만, codesejin이 제 깃헙 닉네임이고, 나머지 작성자는 제 로컬 환경의 OS 이름인 것 같습니다.

 

 

준비물은 다음과 같습니다.

Github > Settings > Emails에서 본인의 이름과 이메일을 확인해주세요!!

(반드시 닉네임이 아니라 이름이어야 합니다!)

 

 

 

 1. git log 명령어를 통해 이전 커밋들의 Author를 확인합니다.

sejinpark@Sejins-MacBook-Pro src % git log
commit 74bc43d3339f0aad2649f7890d09b14544a5bca2 (HEAD -> master, origin/master)
Author: sejin park <seijin0722@naver.com>
Date:   Sun Aug 27 00:23:15 2023 +0900

    :memo: LV_Bronze

commit 780bc62ef6a407c94108c0a9992460d7f6d44e44
Author: Sejin Park <sejinpark@Sejins-MacBook-Pro.local>
Date:   Thu Aug 24 20:12:58 2023 +0900

    :memo: LV_Bronze

commit 4b329e287cbcdbf4f91ecda9861360448d03c1f2
Author: Sejin Park <sejinpark@Sejins-MacBook-Pro.local>
Date:   Thu Aug 24 11:08:16 2023 +0900

    :memo: LV_Silver

commit 347a62826918437c5313759a82621ad24684e299
Author: Sejin Park <sejinpark@Sejins-MacBook-Pro.local>
Date:   Thu Aug 24 11:07:56 2023 +0900

 

2. 아래와 같은 명령어를 입력합니다.

git filter-branch --env-filter '
if [ "$GIT_AUTHOR_EMAIL" = "깃헙 로그의 Author에 있던 <>안에 있는 내용" ]; then
    export GIT_AUTHOR_NAME="깃헙 이름"
    export GIT_AUTHOR_EMAIL="깃헙 닉네임"
fi
' --tag-name-filter cat -- --branches --tags

 

- 명령어에 대한 해석

git filter-branch

 

이 명령어는 Git 히스토리를 변경하기 위한 도구입니다. 이를 사용하여 과거 커밋들을 다시 작성하거나 커밋 히스토리를 조작할 수 있습니다.

--env-filter '
if [ "$GIT_AUTHOR_EMAIL" = "sejinpark@Sejins-MacBook-Pro.local" ]; then
    export GIT_AUTHOR_NAME="sejin park"
    export GIT_AUTHOR_EMAIL="seijin0722@naver.com"
fi
'

 

여기서 `--env-filter` 옵션은 환경 변수를 수정하는 필터 스크립트를 지정합니다. 이 스크립트는 각 커밋마다 실행됩니다. 스크립트 내부에서 `GIT_AUTHOR_EMAIL` 환경 변수를 검사하여, 이메일이 "sejinpark@Sejins-MacBook-Pro.local"인 경우에만 작성자 이름과 이메일을 변경합니다. 즉, "sejinpark@Sejins-MacBook-Pro.local" 이메일로 작성한 커밋만 해당됩니다.

--tag-name-filter cat

 

`--tag-name-filter`는 태그 이름을 변경하는 필터입니다. 여기서는 태그 이름을 변경하지 않고 원래대로 유지합니다. `cat`은 태그 이름을 변경하지 않는다는 의미입니다.

 

-- --branches --tags

 

마지막으로 `--` 다음의 `--branches --tags`는 어떤 브랜치와 태그에 대해서 작업할 것인지 지정하는 부분입니다. 여기서는 모든 브랜치와 태그에 대해 작업을 수행하도록 지정했습니다.

요약하자면, 이 명령어는 이메일이 "sejinpark@Sejins-MacBook-Pro.local"인 커밋의 작성자 이름과 이메일을 변경하여 새로운 커밋 히스토리를 생성하게 됩니다. 이렇게 변경된 히스토리를 원격 저장소에 푸시하려면 강제로 푸시해야 할 수 있습니다. 그러나 강제 푸시는 다른 협업자들에게 영향을 줄 수 있으므로 주의해야 합니다.

 

3. 변경된 커밋 히스토리를 원격 저장소에 강제로 푸시합니다

git push origin master --force

 

이렇게 하면 커밋 내용의 Author가 github 계정으로 변경된걸 확인할 수 있고, 잔디도 채워진걸 볼 수 있습니다.