我有一个类似于问题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那样逃离它,但不起作用。我也找不到这个脚本的任何引用,即如何进行字符串containssubstring匹配?我总是得到输出WARNING: Ref 'refs/heads/master' is unchanged
更新:它还将选中我的复选框,使其具有notif [ "$GIT_AUTHOR_NAME" ~= "giovanni azua" ];但运算符~=不工作。

最佳答案

git filter-branch使用的脚本只是sh的一个片段,这意味着sh的所有功能以及可以从中调用的任何命令(echogrepsed等)都可以由您随意使用。要实现通配符匹配,您不需要调用外部命令,因为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

上述操作将更改其作者名称中包含giovanniGiovanniazuaAzua的所有提交(按此顺序)。

08-27 06:28