我有一个存储库,其中有一些(实际上很多)提交由程序生成,如下所示:
Adding new domains: example.com
这些提交是以同事的名义进行的(因为配置错误)。现在,我想更改这些提交作者:
Some Bot <bot@example.com>
Github发布了一个公共脚本here来更改旧作者过滤的提交。在这种情况下,我想要更改提交的作者,其中的消息以模式开头:添加新域:。我怎么能这样做?
答案 0 :(得分:5)
您可以使用--env-filter
和rev-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