如何为git [action]命令(包括空格)创建别名?


29

我的大部分别名都是这种形式: alias p='pwd'

我想起别名git commit以便git commit -v

但是尝试用空格创建别名会出现错误:

$ alias 'git commit'='git commit -v'
-bash: alias: `git commit': invalid alias name

Answers:


31

不是您问题的直接答案(因为别名只能是一个单词),但是您应该git-config改用:

git config --global alias.civ commit -v

这将创建一个git别名,以便git civ运行git commit -v。不幸的是,AFAIK 无法用别名覆盖现有的git命令。但是,您始终可以选择一个合适的别名作为替代名称。


请参阅添加的注释,以回答有关git config不是的问题git-config
Michael Durrant 2012年

至于这个答案给你链接明确的线程,它可以覆盖现有的git与别名的命令,与shell脚本的只是一点点。(顺便说一句,BTW我不是在发表评论,BTW。这个答案是在您发表后将近一年!我只是在发布它,希望人们能发现它对您有所帮助。)
sampablokuper

17

您在说的是一个包含空格的命令,但是这里的命令已经git存在,并且那里没有空格。

要调用git commit命令,您需要编写它

git\ commit ...
'git commit' ...
"git commit" ...

通常,命令的名称中没有空格,原因是在shell中调用它们很麻烦,因此,我认为您不会在系统上找到这样的命令。

csh,tcsh或zsh将允许您为上述任何别名加上别名,但bash或ksh则不允许别名(尽管pdksh允许您使用别名,但您不会使用它们)。在zsh中:

alias "'git commit'=git commit -v"
'git commit' ...

将使git command命令(当称为'git command'(仅带单引号)时)git具有commit-v参数的命令别名。不是我要找的东西。

因为alias只能使用别名命令,所以您在此处可以别名的就是git命令,您需要将别名别名为在其参数列表中的“提交”之后插入“ -v”的内容。最好是使用@ jw013的解决方案,但是如果出于某种原因您不能或不愿意,可以使用函数来代替别名,而不必使用别名:

git() {
  if [ "$1" = commit ]; then
    shift
    set -- commit -v "$@"
  fi
  command git "$@"
}

3
请注意,允许使用空格或其他特殊字符作为别名是Bourne样式的shell中不存在的csh功能(zsh以一种奇怪的方式进行模拟)。当第一个单词以任何方式加引号时,Bourne样式的外壳将禁用别名扩展,请参阅Renan的答案
吉尔(Gilles)“所以,别再邪恶了”

是。这就是为什么我说它只能在没有该错误的csh,tcsh和zsh中工作。请注意,Bourne Shell不支持别名。别名由csh引入。
斯特凡Chazelas

9

在Bash中,您无法为其中带有任何空格的命令创建别名。
但是,我在.bashrc中使用以下功能作为解决方法。

sudo() { if [[ $@ == "pacman -Syu" ]]; then command pacup.sh; else command sudo "$@"; fi; }

工作原理是:从要调用的命令开始。就我而言sudo
然后,您提到需要什么参数。在这种情况下,pacman -Syu
如果触发,应执行什么命令?在上述声明中,它是pacup.sh
否则,将执行什么命令sudo $@$@就像您已经猜到的那样,它是命令采用的参数列表。

因此,针对您的特定情况执行命令将是:

git() { if [[ $1 == "commit" ]]; then command git commit -v; else command git "$@"; fi; }

但是,此解决方案适用于更常见的情况,即您要为命令中的空格加上别名。
在您的特定情况下,我建议您使用jw013的解决方案来别名git命令,使用git-config


不是if [[ $1 == 'commit' ]]...吗 $ @的扩展可能会包含更多您实际想要保留的args。
kojiro 2012年

对!我的坏。我只是更改了我用于系统的语句。
darnir 2012年

太棒了-谢谢-非常适合我的需求;
csseller

4

bash别名手册页

检查每个简单命令的第一个单词(如果未引用),以查看其是否具有别名。如果是这样,则将该单词替换为别名的文本。别名和替换文本可以包含任何有效的shell输入,包括shell元字符,但别名不能包含“ =”。

测试替换文本的第一个单词是否具有别名,但是与被扩展的别名相同的单词不会第二次扩展。例如,这意味着可以将ls别名为“ ls -F”,并且Bash不会尝试递归扩展替换文本。

因此,由于只检查了第一个单词,因此不能有多个单词的别名。在此超级用户问题中,提供了使用函数的解决方法:

ls() { if [[ $@ == "-la" ]]; then command ls -la | more; else command ls "$@"; fi; }

可以适应git


您提供的链接与我拥有的bash文档不同,并且似乎与bash行为相矛盾。上面说,别名名称中允许使用空格。即使该页面明确显示bash,在我看来,它也更像zsh行为。
斯特凡Chazelas

2
如果以任何方式引用一个单词,则@sch Bourne / POSIX外壳将绕开别名扩展。例如,\ls绕过别名ls
吉尔斯(Gillles)“所以-别再邪恶了”

1
@吉尔斯。Bourne shell不实现别名。POSIX说[_!%,@],必须扩展与有效别名(仅是ASCII alnum + )匹配的未加引号的单词。它不禁止扩展名,例如zsh的别名'\ ls'或ksh / dash / bash / zsh的别名别名,a-b否则将不存在任何POSIX shell。它只是说一个可移植的脚本(不是shell)不应该使用任何这样的别名。
斯特凡Chazelas

2
@sch POSIX 允许实现在别名中使用其他字符,引用单词的任何部分均会阻止别名扩展。如果您'git commit'在POSIX Shell中的命令位置中编写命令,则它必须调用内置实用程序,函数或外部命令。
吉尔斯(Gillles)“所以别再作恶了”

0

即使正确的解决方案是使用建议的jw013之类的别名,也可以使用别名创建带空格的别名。

例如,我有一个别名可以在本地和远程删除分支,但是我希望用户始终指定分支:

remrem = "!sh -c 'if [ $# -ne 1 ]; then git specBranch; else git push origin :$1 && git branch -d $1; fi' -"

#echoing aliases
specBranch = "!sh -c 'echo Specify branch please!'" 

-1

这个例子中,这应该工作:

因此,如果您仍想将sudo与其他命令一起使用,而不是与shutdown一起使用,并且如果您可以承受别名别名关闭其他内容,则可以使用:

alias sudo='sudo '
alias shutdown="echo nope"

但是用你的命令:

alias git='git '
alias commit="commit -v"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.