Команда гілки фільтру-гілки є потужною, але її жахливо непросто використовувати для чогось нетривіального, як, наприклад, якщо у вас є кілька авторів для виправлення.
Ось альтернатива, яку я знайшов корисною, яка використовує функцію .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" '
Отже, коли вам потрібно виправити авторів, тепер вам просто потрібно створити .mapfile і зробити:
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
для подібних цілей краще задавати на Stack Overflow .