バックグラウンドでcdコマンドを実行した後にgit fetchを実行し、gitディレクトリにあるときにのみ実行する必要があります。
答え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 &
。