在執行任何 cd 指令後執行 git fetch

在執行任何 cd 指令後執行 git fetch

我需要在後台執行任何 cd 命令之後運行 git fetch,並且僅當我位於 git 目錄中時。

答案1

這分為三個部分:

  1. 運行一些程式碼來更改當前目錄。在 zsh 中,您將此程式碼放入chpwd功能,或數組中具有不同名稱的函數chpwd_functions例子)。看進入目錄時執行 bash 腳本用於 bash 實作。
  2. 檢測 git 工作副本。既然你只對 git 有興趣,你可以跑git rev-parse --show-toplevel。如果您對其他版本控制系統感興趣,還有更高階的框架可以偵測版本控制。
  3. 跑步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 的啟動檔案中。

這裡發生了一些事情:

  1. 首先,我們使用自己的自訂程式碼來function cd() {覆蓋內建行為。cd
  2. 顯然我們仍然想更改目錄,所以我們首先這樣做 - 我們在它前面添加builtin* 前綴,以便 shell 使用內建函數cd而不是遞歸調用我們的自定義cd()函數,並且我們將其$@作為參數提供,該參數由 shell 擴展提供給函數的所有參數。
  3. 我們透過測試.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 &.

相關內容