스크립트는 Git 히스토리 커밋의 작성자 정보를 일괄적으로 수정하기 위해 git filter-branch를 사용하여 히스토리 커밋 기록을 재작성합니다
제공하신 스크립트는 Git 저장소의 과거 커밋에서 작성자 정보를 일괄적으로 수정하는 데 사용되며, 전체적인 아이디어는 올바르지만 git filter-branch
의 --env-filter
에서 배열(예: OLD_EMAILS=("...")
)을 사용하는 경우 일부 셸 환경(예: /bin/sh
)이 배열 구문을 지원하지 않아 호환성 문제가 발생할 수 있습니다
호환성을 높이기 위해 배열을 공백으로 구분된 문자열로 바꾸고, for
루프를 사용하여 각 기존 이메일 주소를 반복하는 것이 좋습니다. 다음은 수정된 스크립트 예제입니다:
#!/bin/sh
git filter-branch --env-filter '
OLD_EMAILS="TianlongXiang51@gmail.com nick@qq.com tianlongxiang51@gmail.com"
CORRECT_NAME="tianlong.xiang"
CORRECT_EMAIL="tianlong.xiang@foxmail.com"
for OLD_EMAIL in $OLD_EMAILS
do
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_COMMITTER_NAME="$CORRECT_NAME"
export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_AUTHOR_NAME="$CORRECT_NAME"
export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
done
' --tag-name-filter cat -- --branches --tags
주의사항:
-
스크립트를 실행하기 전에 예기치 않은 상황을 방지하기 위해 저장소를 백업하는 것이 좋습니다
-
이 작업은 Git 기록을 덮어쓰고, 커밋 작성자 정보를 수정하여 커밋 해시 값이 변경될 수 있습니다
-
변경 사항을 원격 저장소에 푸시했다면 강제 푸시를 사용해야 합니다
git push --force --tags origin 'refs/heads/*'
강제 푸시를 신중하게 사용하고, 특히 여러 사람이 협업하는 프로젝트에서는 다른 사람에게 영향을 미치지 않도록 주의하십시오
저장소의 모든 중복되지 않는 작성자 이메일 주소를 확인합니다
git log --format='%an <%ae>' | sort -u