繁体   English   中英

使用!! 在Git别名中访问bash历史记录

[英]Using !! to access bash history inside a Git alias

我想创建一个运行git stash的别名,然后执行之前的命令。

当git不允许运行未保存的更改的命令(如签出,变基等)时,这将很有用。

我试过的

s = "!git stash && fc -s

s = "!bash -c \\"git stash && !!\\""

以上都不是。 好像在第一个git中创建了一个子外壳来运行此命令,因为fc输出no command found 第二个类似,但是在这里我明确创建了一个子外壳,它显然不起作用,无法访问历史记录。

有没有解决的办法? 这可能可以通过bash别名来实现,但是我更喜欢通过git别名来实现。

可能可以通过bash别名来实现,

是的,这将是简单而强大的。

但我更喜欢通过git别名来实现。

考虑到这将是多么丑陋和脆弱,我对此表示怀疑。 但是,您可以在这里:

首先,您需要中继历史记录。 在每个命令之后,通过将其添加到.bashrc使您的shell将其写到历史文件中:

PROMPT_COMMAND='history -a'

然后,您可以添加git别名。 它需要

  1. 与Bash一起运行,因为系统sh可能不支持历史记录扩展
  2. 启用历史记录和历史记录扩展
  3. 读取历史文件
  4. 在单独的解析单元中使用历史记录扩展(例如,在换行后,复合命令之外):

总而言之:

s = "!bash -c 'set -Ho history; history -r ~/.bash_history\ngit stash && !-1'"

请注意, 无论bash实例如何 ,它都会运行最后执行的命令,因此,如果您使用多个tmux / screen / terminal窗口,则它不一定会在当前shell中运行最后一个命令。

您不能使用git别名来访问Bash历史记录(或与此相关的任何其他Shell数据),因为感叹号后面的命令不会作为子Shell运行。 Git是一个外部命令,因此它的所有子进程也不是子shell。

更多细节

您可以通过设置git别名foo = !echo $$ $BASHPID并将其与当前shell进行比较来确认这一点:

$ echo $$ $BASHPID
11461 11461
$ git foo
25437

就我而言,它甚至没有运行Bash。 经过一些测试后,我认为它正在运行/ bin / sh,因为我正在使用Ubuntu,所以对我来说这是Dash。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM