Git alias with positional parameters
The alias you are looking for is:
files = "!git diff --name-status \"$1\"^ \"$1\" #"
With argument validation:
files = "!cd -- \"${GIT_PREFIX:-.}\" && [ x$# != x1 ] && echo commit-ish required >&2 || git diff --name-status \"$1\"^ \"$1\" #"
The final #
is important - it prevents all the user-supplied arguments from being processed by the shell (it comments them out).
Note: git
puts all user-supplied arguments at the end of the command line. To see this in action, try: GIT_TRACE=2 git files a b c d
The escaped (due to nesting) quotes are important for filenames containing spaces or "; rm -rf --no-preserve-root /;
)
A shell function could help on this:
[alias]
files = "!f() { git diff --name-status \"$1^\" \"$1\"; }; f"
An alias without !
is treated as a Git command; e.g. commit-all = commit -a
.
With the !
, it's run as its own command in the shell, letting you use stronger magic like this.
UPD
Because commands are executed at the root of repository you may use ${GIT_PREFIX}
variable when referring to the file names in commands