개발자는 기록이 답이다
GitHub 잔디 안심어지는 오류 해결 방법 - git filter-branch 본문
최근에 백준, 프로그래머스 알고리즘 스터디를 하면서 커밋하고 푸시하는데, 잔디가 심어지지 않는 걸 발견했습니다.
해당 레포들어가서 확인해 보니 맨 위에 커밋빼고는 아래 커밋이 전혀 잔디에 반영이 안되어있었습니다.
원인은 정확히 모르지만, 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 계정으로 변경된걸 확인할 수 있고, 잔디도 채워진걸 볼 수 있습니다.