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