git filter-branch --msg-filter来重写被推送的提交消息

时间:2013-10-28 13:59:43

标签: git message commit git-filter-branch revision-history

如何重写已经推送到私有遥控器的旧提交的消息? 我想保留时间戳和标签。

我找到了这个命令here

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

为了保留我添加的标签:--tag-name-filter cat

执行命令git告诉我:msg过滤失败

我要更改的消息是合并消息“合并分支'发布/ ...'”这是问题吗?

2 个答案:

答案 0 :(得分:14)

解决方案是使用反斜杠在“release / ...”中逃避斜杠。所以我使用的命令是:

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

答案 1 :(得分:0)

这是一个稍微改进的版本,在进行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