Home

Awesome

git-extend(1)

git-extend is a CLI for extending Git builtins.

Table of Contents

Description

git-extend extends Git builtins via closures<sup>1</sup>. Simply put, it provides an interface for user-defined functionality.

FAQs

How is this different from using git-config variables?

git-config variables are preselected. git-extend augments Git builtins with options and functionality you specify.

What advantages does git-extend provide that I can't get from git-config?

With git-config, you're confined to variables designated for the builtin. There is no builtin override, so the alternative is to define an alias. With git-extend, user-defined options and functionality wrap the builtin, providing convenient control over invocation context.

What advantages does git-extend provide that I can't get from a shell alias? Or a shell function?

A shell alias is just that - an alias you have to remember, or look up. A shell function works, but isn't truly scalable.

What about hooks?

Hooks are great for certain actions, but are predetermined and, therefore, limited.

Can I still use builtin options for the command?

Absolutely, that's the point of git-extend. It can be viewed as a type of closure, providing additional context.

Installation

Important: Please read the Caveats section before continuing.

Homebrew

brew tap nickolasburr/pfa
brew install git-extend

Manual

git clone https://github.com/nickolasburr/git-extend.git
cd git-extend
make build
make install

Outlined below are the two (2) make steps needed for installation:

make build

git-extend uses an absolute path to invoke git. By default, the path is /usr/bin/git, and can be modified at build.

The install prefix for git is represented by GITPREFIX, and defaults to /usr. Git is often prefixed at /usr or /usr/local.

As an example, if the executable is located at /usr/local/bin/git, run:

make build GITPREFIX=/usr/local

If the executable is located at /usr/bin/git, simply run make.

make install

The install prefix for git-extend is represented by PREFIX, and defaults to /usr/local.

The following are installed and symlinked in PREFIX:

To install git-extend under an alternate prefix, pass PREFIX to make install.

Pitfalls

Common installation pitfalls to be mindful of:

Once installed, add $PREFIX/bin to your PATH. It is important for the git-extend symlink to be the first git resolved in your PATH. You can validate this by running type -all git or git extend --path.

Configuration

Configuration is straightforward. To use a command closure, name the file accordingly, add it to your PATH, and make it executable.

For more details on closures, see Closures.

Caveats

Below are important caveats and considerations to think about prior to installation:

Homebrew Users

Options

Examples

  1. Get the name of the previous branch (see git-branch).

    git branch --last
    
  2. Add the first pathspec in the list derived from git status --numbered (see git-add).

    git add %1
    
  3. Bypass git-log command closure and get the last five log entries.

    git --bypass log --max-count=5
    
  4. Merge the previous branch into master and, upon successful merge, delete the previous branch (see git-merge).

    git checkout master
    git merge --no-ff --trim -
    

Closures

A command closure is an executable script that provides additional context when invoking a Git builtin. In order for git-extend to use a closure, the file must be:

To verify a command closure is usable, run type -all git-<COMMAND>.

Templates are provided for several porcelain commands, including:

For a complete list of pre-built command closures, see TEMPLATES.

While the aim is to augment existing commands, closures are not limited to builtins. In fact, you can create arbitrary Git commands with the conventions outlined above, and git-extend will handle accordingly.

Notes

  1. The term closure is used loosely in the context of git-extend. Think closure in terms of an executable as a function.
  2. A typical Git installation includes shell scripts, which may show when running git extend --list.

See Also

git(1), git-config(1)