私のzsh
シェルはgit
リポジトリ内にあるかどうかに応じてプロンプトを動的に変更します。確認するには、次のgitコマンドを使用しています。
if $(git rev-parse --is-inside-work-tree >/dev/null 2>&1); then
...
現在のディレクトリが無視されるかどうかを区別したいと思いますgit
。だから私は宣言if
にもう一つの確認を追加しました。
if $(git rev-parse --is-inside-work-tree >/dev/null 2>&1) && ! $(git check-ignore . >/dev/null 2>&1); then
...
これはうまくいきますが、単一のコマンドで単純化できるかどうか疑問に思いますgit
。プロンプトは毎回更新されるため、ENTER一部の低速システムではシェル速度が大幅に遅くなる傾向があります。
修正する
@Stephen Kittが受け入れた解決策は、以下を除いてうまくいきます。
ファイルシステム全体でリポジトリを使用しています。 gitが別のパーティション/ファイルシステムにありますが/.git
(設定ファイルを追跡したいので/etc
)、gitにあるいくつかのファイルも追跡したいとします。/var/foo
次のコマンドを実行すると、/
すべてが期待どおりに機能し、戻りコードを取得します1
(/var/foo
追跡中です)。
# git check-ignore -q /var/foo
ただし、存在する場合、/var
同じコマンドはエラーコード128
と次のエラーメッセージで失敗します。
# git check-ignore -q /var/foo
fatal: not a git repository (or any parent up to mount point /)
Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).
しかし、私の考えでは、それはcheck-ignore
順序の問題だけです。それ以外の場合は、gitがファイルシステムで正常に動作しているようです。/var/foo
ファイルをうまく追跡できます。
予想される動作は、追跡されない場合にgit check-ignore -q /var/foo
返されるものです。1
git check-ignore -q /var/bar
0
この問題をどのように解決できますか?
ベストアンサー1
git check-ignore .
.
リポジトリにない場合は、終了コード128で失敗し(または他のエラーが発生した場合)、パスが無視されないgit
場合にのみ終了コード1で失敗します。したがって、後者のみを確認できます。
git check-ignore -q . 2>/dev/null; if [ "$?" -ne "1" ]; then ...
then
内部的には、gitリポジトリで無視または無視されない状況を処理しています。.
ファイルシステムの境界を超えて機能させるには、次のように設定します。GIT_DISCOVERY_ACROSS_FILESYSTEM
到着true
:
GIT_DISCOVERY_ACROSS_FILESYSTEM=true git check-ignore -q . 2>/dev/null; if [ "$?" -ne "1" ]; then ...