Как изменить имя автора и коммиттера и адрес электронной почты нескольких коммитов в Git?


Я писал простой скрипт на школьном компьютере и вносил изменения в Git (в репо, которое было в моем pendrive, клонированном с моего компьютера дома). После нескольких коммитов я понял, что совершаю вещи как пользователь root.

есть ли способ изменить автора этих коммитов на мое имя?

30 2038

30 ответов:

изменение автора (или коммиттера) потребует переписывания всей истории. Если вы в порядке с этим и думаете, что это стоит того, то вы должны проверить git filter-branch. Справочная страница содержит несколько примеров для начала работы. Также обратите внимание, что вы можете использовать переменные среды для изменения имени автора, коммиттера, даты и т. д. -- см. раздел" Переменные среды " в git man page.

в частности, вы можете исправить все неправильные имена авторов и электронные письма для всех ветвей и тегов С помощью этой команды (источник: GitHub help):

#!/bin/sh

git filter-branch --env-filter '
OLD_EMAIL="your-old-email@example.com"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="your-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

Использование Интерактивной Перебазирования

вы могли бы сделать

git rebase -i -p <some HEAD before all of your bad commits>

затем отметьте все ваши плохие коммиты как "редактировать" в файле rebase. Если вы также хотите изменить свой первый коммит, вы должны вручную добавить его в качестве первой линии в переместить файл (формат других линий). Затем, когда git попросит вас изменить каждую фиксацию, сделайте

 git commit --amend --author "New Author Name <email@address.com>" 

редактировать или просто закрыть редактор, который открывается, а затем сделать

git rebase --continue

продолжить перебазировать.

вы можете пропустить открытие редактора в целом здесь, добавив --no-edit так что команда будет:

git commit --amend --author "New Author Name <email@address.com>" --no-edit && \
git rebase --continue

Один

как отметили некоторые комментаторы, если вы просто хотите изменить самую последнюю фиксацию, команда rebase не нужна. Просто сделай

 git commit --amend --author "New Author Name <email@address.com>"

это изменит автора на указанное имя, но коммиттер будет установлен для вашего настроенного пользователя в git config user.name и git config user.email. Если вы хотите чтобы установить коммиттер на то, что вы укажете, это установит как автора, так и коммиттера:

 git -c user.name="New Author Name" -c user.email=email@address.com commit --amend --reset-author

обратите внимание на слияние коммитов

в моем первоначальном ответе был небольшой изъян. Если есть какие-либо коммиты слияния между текущим HEAD и свой <some HEAD before all your bad commits>, потом git rebase сгладит их (и, кстати, если вы используете запросы GitHub pull, в вашей истории будет много коммитов слияния). Это очень часто может привести к очень разной истории (как повторяющиеся изменения могут быть "перебазированы"), и в худшем случае это может привести к git rebase С просьбой разрешить сложные конфликты слияния (которые, вероятно, уже были разрешены в коммитах слияния). Решение заключается в использовании -p флаг git rebase, который сохранит структуру слияния вашей истории. Справочную страницу git rebase предупреждает, что, используя -p и -i может привести к проблемам, но в BUGS в разделе говорится: "редактирование коммитов и переформулировка их сообщений о фиксации должны работать штраф."

я добавил -p к вышеуказанной команде. Для случая, когда вы просто меняете самую последнюю фиксацию, это не проблема.

вы также можете сделать:

git filter-branch --commit-filter '
        if [ "$GIT_COMMITTER_NAME" = "<Old Name>" ];
        then
                GIT_COMMITTER_NAME="<New Name>";
                GIT_AUTHOR_NAME="<New Name>";
                GIT_COMMITTER_EMAIL="<New Email>";
                GIT_AUTHOR_EMAIL="<New Email>";
                git commit-tree "$@";
        else
                git commit-tree "$@";
        fi' HEAD

обратите внимание, если вы используете эту команду в командной строке Windows, то вам нужно использовать " вместо ':

git filter-branch --commit-filter "
        if [ "$GIT_COMMITTER_NAME" = "<Old Name>" ];
        then
                GIT_COMMITTER_NAME="<New Name>";
                GIT_AUTHOR_NAME="<New Name>";
                GIT_COMMITTER_EMAIL="<New Email>";
                GIT_AUTHOR_EMAIL="<New Email>";
                git commit-tree "$@";
        else
                git commit-tree "$@";
        fi" HEAD

