使用git filter-branch --msg-filter命令来修改已推送的提交消息。

20
我如何重新表述已经推送到私有远程仓库的旧提交信息?我想保留时间戳和标签。
我在这里找到了这个命令:here:
git filter-branch -f --msg-filter \
'sed "s/<old message>/<new message>/g"' -- --all

为了保留添加的标签,我使用了以下命令: --tag-name-filter cat

执行该命令时,Git提示我:msg filter failed。

我想要更改的信息是合并消息 "Merge branch 'release/...'",这是问题的原因吗?


使用脚本编写git rebase -i是另一种选择:https://dev59.com/Smct5IYBdhLWcg3wCZMT - MarcH
2个回答

19

解决方案是使用反斜杠转义"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
或��在sed表达式中使用不同的分隔符,例如 sed "s|release/Version-[0-9].[0-9].[0-9]|develop|g" - ssc

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接