Git filter-branch --msg-filter, чтобы переписать сообщение с нажатой фиксацией

Как я могу переписать сообщение о старой фиксации, которая уже нажата на частный пульт? Я хочу сохранить отметки времени и теги.

Я нашел эту команду здесь:

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

Чтобы сохранить теги, которые я добавил: --tag-name-filter cat

При выполнении команды git мне сообщается: сбой фильтра msg

Сообщение, которое я хочу изменить, является объединенным сообщением "Слияние ветки" /... "" Это проблема?

Ответ 1

Решение заключалось в том, чтобы избежать косой черты в "release/...", используя обратную косую черту. Таким образом, я использовал команду

git filter-branch -f --msg-filter \
'sed "s/release\/Version-[0-9].[0-9].[0-9]/develop/g"' \
--tag-name-filter cat -- --all

Ответ 2

Вот немного улучшенная версия, которая также обновляет все ссылки на хеширование коммитов в сообщениях фиксации "на лету" при выполнении фильтрации:

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 "[email protected]"`; \
                     echo "${NEW}/g" >> /tmp/git; echo ${NEW}' \
    --msg-filter 'sed -f /tmp/git' \
    -- --all