我想创建一个Git别名来执行多个命令,但是我找不到有关如何完成此操作的文档。
来自'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)。
答案 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 a
和echo b
(不是a
和b
),为别名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' 关闭我们的功能