#!/bin/sh # Help messages: export LONG_USAGE="Select changed files using fzf and print to standard output. Optionally, give a tree-ish to list files changed between that and the working tree. For example, to select from files in the last 3 commits: git sel-changed HEAD@{3} " # Tell git-sh-setup we're ok with being in a subdir: export SUBDIRECTORY_OK=1 . "$(git --exec-path)/git-sh-setup" # Make sure we're in a working tree require_work_tree_exists # Jump to top level so we can use $PWD below to print absolute paths # (this seems easier than trying to figure out relative paths from # porcelained git-status output): cd_to_toplevel # For files in the working tree which are currently changed: _list_from_status () { # -z does NUL-terminated outputs, puts new filenames first for renamed files, # etc. -u includes untracked files. git status -u -z --porcelain | \ # Take from the 4th character up to end-of-line (first 3 are status chars): cut -z -c4- } # For files changed since a particular tree-ish: _list_from_treeish () { git diff-index -z --name-only "$1" } run_git="_list_from_status" if [ -n "$1" ]; then run_git="_list_from_treeish $1" fi $run_git | \ # IFF we're inside a tmux, fzf-tmux will pop up in a separate pane: fzf-tmux --multi --read0 --print0 | \ # This is ridiculous, but I never know how to combine stdin and args: xargs -0 -I{} -n1 echo "$PWD/{}"