git-extend is a CLI for extending Git builtins.
Table of Contents
- See Also
git-extend extends Git builtins via closures1. Simply put, it provides an interface for user-defined functionality.
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?
git-config, you're confined to variables designated for the builtin. There is no builtin override, so the alternative is to define an alias.
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.
Important: Please read the Caveats section before continuing.
brew tap nickolasburr/pfa brew install git-extend
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:
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
As an example, if the executable is located at
make build GITPREFIX=/usr/local
If the executable is located at
/usr/bin/git, simply run
The install prefix for
git-extend is represented by
PREFIX, and defaults to
The following are installed and symlinked in
git-extend under an alternate prefix, pass
Common installation pitfalls to be mindful of:
git-extendto the same directory where
git-extendcreates a symlink to
PREFIXcannot be the same.
- Installing to a directory that is not writable by the user. It is not recommended to install using
sudo, but instead to pick an alternate location owned by the user.
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 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.
Below are important caveats and considerations to think about prior to installation:
git-extendjudiciously. It's intended to be lightweight enough you forget it's there.
- When in doubt, use
--bypass. It's equivalent to invoking
gitdirectly. See Examples for usage.
- Prefer Interrogators over Manipulators.
- When building command closures:
- Only add options and functionality you will actually use, and use frequently.
GITexport includes git(1) options and arguments (e.g.
git -C /path/to/repo ...).
- Give due diligence to user-defined options. Don't add options defined by the builtin.
- Always test command closures somewhere safe before using them in your workflow.
git-extendformula is keg-only. Add
- If Git is installed via Homebrew,
git-extendwill use it instead of the system version.
-l: List all
git-*executables found in
-p: Get absolute path to
-h: Show usage information.
-v: Show current version.
Get the name of the previous branch (see
git branch --last
git add %1
git-logcommand closure and get the last five log entries.
git --bypass log --max-count=5
Merge the previous branch into
masterand, upon successful merge, delete the previous branch (see
git checkout master git merge --no-ff --trim -
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:
- Named to match the corresponding builtin (e.g.
git add, etc.)
- Reachable from the
PATHof the user
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.
- The term closure is used loosely in the context of
git-extend. Think closure in terms of an executable as a function.
- A typical Git installation includes shell scripts, which may show when running
git extend --list.