git

Syntax for Git aliases with multiple commands


I want to create a Git alias to perform multiple commands, but I cant find documentation on how this is done.

  1. What is the syntax for Git aliases with multiple commands?
  2. Where is this documented?

From 'man git-config'

   alias.*

Command aliases for the git(1) command wrapper - e.g. after defining "alias.last = cat-file commit HEAD", the invocation "git last" is equivalent to "git cat-file commit HEAD". To avoid confusion and troubles with script usage, aliases that hide existing Git commands are ignored. Arguments are split by spaces, the usual shell quoting and escaping is supported. quote pair and a backslash can be used to quote them.

If the alias expansion is prefixed with an exclamation point, it will be treated as a shell command. For example, defining "alias.new = !gitk --all --not ORIG_HEAD", the invocation "git new" is equivalent to running the shell command "gitk --all --not ORIG_HEAD". Note that shell commands will be executed from the top-level directory of a repository, which may not necessarily be the current directory. GIT_PREFIX is set as returned by running git rev-parse --show-prefix from the original current directory. See git-rev-parse(1).


Solution

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

    Output:

    a
    b
    

    I think this is (rudimentarily) documented in man git-config under alias.*

    Note that git commands should include git, unlike in normal aliases. It is caused by fact that it is treated as a shell command, not as a git command (see manpage quoted in the question). For example to chain

    git init
    

    and

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

    it is necessary to create

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

    alias.