我有一个存储库,其中有一些(实际上很多)提交由程序生成,如下所示:
Adding new domains: example.com
Run Code Online (Sandbox Code Playgroud)
它发生了(因为配置错误)这些提交是以同事的名义进行的.现在,我想更改这些提交作者:
Some Bot <bot@example.com>
Run Code Online (Sandbox Code Playgroud)
Github在此处发布了一个公共脚本,用于更改由旧作者过滤的提交.在这种情况下,我想更改提交的作者,其中消息以模式开头:添加新域:.我怎样才能做到这一点?
您可以使用--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'
Run Code Online (Sandbox Code Playgroud)
您可以使用git-前缀保存此脚本并将其放在PATH中的某个位置,例如./usr/local/bin/git-change-author(确保它是可执行的)并从您的存储库运行它:
git change-author
Run Code Online (Sandbox Code Playgroud)
git push --force自从你重写历史以来,别忘了.
在这种情况下,我认为你必须使用--commit-filter过滤器。这是同时获取提交消息(来自标准输入)和环境变量的唯一方法。新脚本必须完全复制commit-tree. 幸运的是,它看起来与您链接的 GitHub 脚本没有太大不同。
首先,将整个提交消息读入 Bash 变量:
commitmsg=$(cat)
Run Code Online (Sandbox Code Playgroud)
现在获取它的第一行并测试它是否匹配:
firstline=$(echo "$commitmsg" | head -n1 | grep "Adding new domains:")
if [ "$firstline" ]; then
Run Code Online (Sandbox Code Playgroud)
我们匹配了提交消息,因此进行常规替换,就像在 GitHub 的脚本中一样。
export GIT_AUTHOR_NAME="$CORRECT_NAME"
export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
Run Code Online (Sandbox Code Playgroud)
现在我们必须打电话git commit-tree。提交消息在标准输入上提供,就像我们收到的一样。由于我们的脚本充当代理commit-tree,因此我们还需要传递所有参数。我们(可能已经)修改的环境变量会自行处理。
echo "$commitmsg" | git commit-tree "$@"
Run Code Online (Sandbox Code Playgroud)
这会将哈希值发送到标准输出,就像我们需要做的那样。至此,我们就完成了!
这是已完成脚本的副本。YMMV,当然,但我测试过它并且工作正常。
commitmsg=$(cat)
Run Code Online (Sandbox Code Playgroud)