один лайнер, но будьте осторожны, если у вас есть многопользовательский репозиторий - это изменение все коммиты имеют один и тот же (новый) автор и коммиттер.

git filter-branch -f --env-filter "GIT_AUTHOR_NAME='Newname'; GIT_AUTHOR_EMAIL='new@email'; GIT_COMMITTER_NAME='Newname'; GIT_COMMITTER_EMAIL='new@email';" HEAD

с разрывами строк в строке (что возможно в bash):

git filter-branch -f --env-filter "
    GIT_AUTHOR_NAME='Newname'
    GIT_AUTHOR_EMAIL='new@email'
    GIT_COMMITTER_NAME='Newname'
    GIT_COMMITTER_EMAIL='new@email'
  " HEAD

это происходит, когда у вас нет $HOME/.gitconfig хранит настройки инициализации. Вы можете исправить это:

git config --global user.name "you name"
git config --global user.email you@domain.com
git commit --amend --reset-author

протестировано с Git версии 1.7.5.4

для одной фиксации:

git commit --amend --author="Author Name <email@address.com>"

(извлечено из ответа асмьюрера)

в случае, когда только верхние несколько коммитов имеют плохих авторов, вы можете сделать это все внутри git rebase -i С помощью и --amend совершить следующим образом:

git rebase -i HEAD~6 # as required

который представляет вам редактируемый список коммитов:

pick abcd Someone else's commit
pick defg my bad commit 1
pick 1234 my bad commit 2

затем добавить exec ... --author="..." строки Ведь строки с плохими авторами:

pick abcd Someone else's commit
pick defg my bad commit 1
exec git commit --amend --author="New Author Name <email@address.com>" -C HEAD
pick 1234 my bad commit 2
exec git commit --amend --author="New Author Name <email@address.com>" -C HEAD

сохранить и выйти из редактора (для запуска).

это решение может быть длиннее, чем некоторые другие, но оно очень управляемо - I точно знаю, что совершает его хиты.

спасибо @asmeurer за вдохновение.

Github имеет хорошее решение, что следующий скрипт:

#!/bin/sh

git filter-branch --env-filter '

an="$GIT_AUTHOR_NAME"
am="$GIT_AUTHOR_EMAIL"
cn="$GIT_COMMITTER_NAME"
cm="$GIT_COMMITTER_EMAIL"

if [ "$GIT_COMMITTER_EMAIL" = "your@email.to.match" ]
then
    cn="Your New Committer Name"
    cm="Your New Committer Email"
fi
if [ "$GIT_AUTHOR_EMAIL" = "your@email.to.match" ]
then
    an="Your New Author Name"
    am="Your New Author Email"
fi

export GIT_AUTHOR_NAME="$an"
export GIT_AUTHOR_EMAIL="$am"
export GIT_COMMITTER_NAME="$cn"
export GIT_COMMITTER_EMAIL="$cm"
'

Как уже упоминалось в docgnome, переписывание истории опасно и будет нарушать репозитории других людей.

но если вы действительно хотите это сделать, и вы находитесь в среде bash (без проблем в Linux, на Windows, вы можете использовать Git bash, который поставляется с установкой git), используйте git filter-branch:

git filter-branch --env-filter '
  if [ $GIT_AUTHOR_EMAIL = bad@email ];
    then GIT_AUTHOR_EMAIL=correct@email;
  fi;
export GIT_AUTHOR_EMAIL'

чтобы ускорить процесс, вы можете указать диапазон изменений, которые вы хотите переписать:

git filter-branch --env-filter '
  if [ $GIT_AUTHOR_EMAIL = bad@email ];
    then GIT_AUTHOR_EMAIL=correct@email;
  fi;
export GIT_AUTHOR_EMAIL' HEAD~20..HEAD

при принятии несвязанного коммита от другого автора, есть простой способ справиться с этим.

git commit --amend --reset-author

это более проработанная версия версии @Brian:

чтобы изменить автора и коммиттера, вы можете сделать это (с разрывами строк в строке, которая возможна в bash):

git filter-branch --env-filter '
    if [ "$GIT_COMMITTER_NAME" = "<Old name>" ];
    then
        GIT_COMMITTER_NAME="<New name>";
        GIT_COMMITTER_EMAIL="<New email>";
        GIT_AUTHOR_NAME="<New name>";
        GIT_AUTHOR_EMAIL="<New email>";
    fi' -- --all

