git ディレクトリ内にいる場合にのみ、バックグラウンドで cd コマンドの後に git fetch を実行する必要があります。
答え1
これには 3 つの部分があります。
- 現在のディレクトリを変更するコードを実行します。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
このコードはシェルの起動スクリプトに記述します。zsh.zshrc
の場合、.bashrc
bashの場合(bashでは以下も必要です)chpwd
ディレクトリ変更時に呼び出すラッパー)。
答え2
次の関数を使用できます:
function cd() {
builtin cd "$@"
if [[ -d .git ]]; then
git fetch &
fi
}
これをシェルの起動ファイルに追加します。
ここではいくつかのことが起こっています:
function cd() {
まず、組み込みのcd
動作を独自のカスタム コードでオーバーライドするために使用します。- 当然、ディレクトリを変更したいので、まずそれを行います。ディレクトリに * をプレフィックスとして付けて、シェルがカスタム関数を再帰的に呼び出すのではなく
builtin
組み込み関数を使用するようにし、それを引数として指定します。これは、関数に指定されたすべての引数にシェルによって展開されます。cd
cd()
$@
.git
ディレクトリが存在するかどうかをテストして、git リポジトリ^ にいるかどうかをテストします。存在する場合は を実行し、git fetch
を追加してシェルにバックグラウンドで実行するように指示します&
。
の出力はgit fetch
引き続き端末に送信されることに注意してください。破棄したい場合は、代わりに以下を使用できます。
git fetch & 2>&1 >/dev/null
これは stderr を stdout にリダイレクトし、次に stdout を に送信します/dev/null
。
[*]: はbuiltin
POSIXにはないので、このソリューションはすべてのシェル間で移植可能ではないことに注意してください。
[^]: これは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 &
。