使用`git filter-branch`时有更好的匹配方法吗?

3

我有一个问题和这个问题描述中的问题 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这样进行转义,但不起作用。我也找不到任何关于脚本的参考,如何执行字符串containssubstring匹配?我总是得到输出WARNING: Ref 'refs/heads/master' is unchanged
更新:如果[“$GIT_AUTHOR_NAME”~=”giovanni azua”]也能检查我的内容,但运算符~=不起作用。

如果我理解正确,您想要一个正则表达式或通配符样式匹配,这样如果GIT_AUTHOR_NAME是(比如)pgiovanni azuaq,它也应该匹配?(可能不是,但这意味着您需要考虑确切的匹配内容。)测试if [ ... ]只是运行[程序(请参见test文档)。使用exprgrep来运行正则表达式匹配。 - torek
1个回答

2
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="giovanni.azua@xxx.com"
          GIT_AUTHOR_NAME="Giovanni Azua"
          GIT_AUTHOR_EMAIL="giovanni.azua@xxx.com"
          git commit-tree "$@"
          ;;
      *)
          git commit-tree "$@"
          ;;
      esac
' HEAD

以上命令将更改所有作者名称中包含 giovanniGiovanni 以及 azuaAzua(按照此顺序)的提交记录的作者名称。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接