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

4
在我的dotfiles中,我有以下函数,它可以正常工作:
function undelete {
  git checkout $(git rev-list -n 1 HEAD -- "$1")^ -- "$1"
}

我会这样使用:

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

由于这是一个git命令,因此我希望您能将其限定范围。

如何创建git别名以便使用该git别名命令?

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

以下是我两次尝试但失败的代码:

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' -"

你正在使用双引号,因此shell会对内容进行命令、参数和历史扩展。请使用单引号,这样shell就会将未扩展的内容传递给git config命令。在单引号字符串中嵌入单引号,请使用'\'' - jthill
@jthill - 谢谢!我很好奇,为什么你没有发布一个答案? - Beau Smith
这不完全是评论的目的,但是低质量的回答也不是答案的目的,无论我是否有那种“我确定这是正确的”感觉。将未经检查的简短入门材料作为评论留下来,这样像@torek这样每次都能认真完成工作的人就可以这样做,并获得适当的信用,而不必担心踩到任何人的脚趾似乎是一个可行的妥协方案。 - jthill
1个回答

3

可以使用别名来实现这一点(请参见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" -'

我建议将任何复杂的内容编写成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

for循环旨在使其允许多个路径名“取消删除”)。

将脚本命名为git-undelete,将其放在您的$PATH中(我将脚本放在$HOME/scripts中),并且每次运行git undelete时,Git都会找到您的git-undelete脚本并运行它(使用$PATH修改为git --exec-path位于前面,以便。git-sh-setup正常工作)。


感谢您的推荐!希望您不介意我在您推荐的答案上方添加了所需答案的示例。我肯定会在将来使用您推荐的解决方案,但是对于我所需的用例,一行代码就是我需要的解决方案。 - Beau Smith
没问题 - 我在我的原型脚本中发现了一个错误,“$1”应该是“$path”。 - torek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接