我遇到的问题类似于问题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="giovanni.azua@xxx.com";
GIT_AUTHOR_NAME="Giovanni Azua";
GIT_AUTHOR_EMAIL="giovanni.azua@xxx.com";
git commit-tree "$@";
else
git commit-tree "$@";
fi' HEAD
如果中间有空格,那么等号将不起作用,我不知道如何逃避它。我也尝试像giovanni\ azua
一样逃避它,但是没有用。我也找不到任何关于这个脚本的参考,即如何匹配字符串contains
或substring
?我总是得到输出WARNING: Ref 'refs/heads/master' is unchanged
。
更新:它还会检查我的信箱是否有if [ "$GIT_AUTHOR_NAME" ~= "giovanni azua" ];
但操作员~=
不起作用。
答案 0 :(得分:2)
git filter-branch
使用的脚本只是sh
的一小部分,这意味着sh
的所有功能以及您可以从中调用的任何命令(echo
,{ {1}},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="giovanni.azua@xxx.com"
GIT_AUTHOR_NAME="Giovanni Azua"
GIT_AUTHOR_EMAIL="giovanni.azua@xxx.com"
git commit-tree "$@"
;;
*)
git commit-tree "$@"
;;
esac
' HEAD
或giovanni
以及Giovanni
或azua
(按此顺序)作者姓名中任何位置的所有提交。