検索出力から未追跡ファイルを削除する方法は?

検索出力から未追跡ファイルを削除する方法は?

私のプロジェクトディレクトリを見たいのですが、Gitが追跡しているfindファイルだけを探したいです。findGitが追跡するファイルにのみ結果を制限するために出力フィルタ(または他の方法)として使用できるコマンドはありますか?

例:

find . -name '*.postinst' | git-no-untracked

上記の私の用途は何ですかgit-no-untracked

答え1

zsh移行オプションが提供されると、次のリストが表示されます。トレースファイル配列から:

tracked_files=(${(0)"$(git ls-files -z)"})

次に、関心のあるファイルのリストのクロスアクションを実行します。たとえば、次のようになります。

postinst_files=(**/*.postinst)
tracked_postinst_files=(${postinst_files:*tracked_files})

zsh globでできることのほとんどを実行できますfind。たとえば、最後の2時間に最後に変更された一般的なファイルだけが必要な場合:

postinst_files=(**/*.postinst(.mh-2))

または、トレースファイルのリストから直接パターンを検索することもできます。

tracked_postinst_files=(${(M)tracked_files:#*.postinst})

または、ファイルが追跡されたファイルのリストにあることを確認するためにglob修飾子関数を定義します。

istracked() ((${tracked_files[(Ie)${1-$REPLY}]}))

tracked_postinst_files=(**/*.postinst(+istracked))

答え2

使用のヒントに従ってgit ls-filesコマンドを実行しますcomm。微妙なことは、comm入力をソートする必要があり、行が正確にテキストと一致する必要があることです(したがって、./一般的なfindコマンドのような接頭辞がない可能性があります)。

#!/bin/bash
set -eu

usage()
{
    cat <<EOF
Usage:
   $0 cmd [args... ]

Runs _cmd_ (with arguments, if provided) and filter the output to
files currently tracked by Git.

Example:
    $0 find . -name README -mmin -60

EOF
}

trap 'usage >&2' ERR

case "${1:-}" in
    -h|--help|'-?')
        usage
        exit 0
        ;;
    '')
        usage >&2
        exit 1
        ;;
esac

exec comm -12 \
     <("$@" | xargs -d '\n' -n 1 realpath -s --relative-to=. | sort) \
     <(git ls-files | sort)

答え3

これはどうですか:

find . -name '*.postinst' | xargs -I something bash -c 'git ls-files | grep $(basename something)'

関連情報