вы можете получить одну из этих ошибок:

  1. временный каталог уже существует
  2. ссылки, которые начинаются с судьи/оригинал уже есть
    (это означает, что ранее была запущена другая ветвь фильтра репозиторий и затем исходная ссылка на ветку сохраняются в судьи/оригинал)

если вы хотите принудительно запустить несмотря на эти ошибки, добавьте --force флаг:

git filter-branch --force --env-filter '
    if [ "$GIT_COMMITTER_NAME" = "<Old name>" ];
    then
        GIT_COMMITTER_NAME="<New name>";
        GIT_COMMITTER_EMAIL="<New email>";
        GIT_AUTHOR_NAME="<New name>";
        GIT_AUTHOR_EMAIL="<New email>";
    fi' -- --all

небольшое описание -- --all может потребоваться опция: это делает работу фильтра-ветви на всех ревизиях на все рефы (который включает в себя все ветви). Это означает, например, что теги также переписываются и отображаются на экране. переписал ветки.

распространенной "ошибкой" является использование HEAD вместо этого, что означает фильтрацию всех ревизий только на текущая филиала. И тогда никакие теги (или другие ссылки) не будут существовать в переписанной ветке.

вы можете использовать этот псевдоним, так что вы можете сделать:

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

псевдоним:

change-commits = "!f() { VAR=; OLD=; NEW=; 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

надеюсь, что это полезно.

  1. выполнить git rebase -i <sha1 or ref of starting point>
  2. отметить все коммиты, которые вы хотите изменить с edit (или e)
  3. выполните следующие две команды, пока не обработаете все коммиты:

    git commit --amend --reuse-message=HEAD --author="New Author <new@author.email>" ; git rebase --continue

это сохранит всю другую информацию о фиксации (включая даты). Элемент --reuse-message=HEAD опция предотвращает запуск редактора сообщений.

Я использую следующее, чтобы переписать автора для всего репозитория, включая теги и все ветви:

git filter-branch --tag-name-filter cat --env-filter "
  export GIT_AUTHOR_NAME='New name';
  export GIT_AUTHOR_EMAIL='New email'
" -- --all

затем, как описано в MAN страница фильтра-branch, удалите все исходные ссылки, подкрепленные filter-branch (это разрушительно, сначала резервное копирование):

git for-each-ref --format="%(refname)" refs/original/ | \
xargs -n 1 git update-ref -d

я адаптировал этот решение который работает, глотая простой author-conv-file (формат совпадает с форматом для git-cvsimport). Она работает путем изменения всех пользователей, как определено в author-conv-file во всех ветвях.

мы использовали это в сочетании с cvs2git чтобы перенести наш репозиторий из cvs в git.

образец author-conv-file

john=John Doe <john.doe@hotmail.com>
jill=Jill Doe <jill.doe@hotmail.com>

сценарий:

 #!/bin/bash

 export $authors_file=author-conv-file

 git filter-branch -f --env-filter '

 get_name () {
     grep "^=" "$authors_file" |
     sed "s/^.*=\(.*\) <.*>$//"
 }

 get_email () {
     grep "^=" "$authors_file" |
     sed "s/^.*=.* <\(.*\)>$//"
 }

 GIT_AUTHOR_NAME=$(get_name $GIT_COMMITTER_NAME) &&
     GIT_AUTHOR_EMAIL=$(get_email $GIT_COMMITTER_NAME) &&
     GIT_COMMITTER_NAME=$GIT_AUTHOR_NAME &&
     GIT_COMMITTER_EMAIL=$GIT_AUTHOR_EMAIL &&
     export GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL &&
     export GIT_COMMITTER_NAME GIT_COMMITTER_EMAIL
 ' -- --all

Я нашел представленные версии агрессивным способом, особенно если вы фиксируете патчи от других разработчиков, это по существу украдет их код.

версия ниже работает на всех ветвях и изменяет автора и комиттера отдельно, чтобы предотвратить это.

престижность leif81 для опции все.

#!/bin/bash

git filter-branch --env-filter '
if [ "$GIT_AUTHOR_NAME" = "<old author>" ];
then
    GIT_AUTHOR_NAME="<new author>";
    GIT_AUTHOR_EMAIL="<youmail@somehost.ext>";
fi
if [ "$GIT_COMMITTER_NAME" = "<old committer>" ];
then
    GIT_COMMITTER_NAME="<new commiter>";
    GIT_COMMITTER_EMAIL="<youmail@somehost.ext>";
