git filter分支——重写推送提交消息的msg filter

git filter分支——重写推送提交消息的msg filter,git,message,commit,git-filter-branch,revision-history,Git,Message,Commit,Git Filter Branch,Revision History,如何重写已推送到专用远程服务器的旧提交的消息? 我想保留时间戳和标签 我发现这个命令: git过滤器分支-f--msg过滤器\ “sed“s///g”--all 为了保留我添加的标签:——标签名称过滤器cat 执行命令时,git告诉我:msg filter失败 我要更改的消息是一条合并消息“Merge branch'release/…”。这是问题吗?解决方案是使用反斜杠将“release/…”中的斜杠转义。所以我使用的命令是: git过滤器分支-f--msg过滤器\ “sed”s/releas

如何重写已推送到专用远程服务器的旧提交的消息? 我想保留时间戳和标签

我发现这个命令:

git过滤器分支-f--msg过滤器\
“sed“s///g”--all
为了保留我添加的标签:
——标签名称过滤器cat

执行命令时,git告诉我:msg filter失败


我要更改的消息是一条合并消息“Merge branch'release/…”。这是问题吗?

解决方案是使用反斜杠将“release/…”中的斜杠转义。所以我使用的命令是:

git过滤器分支-f--msg过滤器\
“sed”s/release\/Version-[0-9].[0-9].[0-9]/develope/g”\
--标签名称过滤器cat--all

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

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
rm-f/tmp/git;
touch/tmp/git;
git滤波器支路\
--子目录过滤器\
--标签名称过滤器cat\
--提交过滤器'echo-n“s/${GIT_commit}/“>>/tmp/GIT\
NEW=`git\u commit\u non\u empty\u tree“$@`\
echo“${NEW}/g”>>/tmp/git;echo${NEW}'\
--消息过滤器'sed-f/tmp/git'\
----全部

Scripting git rebase-i是另一个选项:或者,在sed表达式中使用不同的分隔符,例如
sed“s|release/Version-[0-9].[0-9].[0-9]| developer | g”