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

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

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

30 ответов


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

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

#!/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. Если вы также хотите изменить свою первую фиксацию, вы должны вручную добавить ее в качестве первой строки в файл 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

Single Commit

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

 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

С linebreaks в строке (что возможно в 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>"

(извлечено из ответа asmeurer)


в случае, когда только верхние несколько коммитов имеют плохих авторов, вы можете сделать это все внутри 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

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

git commit --amend --reset-author


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

чтобы изменить автора и коммиттера, вы можете сделать это (с помощью linebreaks в строке, которая возможна в 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. ссылки, которые начинаются с refs / original уже есть
    (это означает, что другая ветвь фильтра была запущена ранее на репозиторий и исходная ссылка на ветку сохраняются в refs / original)

если вы хотите принудительно запустить несмотря на эти ошибки, добавьте --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. run 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

это сохранит всю другую информацию о фиксации (включая даты). The --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-страница filter-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 для опции all.

#!/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 (as svick писал), или git fast-export/git fast-import плюс скрипт фильтра (как описано в статье, на которую ссылается в docgnome ответ), или интерактивные rebase. Но любой из них изменит изменения с первого измененного фиксации; это означает неприятности для любого, кто основывал его / ее изменения в вашей ветке предварительно переписать.

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

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

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

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

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

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


альтернативным решением было бы использовать refs / replace/ механизм, доступный в Git с версии 1.6.5. В этом решении вы предоставляете замены для коммитов, которые имеют неправильную электронную почту; тогда любой, кто получает "replace" refs (что-то вроде 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 который не имеет (пока) пакетного режима, поэтому вам придется использовать Shell loop для или заменить "вручную".

НЕ ПРОВЕРЕНО! 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. проверка удаленной ветви "master"
  2. выберите проекты / папки / файлы, для которых "local_master_user_x" содержит изменения
  3. щелкните правой кнопкой мыши-заменить на-Branch - 'local_master_user_x'
  4. зафиксируйте эти изменения снова, на этот раз как правильный пользователь и в локальную ветку "master"
  5. нажмите на удаленный "мастер"

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

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

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

информация коммиттер не отображается в большинстве мест, но вы можете увидеть его с 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 в имени автора вызывал проблемы на сервере сборки, поэтому нам пришлось переписать историю, чтобы исправить это. Были предприняты следующие шаги:--2-->

Шаг 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 фильтровать-ветвь, чтобы разрешить перезапись резервных копий

    $ 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 настроен на правильную электронную почту. Если нет, он меняет его автоматически. Смотрите полную информацию здесь.