更改以模式开头的提交的提交作者(在消息中)

时间:2015-07-02 13:38:35

标签: git

我有一个存储库,其中有一些(实际上很多)提交由程序生成,如下所示:

Adding new domains: example.com

这些提交是以同事的名义进行的(因为配置错误)。现在,我想更改这些提交作者:

Some Bot <bot@example.com>

Github发布了一个公共脚本here来更改旧作者过滤的提交。在这种情况下,我想要更改提交的作者,其中的消息以模式开头:添加新域:。我怎么能这样做?

2 个答案:

答案 0 :(得分:5)

您可以使用--env-filterrev-list参数(在这种情况下为--grep=<pattern>)来限制您要修改的提交:

#!/bin/sh

git filter-branch --env-filter '

CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="your-correct-email@example.com"

export GIT_AUTHOR_NAME="$CORRECT_NAME"
export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"

' --tag-name-filter cat -- --branches --tags --grep='Adding new domains'

您可以使用 git - 前缀保存此脚本,并将其放在PATH中的某个位置,例如。 /usr/local/bin/git-change-author(确保它是可执行的)并从您的存储库中运行它:

git change-author

自从重写历史以来,不要忘记git push --force

答案 1 :(得分:4)

在这种情况下,我认为您必须使用--commit-filter过滤器。这是同时获取提交消息(来自stdin)和环境变量的唯一方法。新脚本必须完全复制commit-tree的所有功能。幸运的是,它看起来与您链接的GitHub脚本有所不同。

首先,将整个提交消息读入Bash变量:

commitmsg=$(cat)

现在获取它的第一行并测试它是否匹配:

firstline=$(echo "$commitmsg" | head -n1 | grep "Adding new domains:")
if [ "$firstline" ]; then

我们匹配了提交消息,所以定期替换,就像在GitHub的脚本中一样。

    export GIT_AUTHOR_NAME="$CORRECT_NAME"
    export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi

现在我们必须致电git commit-tree。提交消息在stdin上提供,就像我们得到它一样。由于我们的脚本充当commit-tree代理,我们也需要传递所有参数。我们(可能已经)修改的环境变量将自行处理。

echo "$commitmsg" | git commit-tree "$@"

这会将哈希值发送到stdout,就像我们要求的那样。在这一点上,我们已经完成了!

这里是已完成脚本的副本。 YMMV,当然,但我测试了它,它工作正常。

#!/bin/bash

git filter-branch --commit-filter '

CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="your-correct-email@example.com"

commitmsg=$(cat)

firstline=$(echo "$commitmsg" | head -n1 | grep "Adding new domains:")
if [ "$firstline" ]; then
    export GIT_AUTHOR_NAME="$CORRECT_NAME"
    export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi

echo "$commitmsg" | git commit-tree "$@"

' --tag-name-filter cat -- --branches --tags