使用git filter-branch

时间:2017-04-25 06:22:22

标签: git

在我想要完全编辑特定提交的情况下,我使用以下命令:

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-filtersed混合使用,但如果多次提交具有相同的提交消息,则可能会出现问题。

我想要的是一种告诉“对于这个SHA,将提交消息设置为X”的方法,类似于我编辑作者和提交日期的方式

非常感谢!

2 个答案:

答案 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"