我需要在後台執行任何 cd 命令之後運行 git fetch,並且僅當我位於 git 目錄中時。
答案1
這分為三個部分:
- 運行一些程式碼來更改當前目錄。在 zsh 中,您將此程式碼放入
chpwd
功能,或數組中具有不同名稱的函數chpwd_functions
(例子)。看進入目錄時執行 bash 腳本用於 bash 實作。 - 檢測 git 工作副本。既然你只對 git 有興趣,你可以跑
git rev-parse --show-toplevel
。如果您對其他版本控制系統感興趣,還有更高階的框架可以偵測版本控制。 - 跑步
git fetch
。
這是更改為 git 存儲庫時chpwd
運行的實作。git fetch
chpwd () {
set -- "$(git rev-parse --show-toplevel 2>/dev/null)"
# If cd'ing into a git working copy and not within the same working copy
if [ -n "$1" ] && [ "$1" != "$vc_root" ]; then
vc_root="$1"
git fetch
fi
}
chpwd
此程式碼位於您的 shell 啟動腳本中:.zshrc
對於 zsh,.bashrc
對於 bash(在 bash 中您還需要chpwd
呼叫目錄更改的包裝器)。
答案2
您可以使用一個函數:
function cd() {
builtin cd "$@"
if [[ -d .git ]]; then
git fetch &
fi
}
將其新增至 shell 的啟動檔案中。
這裡發生了一些事情:
- 首先,我們使用自己的自訂程式碼來
function cd() {
覆蓋內建行為。cd
- 顯然我們仍然想更改目錄,所以我們首先這樣做 - 我們在它前面添加
builtin
* 前綴,以便 shell 使用內建函數cd
而不是遞歸調用我們的自定義cd()
函數,並且我們將其$@
作為參數提供,該參數由 shell 擴展提供給函數的所有參數。 - 我們透過測試
.git
目錄是否存在來測試是否位於 git 儲存庫中,如果存在,我們運行git fetch
,告訴 shell 透過附加&
.
請注意, 的輸出git fetch
仍將傳送到終端。如果你想放棄它,你可以使用這個:
git fetch & 2>&1 >/dev/null
這將 stderr 重定向到 stdout,然後將 stdout 發送到/dev/null
.
[*]:請注意,這builtin
不在 POSIX 中,因此該解決方案不能跨所有 shell 移植
[^]:如果 git 儲存庫是裸露的,則此操作會失敗,但幾乎可以肯定您的磁碟機上不會有裸露的儲存庫,所以誰在乎
答案3
在主目錄中的 .bashrc 或 .zshrc 檔案中建立一個函數。
將以下內容新增至文件底部:
cd_fetch() {
command cd "$@"
if [ -d .git ]; then
git fetch &
fi
}
alias cdg=cd_fetch
現在關閉並重新開啟終端或運行,現在您可以使用剛剛指定別名的source ~/.zshrc
命令來變更目錄。cdg
另外,如果您不想使用cdg
並且想要使用,只需cd
將別名定義更改為alias cd=cd_fetch
.
這種方法仍然會輸出 git fetch 通常執行的所有操作,為了使其靜音,請git fetch &
替換git fetch 2>&1 >/dev/null &
.