我有一个类似于问题How do I change the author of a commit in git?中描述的问题,我正在尝试的解决方案是使用git filter-branch
但它不起作用,因为它不会将字符串文本与空格匹配,即我需要contains
:
git filter-branch --commit-filter '
if [ "$GIT_AUTHOR_NAME" = "giovanni azua" ];
then
GIT_COMMITTER_NAME="Giovanni Azua";
GIT_COMMITTER_EMAIL="[email protected]";
GIT_AUTHOR_NAME="Giovanni Azua";
GIT_AUTHOR_EMAIL="[email protected]";
git commit-tree "$@";
else
git commit-tree "$@";
fi' HEAD
如果中间有空格,等号就不起作用,我也不知道怎么逃开它。我也试过像
giovanni\ azua
那样逃离它,但不起作用。我也找不到这个脚本的任何引用,即如何进行字符串contains
或substring
匹配?我总是得到输出WARNING: Ref 'refs/heads/master' is unchanged
。更新:它还将选中我的复选框,使其具有not
if [ "$GIT_AUTHOR_NAME" ~= "giovanni azua" ];
但运算符~=
不工作。 最佳答案
git filter-branch
使用的脚本只是sh
的一个片段,这意味着sh
的所有功能以及可以从中调用的任何命令(echo
、grep
、sed
等)都可以由您随意使用。要实现通配符匹配,您不需要调用外部命令,因为sh
提供了一些笨拙但有用的case
命令。在你的例子中(没有双关语的意思),可能是这样的:
git filter-branch --commit-filter '
case "$GIT_AUTHOR_NAME" in
*[Gg]iovanni*[Aa]zua*)
GIT_COMMITTER_NAME="Giovanni Azua"
GIT_COMMITTER_EMAIL="[email protected]"
GIT_AUTHOR_NAME="Giovanni Azua"
GIT_AUTHOR_EMAIL="[email protected]"
git commit-tree "$@"
;;
*)
git commit-tree "$@"
;;
esac
' HEAD
上述操作将更改其作者名称中包含
giovanni
或Giovanni
和azua
或Azua
的所有提交(按此顺序)。