我想创建一个运行git stash
的别名,然后执行它之前的命令。
当git不允许运行未保存的更改(例如,结帐,变基等)的命令时,这将很有用。
我尝试过的事情:
s = "!git stash && fc -s
s = "!bash -c \"git stash && !!\""
以上所有工作均未完成。好像在第一个git中创建了一个子外壳来运行此命令,因为fc输出no command found
。
第二个是类似的,但是在这里我显式创建了一个子外壳,它显然不起作用,无法访问历史记录。
有没有解决的办法?可能可以通过bash别名来实现,但我更喜欢通过git别名来实现。
答案 0 :(得分:3)
这很可能可以通过bash别名来实现,
是的,这将是简单而健壮的。
但是我更喜欢通过git别名来实现。
鉴于这将是多么丑陋和脆弱,我对此表示怀疑。但是,您可以在这里:
首先,您需要中继历史记录。通过将其添加到.bashrc
中,使外壳程序在每个命令后将其写到历史文件中:
PROMPT_COMMAND='history -a'
然后您可以添加您的git
别名。它需要
sh
可能不支持历史记录扩展总而言之:
s = "!bash -c 'set -Ho history; history -r ~/.bash_history\ngit stash && !-1'"
请注意,无论bash实例是什么,它都会运行执行的最后一个命令,因此,如果您使用多个tmux / screen / terminal窗口,它不一定会在当前shell中运行最后一个命令
答案 1 :(得分:1)
您不能使用git别名来访问Bash历史记录(或与此相关的任何其他Shell数据),因为感叹号后面的命令不会作为子Shell运行。 Git是一个外部命令,因此它的所有子进程也不是子shell。
您可以通过设置git别名foo = !echo $$ $BASHPID
并将其与当前shell进行比较来确认这一点:
$ echo $$ $BASHPID
11461 11461
$ git foo
25437
就我而言,它甚至没有运行Bash。经过一些测试,我认为它正在运行/ bin / sh,因为我使用的是Ubuntu,所以这对我来说是Dash。