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

Ответ 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-адреса и проверьте имя и адрес электронной почты верны.