Git别名无法推送,但有错误

时间:2013-04-23 12:04:23

标签: git

我正在创建一个git别名,如下所示(为便于阅读而分为几行):

git config --global alias.make-release '
! _() { if test "$1" != "2" ; then echo "git make-release TAG_NUMBER DESCRIPTION"; return 1; fi; }; 
_ "$#" 
&& git checkout release 
&& git merge master 
&& git fetch --tags 
&& git tag -a "$1" -m "$2" 
&& git push origin release --tags'

此命令将master合并到release中,从命令行参数创建一个新标记并将其推送到原点/释放。它可以直接创建标签。当我跑步时,我明白了:

Switched to branch 'release'
Already up-to-date.
error: src refspec Testing does not match any.
error: failed to push some refs to 'git@github.com:Stockopedia/prototype.git'

我有两个问题:

  1. 最后一个命令git push origin release --tags不起作用。 为什么?
  2. 最后两行是什么意思?他们为什么会这样?

1 个答案:

答案 0 :(得分:0)

这可能会更好,但我还没有对它进行全面测试 - 它的格式是为了便于阅读,而不是用于shell消费,你可能需要调整换行符并间隔一些:

git config --global alias.make-release '
! _() { if test "$1" != "2" ;
        then
          echo "git make-release TAG_NUMBER DESCRIPTION"
          return 1
        fi;
        git checkout release &&
        git merge master &&
        git fetch --tags &&
        git tag -a "$1" -m "$2" &&
        git push origin release --tags
}; _'

我认为最大的问题是误解了别名是如何扩展的。您发布的代码会导致扩展,给定git make-release arg1 arg2看起来像shell:

_() { if .... }; _ "$#" && git checkout .... && git push origin release --tags arg1 arg2

$#$1$2的扩展不太可能符合您的预期,甚至可能为空 - 参数不会传递给git tag,因为您似乎想要。要解决这个问题,整个事情需要在函数内部,函数名称是别名中的最后一个东西,所以你基本上得到了:

_() { .... }; _ arg1 arg2