0

我正在创建一个 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'

该命令合并masterrelease,从命令行参数创建一个新标签并将其推送到 origin/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. 最后两行是什么意思?它们为什么会发生?
4

1 回答 1

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到外壳看起来像:

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

其中$#,$1和的扩展$2不太可能是您所期望的,甚至可能是空的 - 参数没有git tag按照您的意愿传递。为了解决这个问题,整个事情需要在函数内部,函数名是别名中的最后一个,所以你基本上得到:

_() { .... }; _ arg1 arg2
于 2013-04-23T14:42:56.417 回答