Git, переписать предыдущие имена и сообщения электронной почты
Я совершил кучу коммитов для проекта в Github, однако я понял, что не создал надлежащего имени электронной почты и полного имени коммиттера на компьютере, который я сейчас использую, чтобы сделать мои коммиты и, следовательно, аватар пользователей и адрес электронной почты не существует.
Как я могу переписать все прошлые сообщения электронной почты и имена пользователей?
Ответы
Ответ 1
Вы можете добавить этот псевдоним:
git config alias.change-commits '!'"f() { VAR=\$1; OLD=\$2; NEW=\$3; shift 3; git filter-branch --env-filter \"if [[ \\\"\$\'echo \$VAR\'\\\" = '\$OLD' ]]; then export \$VAR='\$NEW'; fi\" \[email protected]; }; f "
Чтобы изменить имя автора:
git change-commits GIT_AUTHOR_NAME "old name" "new name"
или по электронной почте только за последние 10 коммитов:
git change-commits GIT_AUTHOR_EMAIL "[email protected]" "[email protected]" HEAD~10..HEAD
Alias:
change-commits = "!f() { VAR=$1; OLD=$2; NEW=$3; shift 3; git filter-branch --env-filter \"if [[ \\\"$'echo $VAR'\\\" = '$OLD' ]]; then export $VAR='$NEW'; fi\" \[email protected]; }; f "
Источник: https://github.com/brauliobo/gitconfig/blob/master/configs/.gitconfig
Ответ 2
Решение уже существует: Измените имя автора и коммиттера и e-mail нескольких коммитов в Git
А именно,
git filter-branch -f --env-filter \
"GIT_AUTHOR_NAME='Newname'; GIT_AUTHOR_EMAIL='newemail'; \
GIT_COMMITTER_NAME='committed-name'; GIT_COMMITTER_EMAIL='committed-email';" HEAD
Ответ 3
Если вы уже внесли некоторые из своих коммитов в общий репозиторий, вы не захотите этого делать, или он сделает альтернативную версию основной истории, которую другие могли использовать. "Не пересекайте потоки... Было бы плохо..."
Тем не менее, если это только те коммиты, которые вы сделали в своем локальном репозитории, то, во что бы то ни стало, исправить это, прежде чем нажимать на сервер. Вы можете использовать команду git filter-branch
с опцией --commit-filter
, поэтому она редактирует только коммиты, которые соответствуют вашей неправильной информации, например:
git filter-branch --commit-filter '
if [ "$GIT_AUTHOR_EMAIL" = "[email protected]_host.local" ];
then
GIT_AUTHOR_NAME="Your Name Here (In Lights)";
GIT_AUTHOR_EMAIL="[email protected]_host.com";
git commit-tree "[email protected]";
else
git commit-tree "[email protected]";
fi' HEAD
Ответ 4
После применения ответа Оливье Вердье:
git filter-branch -f --env-filter \
"GIT_AUTHOR_NAME='Newname'; GIT_AUTHOR_EMAIL='newemail'; \
GIT_COMMITTER_NAME='committed-name'; GIT_COMMITTER_EMAIL='committed-email';" HEAD
... для изменения истории изменений в исходном хранилище:
git push origin +yourbranch
Вышеуказанная команда (обратите внимание на плюс) заставляет переписывать историю в исходном репо. Используйте с осторожностью!
Ответ 5
Для тех, кому нужна просто версия для копирования (кроме обновления электронных писем и имен):
git config alias.change-commits '!'"f() { VAR=\$1; OLD=\$2; NEW=\$3; shift 3; git filter-branch --env-filter \"if [[ \\\"\$\'echo \$VAR\'\\\" = '\$OLD' ]]; then export \$VAR='\$NEW'; fi\" \[email protected]; }; f "
git change-commits GIT_AUTHOR_NAME "<Old Name>" "<New Name>" -f
git change-commits GIT_AUTHOR_EMAIL <[email protected]> <[email protected]> -f
git change-commits GIT_COMMITTER_NAME "<Old Name>" "<New Name>" -f
git change-commits GIT_COMMITTER_EMAIL <[email protected]> <[email protected]> -f
Ответ 6
https://help.github.com/articles/changing-author-info/
#!/bin/sh
git filter-branch --env-filter '
OLD_EMAIL="[email protected]"
CORRECT_NAME="yourName"
CORRECT_EMAIL="yourEmail"
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
это полностью сработало для меня. После git push убедитесь, что вы видите обновление на веб-портале git. Если фиксация все еще не была связана с моей учетной записью, рядом с фиксацией показывалось уменьшенное изображение по умолчанию, и это не было отражено на моей временной шкале вклада, перейдите к URL фиксации и добавьте .patch в конце URL-адреса и проверьте имя и адрес электронной почты верны.