Как изменить несколько коммитов в Git, чтобы изменить автора
Я сделал серию коммитов в Git, и теперь понимаю, что я забыл правильно настроить свойства имени пользователя и пользователя электронной почты (новая машина). Я еще не подтолкнул эти коммиты к моему репозиторию, так как я могу исправить эти коммиты, прежде чем я это сделаю (только 3 последних коммита на главной ветке)?
Я смотрел git reset
и git commit -C <id> --reset-author
, но я не думаю, что нахожусь на правильном пути.
Ответы
Ответ 1
Rebase/modify кажется неэффективным, когда у вас есть мощность ветки фильтра:
git filter-branch --env-filter 'if [ "$GIT_AUTHOR_EMAIL" = "[email protected]" ]; then
[email protected];
GIT_AUTHOR_NAME="Correct Name";
GIT_COMMITTER_EMAIL=$GIT_AUTHOR_EMAIL;
GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME"; fi' -- --all
(разделить строки для ясности, но не обязательно)
Обязательно проверяйте результат, когда вы закончите, чтобы убедиться, что вы ничего не изменили, что вы не хотели!
Ответ 2
Интерактивный подход к переадресации довольно хорош при использовании в сочетании с exec. Вы можете запустить любую команду оболочки против определенного коммита или всех коммитов в rebase.
Сначала установите настройки автора git
git config --global user.name "John Doe"
git config --global user.email [email protected]
Затем до reset автор для всех фиксирует после заданного SHA
git rebase -i YOUR_SHA -x "git commit --amend --reset-author -CHEAD"
Это приведет к появлению вашего редактора, чтобы подтвердить изменения. Все, что вам нужно сделать, это сохранить и выйти, и оно пройдет через каждое коммит и запустит команду, указанную в флагов -x.
В комментарии @Dave ниже вы также можете изменить автора при сохранении исходных временных меток с помощью:
git rebase -i YOUR_SHA -x "git commit --amend --author 'New Name <[email protected]>' -CHEAD"
Ответ 3
Чтобы изменить автора только для последнего фиксации:
git commit --amend --author 'Author Name <[email protected]>' --no-edit
Предположим, вы хотите изменить автора только для последних N коммитов:
git rebase -i HEAD~4 -x "git commit --amend --author 'Author Name <[email protected]>' --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 <[email protected]>' --no-edit
pick dc18f70 bugfix
Ответ 4
Я верю, что вы ищете 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
Ответ 5
Если вы чувствуете себя небезопасно в отношении снижения и исправления, вы можете сделать это таким образом. В то же время вы также будете устанавливать глобальную конфигурацию, которую вы, вероятно, хотели бы сделать в любом случае.
git reset HEAD~
(отменить последнее коммит)
git config --global user.name "Your Name"
git config --global user.email [email protected]
git commit -m "message"
Ответ 6
Этот метод был задокументирован github для этой цели. Шаги:
- Откройте терминал и сделайте голый клон своего репо
git clone --bare https://github.com/user/repo.git
cd repo
- Отредактируйте следующий скрипт (заменив
OLD_EMAIL
, CORRECT_EMAIL
и CORRECT_NAME
)
#!/bin/sh
git filter-branch --env-filter '
OLD_EMAIL="[email protected]"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="[email protected]"
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
- Скопируйте/вставьте скрипт в свой терминал и нажмите Enter, чтобы запустить его.
-
git push --force --tags origin 'refs/heads/*'
свои изменения с помощью git push --force --tags origin 'refs/heads/*'
и все готово!