Git, переписать имена пользователей и электронные письма предыдущих коммитов - PullRequest
120 голосов
/ 27 мая 2010

Я совершил кучу коммитов в проекте на Github, однако я понял, что не настроил правильную электронную почту и полное имя коммиттера на компьютере, который я сейчас использую, чтобы сделать свои коммиты и, следовательно, аватар пользователя и адрес электронной почты не существует.

Как я могу переписать всю предыдущую электронную почту и имена пользователей при коммите?

Ответы [ 6 ]

170 голосов
/ 02 августа 2012

Вы можете добавить этот псевдоним:

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\" \$@; }; f "

Чтобы изменить имя автора:

git change-commits GIT_AUTHOR_NAME "old name" "new name"

или по электронной почте только за последние 10 коммитов:

git change-commits GIT_AUTHOR_EMAIL "old@email.com" "new@email.com" 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\" \$@; }; f "

Источник: https://github.com/brauliobo/gitconfig/blob/master/configs/.gitconfig

81 голосов
/ 27 мая 2010

Решение уже существует: Измените имя автора и коммиттера и адрес электронной почты для нескольких коммитов в 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
30 голосов
/ 28 мая 2010

Если вы уже отправили некоторые из ваших коммитов в общедоступный репозиторий, вы не захотите это сделать, или это сделает альтернативную версию истории мастера, которую могли использовать другие. «Не пересекать потоки ... Это было бы плохо ...»

Тем не менее, если это только коммиты, которые вы сделали в свой локальный репозиторий, то непременно исправьте это, прежде чем вы перейдете на сервер. Вы можете использовать команду git filter-branch с параметром --commit-filter, поэтому она редактирует только те коммиты, которые соответствуют вашей неверной информации, например:

git filter-branch --commit-filter '
      if [ "$GIT_AUTHOR_EMAIL" = "wrong_email@wrong_host.local" ];
      then
              GIT_AUTHOR_NAME="Your Name Here (In Lights)";
              GIT_AUTHOR_EMAIL="correct_email@correct_host.com";
              git commit-tree "$@";
      else
              git commit-tree "$@";
      fi' HEAD
12 голосов
/ 11 сентября 2015

После применения ответа Оливье Вердиера:

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

Приведенная выше команда (обратите внимание на плюс) также принудительно переписывает историю в исходном репо. Используйте с осторожностью!

3 голосов
/ 18 мая 2018

Для тех, кому нужна версия с простым копированием (кроме обновления адресов электронной почты и имен):

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\" \$@; }; f "
git change-commits GIT_AUTHOR_NAME "<Old Name>" "<New Name>" -f
git change-commits GIT_AUTHOR_EMAIL <old@email.com> <new@email.com> -f
git change-commits GIT_COMMITTER_NAME "<Old Name>" "<New Name>" -f
git change-commits GIT_COMMITTER_EMAIL <old@email.com> <new@email.com> -f
1 голос
/ 25 января 2019

https://help.github.com/articles/changing-author-info/

#!/bin/sh

git filter-branch --env-filter '

OLD_EMAIL="oldEmail@xxx-MacBook-Pro.local"
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-адреса и проверьте имя и адрес электронной почты верны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...