具有多个命令的Git别名的语法

时间:2013-09-17 22:06:32

标签: git

我想创建一个Git别名来执行多个命令,但是我找不到有关如何完成此操作的文档。

  1. 具有多个命令的Git别名的语法是什么?
  2. 这在哪里记录?
  3. 来自'man git-config'

       alias.*
    
         

    git(1)命令包装器的命令别名 - 例如在定义“alias.last = cat-file commit HEAD”之后,调用“git   last“相当于”git cat-file commit HEAD“。以避免混淆   和              脚本使用的麻烦,忽略隐藏现有Git命令的别名。参数由空格分开,通常是shell   支持引用和转义。报价对和反斜杠都可以   用过的              引用它们。

         

    如果别名扩展以感叹号作为前缀,则将其视为shell命令。例如,定义   “alias.new =!gitk --all --not ORIG_HEAD”,调用“git new”是              相当于运行shell命令“gitk --all --not ORIG_HEAD”。请注意,shell命令将从中执行   存储库的顶级目录,可能不一定是   当前              目录。通过从原始当前目录运行git rev-parse --show-prefix来设置GIT_PREFIX。看到   GIT-REV-解析(1)。

4 个答案:

答案 0 :(得分:43)

$ git config alias.q '!echo a; echo b'

$ git q

输出:

a
b

我认为man git-config alias.*git init 记录了(基本上)

请注意,与普通别名不同,git命令应包含git。这是因为它被视为shell命令,而不是git命令(请参阅问题中引用的联机帮助页)。例如链接

git commit --allow-empty -m "empty initial commit"

"!git init; git commit --allow-empty -m \"empty initial commit\""

有必要创建

{{1}}

别名。

答案 1 :(得分:22)

说明命令为echo aecho b(不是ab),为别名q添加多个命令:

从命令行:
git config alias.q '!echo a; echo b'

直接在配置文件中:

[alias]
    q = "!echo a; echo b"

对于更复杂的事情,定义一个shell函数并调用它:
'!f() { echo a ; echo b ; }; f'

要将参数传递给命令,请参阅:
Git alias with positional parameters
Git Alias - Multiple Commands and Parameters

基于Jonathan Wakely的评论

答案 2 :(得分:1)

附录答案:我经常需要更复杂的命令来决定通过位置参数做什么,分支参数或循环参数或输入文件。

这些命令对于单行而言过于复杂,并且难以在一行上读取和编辑。但我发现了一种从文件中执行非常复杂命令的简单方法:

假设您的存储库中有一个名为alias/cmd的文件:

!function f {
    if [ -z "$1" ]
    then echo "Please give me some argument!" 1>&2
        exit -1
    fi
    echo "Hello $1"
}; f

然后你可以简单地说

git config alias.cmd "`cat alias/cmd`"

从文件中定义别名cmd

git config --get alias.cmd > alias/cmd

将定义的别名写入文件。

答案 3 :(得分:0)

我也很难为自己找到一个很好的例子。经过一番研究,这是我想到的:

git config --global alias.purge '!f() { if [ $(git ls-remote --heads origin $1 | wc -l) -eq 1 ]; then git branch -d $1 && git push origin --delete $1; else echo "remote branch not found"; fi } ; f'

让我们从左到右分解一下,好吗?

git config --global别名。 我们现在知道了。这是创建别名所需的代码。在本网站上通常称为[别名]

清除 是我决定使用别名的简称

'f(){ 我们开始编写函数

如果[ if语句的开始,稍后用]

将其关闭

git ls-remote --heads origin $ 1 检查是否存在一个使用我们提供的名称的远程分支。如果没有分支,则返回值将为空,否则将返回引用标记。通过将其包含在 $()中,我们可以确保它作为命令被Bash知道

| wc -1 作为后缀添加,如果没有远程分支,则将返回值转换为0,如果有远程分支,则将返回值转换为

-eq 1 将整个封闭的命令转换为布尔值,表示为(returnValue == 1)

  

注意:由于命令写在一行上,而不是每行后面\ n,所以我们需要在每个命令后键入;

然后 用于宣布如果布尔值返回true,我们的函数应该做什么

git branch -d $ 1 将会删除我们输入的参数的本地分支

&& 这个逻辑运算符将确保两个命令都被执行

git push origin –删除$ 1 将删除我们输入的参数的远程分支

其他 做if-else的后半部分应该做什么

回显“未找到远程分支” 是一个我想在没有远程分支的情况下返回的字符串

fi 宣布我们的if-else语句结束

}; f' 关闭我们的功能

'complex' git alias for my branch named "security"