Команда Git filter-branch является мощной, но ее ужасно громоздко использовать для чего-то нетривиального, например, если у вас есть несколько авторов для исправления.
Вот альтернатива, которую я нашел полезной, которая использует функцию .mailmap, описанную на странице руководства git-shortlog. Это обеспечивает механизм отображения автора, который мы можем использовать с возможностью форматирования git log. Мы можем использовать его для генерации команд для выбора и изменения именованной последовательности коммитов.
Например, предположим, что вы хотите исправить авторство в ветке $ BRANCH, начиная с коммита $ START.
Вам нужно создать файл .mailmap в верхнем каталоге вашего репозитория, который сопоставляет существующие имена авторов с правильными. Вы можете получить список существующих имен авторов:
git shortlog -se
Вам нужно получить файл .mailmap, например, такой:
You <you@somewhere.org> cowens@localmachine
You <you@somewhere.org> root@localmachine
Теперь вы можете использовать функцию форматирования git log для генерации команд для перезаписи $ 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" '
Поэтому, когда вам нужно исправить авторов, теперь вам просто нужно сгенерировать .mapfile и сделать:
git checkout -b $BRANCH2 $START
git reauthor $START..$BRANCH
Исходную ветку ref можно переназначить новой, а новую удалить:
git checkout $BRANCH
git reset --hard $BRANCH2 # be careful with this command
git branch -d $BRANCH2
git
в подобных целях лучше задать на Stack Overflow .