19

如何改写已经推送到私人远程的旧提交的消息?我想保留时间戳和标签。

我在这里找到了这个命令:

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

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

执行命令时 git 告诉我:msg filter failed

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

4

2 回答 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
于 2013-10-30T11:47:37.420 回答
0

这是一个稍微改进的版本,它还可以在执行过滤分支时动态更新提交消息中对提交哈希的所有引用:

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
于 2016-01-13T08:16:44.283 回答