cdコマンドの後にgit fetchを実行する

cdコマンドの後にgit fetchを実行する

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

答え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 &

関連情報