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

时间:2013-09-20 17:11:57

标签: git bash git-filter-branch

我遇到的问题类似于问题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

更新:它还会检查我的信箱是否有if [ "$GIT_AUTHOR_NAME" ~= "giovanni azua" ];但操作员~=不起作用。

1 个答案:

答案 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以及Giovanniazua(按此顺序)作者姓名中任何位置的所有提交。