Допустим, что вы пишете какой-то проект, и в какой-то момент вам захотелось поменять e-mail либо ваше имя в истории Git. Причины могут быть самыми разными: от попытки скрыть e-mail до чисто эстетического перфекционизма. В Git есть возможность переписать историю, но пользоваться ей стоит с осторожностью. Если вы точно уверены, что проект пишете только вы, то можете смело пользоваться этим способом. Если же вы работаете в команде, или у вас есть форки по какой-то другой причине, то тысячу раз подумайте над тем, стоит ли менять историю Git, так как после смены истории все остальные разработчики и форки не смогут просто так залить свои изменения в основной репозиторий. Всем им придётся выкачивать исходники заново, так как репозиторий будет уже совсем другой, с другой историей и другими идентификаторами коммитов.
Если я вас всё ещё не отговорил от намерения сменить имя или e-mail в истории Git, то давайте приступим.
Для начала лучше выкачать чистую свежую bare копию вашего репозитория командой
1 |
git clone --bare https://github.com/username/repositoryname.git |
Вместо адреса нужно подставить свой адрес сервера и репозитория.
Зайдите в каталог с вашим репозиторием Git:
1 |
cd repositoryname.git |
Создайте файл «rewriteauthor.sh» и вставьте туда следующее содержимое:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#!/bin/sh git filter-branch -f --env-filter ' OLD_EMAIL="old-email@example.com" CORRECT_NAME="Correct Name" CORRECT_EMAIL="correct-email@example.com" 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 ' --tag-name-filter cat -- --branches --tags |
Поменяйте значения OLD_EMAIL (старый e-mail), CORRECT_NAME (новое, правильное имя) и CORRECT_EMAIL (новый, правильный e-mail) на свои.
Запустите скрипт на выполнение:
1 |
./rewriteauthor.sh |
Проверьте получившуюся историю в репозитории и сделайте push на сервер:
1 |
git push --force --tags origin 'refs/heads/*' |
Вот и всё. История переписана. Имейте в виду, что это теперь другой репозиторий, и всем остальным, кто с ним работает, нужно его выкачать заново.