簡體   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