Gits filter-branch Befehl ist mächtig, aber es ist schrecklich unhandlich, ihn für etwas Nicht-Triviales zu verwenden, wie zum Beispiel, wenn Sie mehr als einen Autor zur Korrektur haben.
Hier ist eine Alternative, die ich nützlich fand und die die .mailmap-Funktion verwendet, die in der git-shortlog-Manpage beschrieben ist. Dies bietet einen Autoren-Zuordnungsmechanismus, den wir mit der Formatierungsfunktion von git log verwenden können. Wir können es verwenden, um die Befehle zu generieren, um eine benannte Folge von Commits auszuwählen und zu ändern.
Angenommen, Sie möchten die Urheberschaft für einen Zweig $ BRANCH korrigieren, beginnend mit einem Commit $ START.
Sie müssen eine .mailmap-Datei im obersten Verzeichnis Ihres Repositorys erstellen, die die vorhandenen Verfassernamen den richtigen zuordnet. Sie können eine Liste der vorhandenen Autorennamen erhalten mit:
git shortlog -se
Sie müssen am Ende eine .mailmap-Datei wie diese haben (sagen wir):
You <you@somewhere.org> cowens@localmachine
You <you@somewhere.org> root@localmachine
Jetzt können Sie die Formatierungsfunktion von git log verwenden, um die Befehle zum Umschreiben von $ BRANCH in $ BRANCH2 zu generieren.
git checkout -b $BRANCH2 $START
git log --reverse --pretty=format:"cherry-pick %H; commit --amend --author='%aN <%aE>' -C %H" $START..$BRANCH | sh -
Der erste Befehl erstellt einen neuen leeren Zweig, der aus dem Commit $ START hervorgeht. Bei jedem Festschreiben zwischen $ START und dann dem Ende von $ BRANCH übernimmt der zweite Befehl cherry das ursprüngliche Festschreiben bis zum Ende des aktuellen Zweigs $ BRANCH2 und ändert es, um den Autor korrekt festzulegen.
Dies gilt auch allgemein - fügen Sie dies in Ihre ~ / .gitconfig ein:
[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" '
Wenn Sie also Autoren korrigieren müssen, müssen Sie jetzt nur noch eine .map-Datei generieren und Folgendes tun:
git checkout -b $BRANCH2 $START
git reauthor $START..$BRANCH
Die ursprüngliche Zweigreferenz kann der neuen zugewiesen und die neue gelöscht werden:
git checkout $BRANCH
git reset --hard $BRANCH2 # be careful with this command
git branch -d $BRANCH2
git
für ähnliche Zwecke werden bei Stack Overflow besser gestellt .