fi
' -- --all
  1. изменить коммит author name & email by Amend, затем заменить old-commit with new-one:

    $ git checkout <commit-hash>                            # checkout to the commit need to modify  
    $ git commit --amend --author "name <author@email.com>" # change the author name and email
    
    $ git replace <old-commit-hash> <new-commit-hash>      # replace the old commit by new one
    $ git filter-branch -- --all                           # rewrite all futures commits based on the replacement                   
    
    $ git replace -d <old-commit-hash>     # remove the replacement for cleanliness 
    $ git push -f origin HEAD              # force push 
    
  2. другой способ Rebasing:

    $ git rebase -i <good-commit-hash>      # back to last good commit
    
    # Editor would open, replace 'pick' with 'edit' before the commit want to change author
    
    $ git commit --amend --author="author name <author@email.com>"  # change the author name & email
    
    # Save changes and exit the editor
    
    $ git rebase --continue                # finish the rebase
    

Я должен отметить, что если единственная проблема заключается в том, что автор/электронная почта отличается от вашего обычного, это не проблема. Правильное решение-создать файл с именем .mailmap в основании каталога со строками типа

Name you want <email you want> Name you don't want <email you don't want>

и с тех пор, как команды git shortlog будет считать эти два имени одинаковыми (если вы специально не скажете им не делать этого). Смотрите http://schacon.github.com/git/git-shortlog.html Подробнее информация.

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

конечно, если вы совершили что-то как себя, и это действительно должен быть кто-то другой, и вы не возражаете переписать историю на данный момент, изменение автора фиксации, вероятно, является хорошей идеей для целей атрибуции (в этом случае я направляю вас к моему другой ответ здесь).

если вы единственный пользователь этого репозитория, вы можете переписать историю используя git filter-branch (как svick писал), или git fast-export/git fast-import плюс скрипт фильтра (как описано в статье, на которую ссылается в docgnome ответ), или интерактивные rebase. Но любой из них изменит изменения с первого измененного коммита; это означает проблемы для любого, кто основывал его / ее изменения в вашей ветке предварительно переписать.

восстановление

если бы другие разработчики не основывали свою работу на предварительной версии перезаписи, самым простым решением было бы повторно клонировать (клонировать снова).

в качестве альтернативы они могут попробовать git rebase --pull, который будет перемотан вперед, если в их репозитории не было никаких изменений, или перебазировать их ветвь поверх перезаписанных коммитов (мы хотим избежать слияния, так как он будет сохранять предварительно переписанные коммиты навсегда). Все это при условии, что они не имеют не поручено работать; используйте git stash, чтобы спрятать изменения в противном случае.

если другие разработчики используют функциональные ветви, и / или git pull --rebase не работает, например, потому что upstream не настроен, они должны rebase их работа поверх коммитов после перезаписи. Например, сразу после получения новых изменений (git fetch), на master ветвь на основе / раздвоенная от origin/master нужно беги

$ git rebase --onto origin/master origin/master@{1} master

здесь origin/master@{1} состояние предварительной перезаписи (перед выборкой), см. gitrevisions.


