Polecenie Git filter-branch jest potężne, ale strasznie niewygodne jest używanie go do wszystkiego, co nie jest trywialne, na przykład, jeśli masz więcej niż jednego autora do poprawienia.
Oto alternatywa, którą uważam za przydatną, która wykorzystuje funkcję .mailmap opisaną na stronie podręcznika git-shortlog. Zapewnia to mechanizm mapowania autora, którego możemy używać z narzędziem formatującym git log. Możemy go użyć do wygenerowania poleceń do wybierania i poprawiania nazwanej sekwencji zatwierdzeń.
Załóżmy na przykład, że chcesz poprawić autorstwo w oddziale $ BRANCH, zaczynając od zatwierdzenia $ START.
Musisz utworzyć plik .mailmap w górnym katalogu swojego repozytorium, który mapuje istniejące nazwiska autorów na poprawne. Możesz uzyskać listę istniejących nazwisk autorów za pomocą:
git shortlog -se
Musisz skończyć z plikiem .mailmap takim jak ten (powiedzmy):
You <you@somewhere.org> cowens@localmachine
You <you@somewhere.org> root@localmachine
Teraz możesz użyć funkcji formatowania dziennika git, aby wygenerować polecenia przepisania $ BRANCH na $ BRANCH2.
git checkout -b $BRANCH2 $START
git log --reverse --pretty=format:"cherry-pick %H; commit --amend --author='%aN <%aE>' -C %H" $START..$BRANCH | sh -
Pierwsze polecenie tworzy nową pustą gałąź wyrastającą z zatwierdzenia $ START. Dla każdego zatwierdzenia między $ START a potem końcem $ BRANCH, drugie polecenie cherry wybiera oryginalne zatwierdzenie na końcu bieżącej gałęzi $ BRANCH2 i poprawia je, aby poprawnie ustawić autora.
Ma to również ogólne zastosowanie - umieść to w swoim ~ / .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" '
Więc kiedy musisz poprawić autorów, teraz musisz wygenerować plik .map i wykonać:
git checkout -b $BRANCH2 $START
git reauthor $START..$BRANCH
Pierwotny numer referencyjny oddziału można przypisać do nowego, a nowy usunąć:
git checkout $BRANCH
git reset --hard $BRANCH2 # be careful with this command
git branch -d $BRANCH2
git
do celów podobnych do tego lepiej zadaje się w przypadku przepełnienia stosu .