Git
을 사용하다 히스토리에 기록된 이메일
과 이름 정보
를 수정할 일이 생겨 이참에 수정 방법에 대해 포스팅해보려고합니다
🚨 주의: 작업 환경 준비
기존 프로젝트에 직접 작업하지 마세요!
다음 절차를 따라 새로 클론한 저장소에서 작업을 진행하세요.
- 현재 작업 중인 프로젝트가 있다면 변경사항을 커밋하거나 백업하세요.
- 원격 저장소를 새 폴더에 클론합니다:
git clone <원격 저장소 URL> <새 폴더 이름>
- 새로 클론한 저장소에서 아래의 모든 작업을 진행하세요.
1. git filter-repo
설치
git filter-repo
는 Git의 기본 명령어에 포함되지 않으므로 별도로 설치해야 합니다.
📝 1.1. Python 설치 여부 확인
먼저 Python이 설치되어 있는지 확인합니다:
python --version
또는:
python3 --version
팁: Python이 설치되지 않았다면 Python 공식 웹사이트에서 설치하세요. 설치 시 pip(Python 패키지 관리자)도 함께 설치되었는지 확인하세요.
🛠️ 1.2. pip를 통해 git filter-repo
설치
Python과 pip가 준비되었다면, 아래 명령어로 git-filter-repo
를 설치합니다.
pip install git-filter-repo
✅ 1.3. 설치 확인
설치가 완료되었는지 아래 명령어로 확인합니다:
git filter-repo --version
2. 수정 대상 데이터 확인하기
🔍 2.1. 이메일 및 이름 데이터 확인
히스토리에서 이메일과 이름 정보를 확인합니다.
다음 명령어를 실행하여 필요한 데이터를 확인하세요:
git log --all --format="%h - author: %an <%ae> / committer: %cn <%ce>"
- 출력 예시:
abc123 - author: John Doe <johndoe@example.com> / committer: Jane Smith <janesmith@example.com>
팁: 결과에서 수정하고자 하는 이메일과 이름을 찾아 emails_to_update 리스트에 추가하세요.
3. Git 히스토리 이메일 및 이름 수정
git filter-repo
를 사용하여 이메일과 이름을 수정합니다.
아래는 Test용 데이터로 작성된 스크립트입니다.
🔄 3.1. git filter-repo
실행
아래 코드를 사용해 이메일과 이름을 수정하세요:
git filter-repo --force --commit-callback "
# 수정 대상 이메일 및 이름
old_emails = ['oldemail@example.com', 'testuser@example.com'] # 기존 이메일
new_email = 'newemail@example.com' # 변경할 이메일
old_names = ['Old Name', 'Test User'] # 기존 이름
new_name = 'New User' # 변경할 이름
# 바이트 문자열을 일반 문자열로 변환
def to_str(byte_str):
return byte_str.decode('utf-8') if isinstance(byte_str, bytes) else byte_str
# 일반 문자열을 바이트 문자열로 변환
def to_bytes(string):
return string.encode('utf-8') if isinstance(string, str) else string
with open('filter-repo-debug.log', 'a') as log_file:
# 이메일 및 이름 가져오기
author_email = to_str(commit.author_email)
committer_email = to_str(commit.committer_email)
author_name = to_str(commit.author_name)
committer_name = to_str(commit.committer_name)
# 로그 기록
log_file.write(f'Processing commit: {author_email}, {committer_email}, {author_name}, {committer_name}\\n')
# 이메일 수정
if author_email in old_emails:
log_file.write(f'Updating author_email: {author_email} -> {new_email}\\n')
commit.author_email = to_bytes(new_email)
if committer_email in old_emails:
log_file.write(f'Updating committer_email: {committer_email} -> {new_email}\\n')
commit.committer_email = to_bytes(new_email)
# 이름 수정
if author_name in old_names:
log_file.write(f'Updating author_name: {author_name} -> {new_name}\\n')
commit.author_name = to_bytes(new_name)
if committer_name in old_names:
log_file.write(f'Updating committer_name: {committer_name} -> {new_name}\\n')
commit.committer_name = to_bytes(new_name)
"
🔍 3.2. 결과 확인
수정된 이메일과 이름 정보를 확인합니다:
git log --all --format="%h - author: %an <%ae> / committer: %cn <%ce>"
4. 원격 저장소 다시 설정
git filter-repo
를 사용한 경우 원격 저장소(remote)와 로컬 저장소의 커밋 히스토리가 달라집니다.
따라서 원격 저장소를 다시 설정하거나 강제로 푸시해야 합니다.
4.1. 기존 원격 저장소 백업
기존 원격 저장소를 백업하거나 이름을 변경해 데이터 유실을 방지합니다.
git remote rename origin origin-backup
팁: 원격 저장소를 백업하지 않아도 괜찮다면 이 단계는 생략 가능합니다.
4.2. 원격 저장소 재설정
수정된 로컬 저장소를 새로운 원격 저장소에 연결합니다.
git remote add origin <원격 저장소 URL>
4.3. 강제 푸시
수정된 히스토리를 원격 저장소에 강제로 푸시합니다.
git push origin main --force
팁:
--force
또는--force-with-lease
옵션을 사용하세요. 강제 푸시는 기존 히스토리를 덮어쓰기 때문에 협업 중인 경우 팀원들에게 반드시 사전 안내를 해야 합니다.
4.4. 최종 확인
원격 저장소에 수정된 내용이 정상적으로 반영되었는지 확인합니다.
git log origin/main --oneline
5. 캐시와 불필요한 데이터 정리
Git 저장소의 캐시와 임시 데이터를 정리합니다.
rm -rf .git/refs/original/
git reflog expire --expire=now --all
git gc --prune=now --aggressive
6. 팀원에게 안내하기
6.1. 팀원의 로컬 저장소 초기화
팀원들은 기존 로컬 저장소가 새로운 히스토리와 충돌하지 않도록 초기화 후 다시 클론해야 합니다.
rm -rf <로컬 저장소 폴더>
git clone <원격 저장소 URL>
중요: 반드시 새로운 저장소를 기반으로 작업해야 합니다.
기존 원격 저장소를 대체했다면 팀원들에게 이를 공지하세요.
✨ 정리
- 클론 작업: 기존 프로젝트에 작업하지 말고 새로운 클론 저장소를 생성.
- 설치: Python 설치 여부 확인 → pip로
git filter-repo
설치. - 데이터 확인:
git log
를 사용해 이메일과 이름 정보를 확인. - 수정 작업:
git filter-repo
스크립트를 실행하여 이메일과 이름 수정. - 원격 저장소 재설정: 기존 원격 저장소를 백업 후 재설정 및 강제 푸시.
- 정리: 불필요한 캐시와 데이터를 정리.
- 팀원 안내: 새로 생성된 원격 저장소에 클론하도록 안내.
'Git' 카테고리의 다른 글
[Git] 한 컴퓨터에서 두 개의 Git 계정 사용하는 방법 (0) | 2024.10.18 |
---|---|
[Git] 훌륭한 Git 커밋 메시지의 7가지 규칙 (0) | 2024.02.15 |
[GIT] 깃 push 오류 #The current branch master has no upstream branch.To push the current branch and set the remote as upstream, use (0) | 2023.03.10 |
[ubuntu][Git] 아이디 패스워드 저장하기 (0) | 2022.05.28 |
[GitHub] 개인 액세스 토큰 만들어 인증하기 Support for password authentication was removed on August 13, 2021. (0) | 2021.10.01 |