Hi Konstantin, On Thu, 30 Jun 2022, Konstantin Ryabitsev wrote: > What's the best approach to non-interactively rewrite specific commit > messages? In this particular case, I am trying to automatically retrieve code > review trailers sent to the mailing list and put them into corresponding > commits. > > For example, I have a set of commits: > > abcabc: This commit does foo > bcdbcd: This commit does bar > cdecde: This commit does baz > > They were all sent to the mailing list and a maintainer sent a "Reviewed-by" > to the second commit. In a usual interactive rebase session this would be: > > pick abcabc > reword bcdbcd > pick cdecde > > When the edit screen comes up for the bcdbcd commit, the author would manually > stick the new trailer into the commit message. However, I can automate all > that away with b4 -- just need a sane strategy for non-interactively rewriting > entire commit messages at arbitrary points in the recent history. > > Any pointers? The quickest (in terms of script size) might be to craft an `amend!` commit, something like this: git commit --allow-empty -m "$(printf 'amend! bcdbcd\n\n' && git cat-file commit bcdbcd | sed -e '1,/^$/d' \ -e '{:1;${s/^/Reviewed-by: M A Intainer <maintainer@xxxxxxxxxxx>\n/;b};N;/\n$/b;b1}')" and then running an "interactive" rebase with `:` as the editor: GIT_SEQUENCE_EDITOR=: GIT_EDITOR=: git rebase -i --autosquash HEAD~3 (The `sed` call is admittedly a bit horrible, it prepends the `Reviewed-by:` footer to the last paragraph, if it needs to be _appended_, it can be greatly simplified.) Ciao, Dscho