Как изменить несколько коммитов в Git, чтобы сменить автора - PullRequest
139 голосов
/ 13 февраля 2011

Я сделал серию коммитов в Git, и теперь я понимаю, что забыл правильно указать свое имя пользователя и свойства электронной почты пользователя (новая машина).Я еще не отправил эти коммиты в свой репозиторий, так как я могу исправить эти коммиты до того, как я это сделаю (только 3 последних коммита в основной ветке)?1004 *, но я не думаю, что я на правильном пути.

Ответы [ 6 ]

182 голосов
/ 13 февраля 2011

Перебазировать / изменить кажется неэффективным, когда у вас под рукой есть сила ответвления фильтра:

git filter-branch --env-filter 'if [ "$GIT_AUTHOR_EMAIL" = "incorrect@email" ]; then
     GIT_AUTHOR_EMAIL=correct@email;
     GIT_AUTHOR_NAME="Correct Name";
     GIT_COMMITTER_EMAIL=$GIT_AUTHOR_EMAIL;
     GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME"; fi' -- --all

(разбито на строки для ясности, но не обязательно)

Обязательно проверьте результат, когда закончите, чтобы убедиться, что вы не изменили ничего, что не хотели!

117 голосов
/ 12 сентября 2014

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

Сначала установите настройки автора git

git config --global user.name "John Doe"
git config --global user.email johndoe@example.com

Затем сбросьте автора для всех коммитов после данного SHA

git rebase -i YOUR_SHA -x "git commit --amend --reset-author -CHEAD"

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

В приведенном ниже комментарии @ Дейва вы также можете изменить автора, сохранив оригиналотметки времени с:

git rebase -i YOUR_SHA -x "git commit --amend --author 'New Name <new_address@example.com>' -CHEAD"
61 голосов
/ 28 июля 2015

Чтобы изменить автора только для последнего коммита:

git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit

Предположим, вы хотите сменить автора только за последние N коммитов:

git rebase -i HEAD~4 -x "git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit"

ПРИМЕЧАНИЯ

  • флаг --no-edit гарантирует, что git commit --amend не запрашивает дополнительного подтверждения
  • когда вы используете git rebase -i, вы можете вручную выбрать коммиты, где сменить автора,

файл, который вы редактируете, будет выглядеть так:

pick 897fe9e simplify code a little
pick abb60f9 add new feature
exec git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit
pick dc18f70 bugfix
3 голосов
/ 13 февраля 2011

Я полагаю, что вы ищете это git rebase --interactive

Это позволяет вам выполнить сброс до определенного коммита, а затем перейти к изменению истории добавления или группировки коммитов

Здесь у вас естьобъяснение https://web.archive.org/web/20100213104931/http://blog.madism.org/index.php/2007/09/09/138-git-awsome-ness-git-rebase-interactive

0 голосов
/ 12 февраля 2019

Этот метод был задокументирован github для этой цели. Шаги:

  1. Откройте терминал и сделайте голый клон вашего репо
git clone --bare https://github.com/user/repo.git
cd repo
  1. Отредактируйте следующий скрипт (заменив OLD_EMAIL, CORRECT_EMAIL и CORRECT_NAME)
#!/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
  1. Скопируйте / вставьте скрипт в свой терминал и нажмите Enter, чтобы запустить его.
  2. Нажмите ваши изменения с помощью git push --force --tags origin 'refs/heads/*' и все готово!
0 голосов
/ 13 октября 2017

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

git reset HEAD~ (отменить последний коммит)

git config --global user.name "Your Name"

git config --global user.email you@example.com

git commit -m "message"

...