如何使用带参数的嵌套命令创建 Git 别名?

Bea*_*ith 5 git shell

在我的点文件中,我有以下有效的函数:

\n\n
function undelete {\n  git checkout $(git rev-list -n 1 HEAD -- "$1")^ -- "$1"\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe2\x80\xa6 我这样使用:

\n\n
$ undelete /path/to/deleted/file.txt\n
Run Code Online (Sandbox Code Playgroud)\n\n

我想确定这个命令的范围,因为它是一个 git 命令。

\n\n

如何创建 git 别名以便可以使用此 git alias 命令?

\n\n
$ git undelete /path/to/deleted/file.txt\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是我的两个尝试,但不起作用:

\n\n
git config --global alias.undelete "!f() { git checkout $(git rev-list -n 1 HEAD -- $1)^ -- $1; }; f"\ngit config --global alias.undelete "!sh -c \'git checkout $(git rev-list -n 1 HEAD -- $1)^ -- $1\' -"\n
Run Code Online (Sandbox Code Playgroud)\n

tor*_*rek 4

可以使用别名来做到这一点(请参阅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" -'
Run Code Online (Sandbox Code Playgroud)

我建议将任何复杂的内容编写为 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
Run Code Online (Sandbox Code Playgroud)

(该for循环的目的是使其允许多个路径名“取消删除”)。

将脚本命名为git-undelete,将其放入你的$PATH(我将脚本放在$HOME/scripts)中,并且任何时候你运行git undelete,Git 都会找到你的git-undelete脚本并运行它($PATH修改为git --exec-path前面有,这样就可以. git-sh-setup工作了)。