在我想要完全编辑特定提交的情况下,我使用以下命令:
git filter-branch --env-filter \
"if test \$GIT_COMMIT = '5b740c488f0e4251a6e534cab79da8b05de7a195'
then
export GIT_AUTHOR_NAME='John Doe'
export GIT_COMMITTER_NAME='John Doe'
export GIT_AUTHOR_EMAIL='john.doe@gmail.com'
export GIT_COMMITTER_EMAIL='john.doe@gmail.com'
export GIT_AUTHOR_DATE='1493100264'
export GIT_COMMITTER_DATE='1493100264'
fi"
有没有办法编辑提交邮件?
我知道我可以将--msg-filter
与sed
混合使用,但如果多次提交具有相同的提交消息,则可能会出现问题。
我想要的是一种告诉“对于这个SHA,将提交消息设置为X”的方法,类似于我编辑作者和提交日期的方式
非常感谢!
答案 0 :(得分:2)
您已经知道如何在--env-filter
中进行测试。那么你需要意识到的是--msg-filter
is used in the very same place as --env-filter
: 1
eval "$filter_env" < /dev/null || die "env filter failed: $filter_env" ... { while IFS='' read -r header_line && test -n "$header_line" do # skip header lines... :; done # and output the actual commit message cat } <../commit | eval "$filter_msg" > ../message || die "msg filter failed: $filter_msg"
$filter_env
的默认值为空,但会被--env-filter
参数替换。 $filter_msg
的默认值为cat
;这同样被您的--msg-filter
参数替换。
在eval
,$GIT_COMMIT
等全部设置的环境中,两者都是$GIT_AUTHOR_EMAIL
直接编辑。由于filter_msg
在管道的右侧进行了评估,因此更改到环境变量会丢失(因此您必须在其他过滤器中进行任何所需的更改),但您可以仍然检查他们。由于首先运行$filter_env
,因此您必须考虑在$filter_msg
运行时您所做的任何更改都有效。
因此:
我想要的是告诉&#34;对于这个SHA,将提交消息设置为X&#34;,类似于我编辑作者和提交日期的方式。
转换为:
--msg-filter 'if test $GIT_COMMIT = 5b740c488f0e4251a6e534cab79da8b05de7a195;
then cat >/dev/null && cat $HOME/tmp/prepared-msg; else cat; fi'
或类似的。 (cat >/dev/null
在这里有点偏执,以丢弃标准输入以避免管道错误。如果您使用sed
编辑消息,请不要丢弃标准输入。)
1 我不知道为什么git-filter-branch.sh
代码使用{ while ... }
循环从提交中剥离标头,而sed -e '1,/^$/d'
就足够了。 ......啊,我可能还记得原因:有些sed
要求消息以最终换行结束。是的,这就是原因:see commit df0620108b9710a06d5a2d9c125d43b97590cce6)
答案 1 :(得分:1)
所以,如果有人正在寻找一个有效的命令,那么这就是我使用的命令:
git filter-branch --msg-filter \
"if test \$GIT_COMMIT = '5b740c488f0e4251a6e534cab79da8b05de7a195'
then
echo 'New commit message!\nOn multiple lines'; else cat
fi"