20

How can I reword the message of an old commit that is already pushed to a private remote? I want to keep the time stamps and tags.

I found this command here:

git filter-branch -f --msg-filter \
'sed "s/<old message>/<new message>/g"' -- --all

In order to keep the tags i added: --tag-name-filter cat

When executing the command git tells me: msg filter failed

The message I want to change is a merged-message "Merge branch 'release/...'" is this the problem?

Community
  • 1
  • 1
Tenjix
  • 539
  • 3
  • 12
  • Scripting git rebase -i is another option: http://stackoverflow.com/questions/12394166/how-do-i-run-git-rebase-interactive-in-non-interactive-manner – MarcH Nov 08 '16 at 22:48

2 Answers2

19

The solution was to escape the slash in "release/..." using a backslash. So the command I used was:

git filter-branch -f --msg-filter \
'sed "s/release\/Version-[0-9].[0-9].[0-9]/develop/g"' \
--tag-name-filter cat -- --all
Tenjix
  • 539
  • 3
  • 12
  • 1
    alternatively, use a different separator in the sed expression, e.g. `sed "s|release/Version-[0-9].[0-9].[0-9]|develop|g"` – ssc Jul 02 '19 at 21:57
0

Here is a slightly improved version which also updates all references to commit hashes in commit messages on the fly when doing filter-branch:

rm -f /tmp/git;
touch /tmp/git;
git filter-branch \
    --subdirectory-filter <DIRECTORY> \
    --tag-name-filter cat \
    --commit-filter 'echo -n "s/${GIT_COMMIT}/" >>/tmp/git; \
                     NEW=`git_commit_non_empty_tree "$@"`; \
                     echo "${NEW}/g" >> /tmp/git; echo ${NEW}' \
    --msg-filter 'sed -f /tmp/git' \
    -- --all