Когда я начал использовать git, я просто сделал git init
и начал звонить add
и commit
. Теперь я начинаю обращать внимание и вижу, что мои коммиты отображаются как cowens@localmachine
, а не адрес, который я хочу. Похоже, что установка GIT_AUTHOR_EMAIL
и GIT_COMMITTER_EMAIL
буду делать то, что хочу, но у меня все еще есть старые коммиты с неправильным адресом электронной почты / именем. Как мне исправить старые коммиты?
Вы можете вернуться и исправить все свои коммиты одним вызовом git filter-branch. Это имеет тот же эффект, что и rebase, но вам нужно выполнить только одну команду, чтобы исправить всю вашу историю, вместо того, чтобы исправлять каждую фиксацию отдельно.
Вы можете исправить все неправильные электронные письма с помощью этой команды:
git filter-branch --env-filter '
oldname="(old name)"
oldemail="(old email)"
newname="(new name)"
newemail="(new email)"
[ "$GIT_AUTHOR_EMAIL"="$oldemail" ] && GIT_AUTHOR_EMAIL="$newemail"
[ "$GIT_COMMITTER_EMAIL"="$oldemail" ] && GIT_COMMITTER_EMAIL="$newemail"
[ "$GIT_AUTHOR_NAME"="$oldname" ] && GIT_AUTHOR_NAME="$newname"
[ "$GIT_COMMITTER_NAME"="$oldname" ] && GIT_COMMITTER_NAME="$newname"
' HEAD
Более подробная информация доступна на сайте git docs
Команда filter-branch в Git очень мощная, но ужасно громоздкая в использовании для чего-нибудь нетривиального, например, если вам нужно исправить несколько авторов.
Вот альтернатива, которую я нашел полезной, которая использует функцию .mailmap, описанную на странице руководства git-shortlog. Это обеспечивает механизм сопоставления авторов, который мы можем использовать с функцией форматирования журнала git. Мы можем использовать его для генерации команд для выбора и изменения именованной последовательности коммитов.
Например, предположим, что вы хотите исправить авторство в ветке $ BRANCH, начиная с фиксации $ START.
Вам нужно создать файл .mailmap в верхнем каталоге вашего репозитория, который сопоставляет существующие имена авторов с правильными. Вы можете получить список существующих имен авторов с помощью:
git shortlog -se
У вас должен получиться такой файл .mailmap (скажем):
You <you@somewhere.org> cowens@localmachine
You <you@somewhere.org> root@localmachine
Теперь вы можете использовать функцию форматирования журнала git, чтобы сгенерировать команды для перезаписи $ BRANCH как $ BRANCH2.
git checkout -b $BRANCH2 $START
git log --reverse --pretty=format:"cherry-pick %H; commit --amend --author='%aN <%aE>' -C %H" $START..$BRANCH | sh -
Первая команда создает новую пустую ветку, прорастающую из коммита $ START. Для каждой фиксации от $ START до конца $ BRANCH вторая команда Cherry выбирает исходную фиксацию до конца текущей ветки $ BRANCH2 и исправляет ее, чтобы правильно указать автора.
Это также обычно применимо - поместите это в свой ~ / .gitconfig:
[alias]
# git reauthor $START..$END
reauthor = !sh -c 'eval `git log --reverse --topo-order --pretty=format:\"git cherry-pick %H && git commit --amend -C %H --author=\\\"%aN <%aE>\\\" && \" $0 ` "echo success" '
Итак, когда вам нужно исправить авторов, теперь вам нужно сгенерировать файл .map и выполнить:
git checkout -b $BRANCH2 $START
git reauthor $START..$BRANCH
Исходную ссылку ветки можно переназначить на новую, а новую удалить:
git checkout $BRANCH
git reset --hard $BRANCH2 # be careful with this command
git branch -d $BRANCH2
Объединяя ответ от Как мне исправить метаинформацию при первом коммите в git?
### Fix the first commit ###
# create a temporary tag for the root-most commit so we can reference it
git tag root `git rev-list HEAD | tail -1`
# check it out on its own temporary branch
git checkout -b new-root root
# amend the commit
git commit --amend --author "Foo foo@example.com"
# (or if you've set the proper git **config** values)
git commit --amend -C HEAD --reset-author
# now you've changed the commit message, so checkout the original branch again
git checkout @{-1}
# and rebase it onto your new root commit
git rebase --onto new-root root
### Fix the rest of the commits ###
git rebase -i root
# edit the file to read "edit <commit number> for each entry
# amend the commit
git commit --amend --author "Foo foo@example.com"
# (or if you've set the proper git **config** values)
git commit --amend -C HEAD --reset-author
# move to the next commit
git rebase --continue
# continue running the last two commands until you see
# Successfully rebased and updated refs/heads/master.
### Clean up ###
# nuke the temporary branch we created
git branch -d new-root
# nuke the temporary tag we created
git tag -d root
Чтобы следовать за ответом Джедберга: вы можете использовать rebase -i
и выберите редактировать обсуждаемые коммиты. Если вы используете git commit --amend --author <AUTHOR DETAILS>
а потом git rebase continue
можно пройти и исправить историю.