CDコマンドを実行したら、git fetchを実行してください。

CDコマンドを実行したら、git fetchを実行してください。

バックグラウンドでcdコマンドを実行した後にgit fetchを実行し、gitディレクトリにあるときにのみ実行する必要があります。

答え1

これは3つの部分に分けられます。

  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

このコードはシェル起動スクリプトにあります。zsh.zshrcの場合、.bashrcbashの場合(bashでも必要)chpwdディレクトリ変更呼び出し用のラッパー)。

答え2

次の機能を使用できます。

function cd() {
    builtin cd "$@"
    if [[ -d .git ]]; then
        git fetch &
    fi
}

シェルの起動ファイルに追加します。

ここではいくつかのことが起こっています。

  1. まず、独自のカスタムコードで組み込まれた動作をオーバーライドしますfunction cd() {cd
  2. 明らかに、私たちはまだディレクトリを変更したいので、最初に変更します。シェルがユーザー定義関数を再帰的に呼び出すのではなく、組み込みbuiltin関数を使用するように * を付けてから引数として指定します。シェル拡張関数に指定されたすべてのパラメーター。cdcd()$@
  3. ディレクトリが存在するかどうかをテストして、.gitそのディレクトリがgitリポジトリにあるかどうかをテストし、存在する場合を追加してgit fetchシェルに通知します&

の出力はgit fetch依然としてターミナルに送信されます。放棄したい場合は、次のものを使用できます。

git fetch & 2>&1 >/dev/null

これにより、stderrをstdoutにリダイレクトしてからstdoutを/dev/null

[*]: これはbuiltinPOSIX にないため、このソリューションはすべてのシェルで移植可能ではありません。

[^]: 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 &

関連情報