¿Cómo crear un alias de Git con commands nesteds con parameters?

En mis files duales tengo la siguiente function que funciona:

function undelete { git checkout $(git rev-list -n 1 HEAD -- "$1")^ -- "$1" } 

… que uso así:

 $ undelete /path/to/deleted/file.txt 

Me gustaría ver el scope de este command ya que es un command git.

¿Cómo creo un alias git para poder usar este command git alias?

 $ git undelete /path/to/deleted/file.txt 

Aquí hay dos de mis bashs que no funcionan:

 git config --global alias.undelete "!f() { git checkout $(git rev-list -n 1 HEAD -- $1)^ -- $1; }; f" git config --global alias.undelete "!sh -c 'git checkout $(git rev-list -n 1 HEAD -- $1)^ -- $1' -" 

Es posible hacer esto con alias (ver el comentario de jthill ):

 git config --global alias.undelete '!f() { git checkout $(git rev-list -n 1 HEAD -- $1)^ -- $1; }; f' git config --global alias.undelete '!sh -c "git checkout $(git rev-list -n 1 HEAD -- $1)^ -- $1" -' 

Recomiendo escribir algo complicado como un script de shell:

 #! /bin/sh # # git-undelete: find path in recent history and extract . git-sh-setup # see $(git --exec-path)/git-sh-setup ... more stuff here if/as appropriate ... for path do rev=$(git rev-list -n 1 HEAD -- "$path") || exit 1 git checkout ${rev}^ -- "$path" || exit 1 done 

(el bucle for tiene como objective permitir que múltiples nombres de ruta de acceso "recuperen").

Nombra el script git-undelete , ponlo en tu $PATH (pongo scripts en $HOME/scripts ), y cada vez que ejecutas git undelete , Git encontrará tu script git-undelete y lo ejecutará (con $PATH modificado para tener git --exec-path desde el git --exec-path , para que funcione . git-sh-setup ).