Most of my my aliases are of this form: alias p='pwd'

I want to alias git commit so that it does git commit -v

But trying to create an alias with a space gives an error:

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

6 Answers 6


Not a direct answer to your question (since aliases can only be one word), but you should be using git-config instead:

git config --global alias.civ commit -v

This creates a git alias so that git civ runs git commit -v. Unfortunately, AFAIK there is no way to override existing git commands with aliases. However, you can always pick a suitable alias name to live with as an alternative.

  • See note added to answer about git config not git-config Sep 25, 2012 at 13:46
  • As this answer to the thread that you linked makes clear, it is possible to override existing git commands with aliases, with just a little bit of shell script. (I'm not posting this comment as a criticism, BTW. That answer was posted nearly a year after yours! I'm just posting it in the hope that people might find it helpful.)
    – user6860
    Apr 7, 2018 at 17:59

You're talking about a command that includes a space, but here the command is git and there's no space in there.

To call a git commit command, you'd need to write it

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

Generally commands don't have space in their names for that reason that it is cumbersome to call them in a shell, so I don't think you'll find such a command on your system.

csh, tcsh or zsh will allow you to alias any of those above, but not bash or ksh (though pdksh will allow you but you won't let you use them). In zsh:

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

Will make the git command command (when called as 'git command' (with the single quotes) only) an alias for the git command with the commit and -v arguments. Not what you were looking for I'd guess though.

Because alias can only alias commands, all you can alias here is the git command, and you'd need to alias it to something that inserts a "-v" after "commit" in its list of arguments. Best would be to go with @jw013's solution but if for some reason you can't or wouldn't, instead of using an alias, you could use a function to do the job:

git() {
  if [ "$1" = commit ]; then
    set -- commit -v "$@"
  command git "$@"
  • 3
    Note that allowing aliases with spaces or other special characters is a csh feature not present in Bourne-style shells (which zsh emulates in a strange way). Bourne-style shells disable alias expansion when the first word is quoted in any way, see Renan's answer. Sep 22, 2012 at 23:40
  • Yes. That's why I said it only worked in csh, tcsh and zsh that don't have that bug. Note that the Bourne shell doesn't support aliases. Aliases were introduced by csh. Sep 23, 2012 at 7:19

In Bash you cannot create an alias for for a command with any whitespace in it.
However, I use the following function in my .bashrc as a workaround.

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

How this works is: You start with the command you wish to call. In my case it is sudo.
Then, you mention what parameters would it take. In this case, pacman -Syu.
If, triggered, what command should it execute? In the above statement it is pacup.sh.
Else, what command is to be executed, sudo $@. $@ is, as you will have guessed by the, the parameter list the command takes.

So, making the command for your particular case, it would be:

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

However, this solution is for the more general case of when you want to alias commands with whitespaces in them.
In your specific case, I would recommend you go with jw013's solution to alias your git commands using git-config

  • Don't you mean if [[ $1 == 'commit' ]]...? The expansion of $@ may have more args for commit you actually want to keep.
    – kojiro
    Sep 23, 2012 at 12:43
  • Right! My bad.. I simply changed the statement that I was using for my system.
    – darnir
    Sep 23, 2012 at 12:55
  • This is awesome - thanks - it's perfect for what I needed;
    – cgseller
    Mar 25, 2016 at 19:47

From the bash alias man page

The first word of each simple command, if unquoted, is checked to see if it has an alias. If so, that word is replaced by the text of the alias. The alias name and the replacement text may contain any valid shell input, including shell metacharacters, with the exception that the alias name may not contain `='.

The first word of the replacement text is tested for aliases, but a word that is identical to an alias being expanded is not expanded a second time. This means that one may alias ls to "ls -F", for instance, and Bash does not try to recursively expand the replacement text.

So, because only the first word is checked, you can't have an alias with multiple words. In this Super User question, a workaround using a function is provided:

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

It can be adapted to git.

  • That link you give is different from the bash documentation I have and seems to be in contradiction with bash behavior. It says above that spaces for instance are allowed in alias names. It looks more like zsh behavior to me even if that page does explicitely say bash. Sep 22, 2012 at 15:47
  • 2
    @sch Bourne/POSIX shells bypass alias expansion if a word is quoted in any way. For example \ls bypasses an alias for ls. Sep 22, 2012 at 23:41
  • 1
    @Gilles. The Bourne shell doesn't implement aliases. POSIX says an unquoted word matching a valid alias name (being only ASCII alnum + [_!%,@]) shall be expanded. It doesn't forbid extensions like zsh's aliasing of '\ls', or ksh/dash/bash/zsh's aliasing of a-b otherwise there wouldn't exist any single POSIX shell. It just says a portable script (not shell) shouldn't use any such alias. Sep 23, 2012 at 13:59
  • 2
    @sch POSIX allows implementations to use other characters in aliases but quoting any part of the word inhibits alias expansion. If you write 'git commit' in command position in a POSIX shell, it must invoke a built-in utility, a function or an external command. Sep 23, 2012 at 14:36

Even though the correct solution is to use aliases like jw013 suggested, to make alias with spaces you can NEST aliases.

For example I have an alias to delete branch both locally and remotely, but I would like the user to specify branch always:

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!'" 

From this example, this should work:

So, if you still want to use sudo with other commands but not with shutdown and if you can afford to alias shutdown to something else, you can have:

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

But with your commands:

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

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .