Как изменить автора, имя коммиттера и адрес электронной почты нескольких коммитов в Git? - PullRequest
2179 голосов
/ 15 апреля 2009

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

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

Ответы [ 32 ]

6 голосов
/ 30 сентября 2011

Если коммиты, которые вы хотите исправить, являются самыми последними, и только пару из них, вы можете использовать комбинацию 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
5 голосов
/ 25 октября 2018

Самый быстрый и простой способ сделать это - использовать аргумент --exec команды git rebase:

git rebase -i -p --exec 'git commit --amend --reset-author --no-edit'

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

pick ef11092 Blah blah blah
exec git commit --amend --reset-author --no-edit
pick 52d6391 Blah bloh bloo
exec git commit --amend --reset-author --no-edit
pick 30ebbfe Blah bluh bleh
exec git commit --amend --reset-author --no-edit
...

и все это будет работать автоматически, что работает при наличии сотен коммитов.

5 голосов
/ 03 января 2015

Ваша проблема действительно распространена. Смотрите " Использование 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

5 голосов
/ 22 октября 2014

Сегодня мы столкнулись с проблемой, когда символ 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.

5 голосов
/ 06 декабря 2013

Обратите внимание, что 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
5 голосов
/ 26 февраля 2013

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

pick a07cb86 Project tile template with full details and styling
x git commit --amend --reset-author -Chead
5 голосов
/ 24 августа 2011

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

  1. Оформить заказ на удаленную ветку 'master'
  2. Выберите проекты / папки / файлы, для которых 'local_master_user_x' содержит изменения
  3. Щелкните правой кнопкой мыши - Замените на - Ветвь - 'local_master_user_x'
  4. Подтвердите эти изменения еще раз, на этот раз как правильный пользователь и в локальную ветвь 'master'
  5. Нажмите для удаленного «мастера»
2 голосов
/ 28 сентября 2017

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

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

# $1 => email to change, $2 => new_name, $3 => 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;
}
2 голосов
/ 04 августа 2010

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

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

1 голос
/ 05 июня 2018

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

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

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

...