40

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

  1. 具有多个命令的 Git 别名的语法是什么?
  2. 这是在哪里记录的?

来自'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_PREFIX 设置为通过从原始当前目录运行 git rev-parse --show-prefix 返回。请参阅 git-rev-parse(1)。

4

4 回答 4

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

$ git q

输出:

a
b

我认为这(初步)记录man git-config在下alias.*

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

git init

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

有必要创建

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

别名。

于 2013-09-17T22:14:00.900 回答
25

Say the commands are echo a and echo b (not a and b), to add multiple commands for an alias q:

From the command line:
git config alias.q '!echo a; echo b'

Directly in the configuration file:

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

For more complex things, define a shell function and call it:
'!f() { echo a ; echo b ; }; f'

For passing parameters to the commands see:
Git alias with positional parameters
Git Alias - Multiple Commands and Parameters

Based in Jonathan Wakely's comment

于 2014-02-07T14:57:56.203 回答
2

附录回答:通常我需要更复杂的命令来决定通过位置参数做什么,并在参数上进行分支或循环访问参数或输入文件。

这样的命令对于单行来说太复杂了,而且很难在一行中阅读和编辑。但是我找到了一种真正简单的方法来从文件中执行非常复杂的命令:

假设您在存储库中调用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

将定义的别名写入文件。

于 2017-02-09T10:06:16.447 回答
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 别名。 我们现在知道了。这是我们创建别名所需的代码。在本网站上通常称为 [别名]

purge 是我决定给我的别名的简写名称

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

if [ if 语句的开始,稍后用]结束它

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

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

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

注意:因为命令写在一行上,而不是每条后面的 \n,我们需要输入; 在每个命令之后

then 用于声明如果布尔值返回 true 我们的函数应该做什么

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

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

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

else 做了 if-else 的后半部分应该做的事情

echo "remote branch not found" 是我想返回的字符串,以防没有远程分支

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

} ; f' 关闭我们的函数

我的分支的“复杂”git别名

于 2019-09-18T19:42:25.640 回答