альтернативным решением было бы использовать refs / replace/ механизм, доступный в Git с версии 1.6.5. В этом решении вы предоставляете замены для коммитов, которые имеют неправильную электронную почту; затем любой, кто выбирает "заменить" ссылки (что-то вроде fetch = +refs/replace/*:refs/replace/* refspec в соответствующем месте в их.git/config) будет Вам замены прозрачно, и те, кто не получает эти ссылки, увидят старые коммиты.

процедура проходит примерно так:

  1. найти все коммиты с неправильной электронной почтой, например, с помощью

    $ git log --author=user@wrong.email --all
    
  2. для каждого неправильного коммита создайте коммит замены и добавьте его в базу данных объектов

    $ git cat-file -p <ID of wrong commit> | 
      sed -e 's/user@wrong\.email/user@example.com/g' > tmp.txt
    $ git hash-object -t commit -w tmp.txt
    <ID of corrected commit>
    
  3. теперь, когда вы исправили фиксацию в базе данных объектов, вы должны сказать git автоматически и прозрачно замените неправильную фиксацию исправленной с помощью git replace:

    $ git replace <ID of wrong commit> <ID of corrected commit>
    
  4. наконец, перечислите все замены, чтобы проверить, если эта процедура прошла успешно

    $ git replace -l
    

    и проверить, если замены происходят

    $ git log --author=user@wrong.email --all
    

вы можете, конечно, автоматизировать эту процедуру... ну, все, кроме использования git replace который не имеет (пока) пакетного режима, поэтому вам придется использовать цикл оболочки для что, либо заменить "вручную".

НЕ ПРОВЕРЕНО! YMMV.

обратите внимание, что вы можете столкнуться с некоторыми грубыми углами при использовании refs/replace/ механизм: он новый, и еще не очень хорошо протестированы.

Если коммиты, которые вы хотите исправить, являются последними, и только несколько из них, вы можете использовать комбинацию git reset и git stash чтобы вернуться к фиксации их снова после настройки правильного имени и электронной почты.

последовательность будет примерно такой (для 2 неправильных коммитов, без ожидающих изменений):

git config user.name <good name>
git config user.email <good email>
git reset HEAD^
git stash
git reset HEAD^
git commit -a
git stash pop
git commit -a

Если вы используете Eclipse с EGit, то есть довольно простое решение.
Предположение: у вас есть коммиты в локальной ветви "local_master_user_x", которые не могут быть переданы в удаленную ветвь "master" из-за недопустимого пользователя.

  1. проверка удаленной ветви "мастер"
  2. выберите проекты / папки / файлы, для которых' local_master_user_x ' содержит изменения
  3. щелкните правой кнопкой мыши-заменить на-ветвь - 'local_master_user_x'
  4. зафиксируйте эти изменения снова, на этот раз как правильный пользователь и в локальную ветку 'master'
  5. Push to remote 'master'

используя интерактивную перебазировку, вы можете разместить команду amend после каждой фиксации, которую вы хотите изменить. Например:

pick a07cb86 Project tile template with full details and styling
x git commit --amend --reset-author -Chead

обратите внимание, что Git хранит два разные адреса электронной почты, один для коммиттер (человек, который совершил изменение) и еще один для автор (человек, который написал смену).

информация коммиттер не отображается в большинстве мест, но вы можете увидеть его с git log -1 --format=%cn,%ce (или использовать show вместо log для указания конкретной фиксации).

при изменении автора вашего последнего коммита так же просто, как git commit --amend --author "Author Name <email@example.com>" есть один-лайнер нет или аргумент, чтобы сделать то же самое с информацией коммиттер.

решение состоит в том, чтобы (временно или нет) изменить информацию о пользователе, а затем изменить фиксацию, которая обновит фиксатор до текущей информации:

git config user.email my_other_email@example.com 
git commit --amend

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

Шаг 1: измените свое имя пользователя в git для всех будущих коммитов, согласно инструкциям здесь: https://help.github.com/articles/setting-your-username-in-git/

Шаг 2: Запустите следующий скрипт bash:

#!/bin/sh

REPO_URL=ssh://path/to/your.git
REPO_DIR=rewrite.tmp

# Clone the repository
git clone ${REPO_URL} ${REPO_DIR}

# Change to the cloned repository
cd ${REPO_DIR}

# Checkout all the remote branches as local tracking branches
git branch --list -r origin/* | cut -c10- | xargs -n1 git checkout

# Rewrite the history, use a system that will preseve the eol (or lack of in commit messages) - preferably Linux not OSX
git filter-branch --env-filter '
OLD_EMAIL="me@something.com"
CORRECT_NAME="New Me"

if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_COMMITTER_NAME="$CORRECT_NAME"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_AUTHOR_NAME="$CORRECT_NAME"
fi
' --tag-name-filter cat -- --branches --tags

# Force push the rewritten branches + tags to the remote
git push -f

# Remove all knowledge that we did something
rm -rf ${REPO_DIR}

# Tell your colleagues to `git pull --rebase` on all their local remote tracking branches

быстрый обзор: проверка вашего репозиторий во временный файл, проверьте все удаленные ветви, запустите скрипт, который перепишет историю, сделайте принудительный толчок нового состояния и скажите всем своим коллегам сделать перебазирование, чтобы получить изменения.

У нас были проблемы с запуском этого на OS X, потому что он каким-то образом испортил окончание строки в сообщениях о фиксации, поэтому нам пришлось повторно запустить его на машине Linux после этого.

ваша проблема очень распространенная. Смотрите "использование Mailmap для исправления списка авторов в Git"

для простоты, я создал скрипт, чтобы облегчить процесс: git-changemail

после размещения этого скрипта на вашем пути, вы можете выдавать команды, такие как:

  • изменить автор совпадения на текущей ветке

    $ git changemail -a old@email.com -n newname -m new@email.com
    
  • изменить совпадения автора и коммиттера на и . Пас -f to filter-branch чтобы разрешить перезапись резервных копий

    $ git changemail -b old@email.com -n newname -m new@email.com -- -f &lt;branch> &lt;branch2>
    
  • показать существующих пользователей на репо

    $ git changemail --show-both
    

кстати, после внесения изменений очистите резервную копию из ветви фильтра с помощью: git-backup-clean

Если вы единственный пользователь этого РЕПО или вы не заботитесь о возможном нарушении РЕПО для других пользователей, то да. Если вы нажали эти коммиты, и они существуют там, где где-то еще можно получить к ним доступ, то нет, если вы не заботитесь о взломе РЕПО других людей. Проблема в том, что, изменяя эти коммиты, вы будете генерировать новые SHAs, которые заставят их рассматриваться как разные коммиты. Когда кто-то еще пытается вытащить эти измененные коммиты, история отличается и бум.

эта страница http://inputvalidation.blogspot.com/2008/08/how-to-change-git-commit-author.html описывает, как это сделать. (Я не пробовал это так YMMV)

Я тоже хочу добавить свой пример. Я хочу создать bash_function с заданным параметром.

это работает в mint-linux-17.3

#  => email to change,  => new_name,  => new E-Mail

function git_change_user_config_for_commit {

 # defaults
 WRONG_EMAIL=${1:-"you_wrong_mail@hello.world"}
 NEW_NAME=${2:-"your name"}
 NEW_EMAIL=${3:-"new_mail@hello.world"}

 git filter-branch -f --env-filter "
  if [ $GIT_COMMITTER_EMAIL = '$WRONG_EMAIL' ]; then
    export GIT_COMMITTER_NAME='$NEW_NAME'
    export GIT_COMMITTER_EMAIL='$NEW_EMAIL'
  fi
  if [ $GIT_AUTHOR_EMAIL = '$WRONG_EMAIL' ]; then
    export GIT_AUTHOR_NAME='$NEW_NAME'
    export GIT_AUTHOR_EMAIL='$NEW_EMAIL'
  fi
 " --tag-name-filter cat -- --branches --tags;
}
git rebase -i YOUR_FIRTS_COMMIT_SHA^

while true; do git commit --amend --author="Name Surname <email@example.com>" --no-edit && git rebase --continue; done

нажмите ^C # после завершения перебазирования (цикл будет продолжать обновлять последнюю фиксацию)

попробуйте это. Он будет делать то же, что и выше, но в интерактивном режиме.

bash <(curl -s  https://raw.githubusercontent.com/majdarbash/git-author-change-script/master/run.sh)

Ссылка:https://github.com/majdarbash/git-author-change-script

Это не ответ на ваш вопрос, а сценарий вы можете использовать, чтобы избежать этого в будущем. Он использует глобальные крючки, доступные с Git версия 2.9 чтобы проверить конфигурацию электронной почты на основе каталога ваш в:

#!/bin/sh
PWD=`pwd`
if [[ $PWD == *"Ippon"* ]] # 1)
then
  EMAIL=$(git config user.email)
  if [[ $EMAIL == *"Work"* ]] # 2)
  then
    echo "";
  else
    echo "Email not configured to your Work email in the Work directory.";
    git config user.email "youremail@youremail.com"
    echo "Git email configuration has now been changed to \"$(git config user$
    echo "\nPlease run your command again..."
    echo ''
    exit 1
  fi;
elif [[ $PWD == *"Personal"* ]]
then
  EMAIL=$(git config user.email)
  if [[ $EMAIL == "youremail@youremail.com" ]]
  then
    echo "";
  else
    echo "Email is not configured to your personal account in the Personal di$
    git config user.email "youremail@youremail.com"
    echo "Git email configuration has now been changed to \"$(git config user$
    echo "\nPlease run your command again..."
    echo ''
    exit 1;
  fi;
fi; 

он проверяет ваш текущий рабочий каталог, а затем проверяет, что ваш git настроен на правильную электронную почту. Если нет, он изменяет его автоматически. Смотрите полную информацию здесь.