2011-11-10 14 views
4

私はp4(Perforce)を使用したときに、ファイルシステム階層のレベルを横切る(つまり、スラッシュにもマッチする)点を除いて、 "*"のような種類の "..."パターンを使用することがよくあります。これは、ディレクトリツリーの下のいくつかのレベルにあるソースファイルを処理するのに便利でした。例えばp4の "..."パターンに相当するgitは何ですか?

p4 diff foo/.../*.py 

これだろう "のp4 diffの" サブツリー "のfoo" の下のPythonのファイルのすべて。

gitで同じ結果を得る簡単な方法はありますか?今すぐこのようなことをする必要があります:

git diff $(find foo -name '*.py') 

これはあまり便利ではありません。

+0

大きな質問ですが、私はこれを自分自身でやりたいと思っていましたが、どちらの方法も見つけられませんでした。 :) – tkrajcar

答えて

4

gitは一般に、シェルが提供するパス名拡張機能に依存します。パス名拡張はバージョン管理システムの仕事ではないため、gutはシェルによって提供されるパス名拡張機能に依存します。だから、あなたが選択したシェルを見て、それが...パス名展開のようなものをサポートしているかどうかを調べるべきです。もしbashを使用している場合は、globstarオプション

shopt -s globstar 

を設定することができ、その後、あなたが望む拡張得るために二重のアスタリスクを使用することができます私のテストに基づいて、

git diff foo/**/*.py 

注意を、二重アスタリスクは部分パス名の構成要素と一致していないようです。言い換えれば、そのパターンの後にスラッシュを付けて先にして、foo/bar/blah/baz.pyのように一致させる必要があります。 foo/ba**/*.pyと書くと、foo/ba*/*.pyと同じものになります。

+0

ここのユーザーはfoo/*/*。pyがほしいと思わないのですか?また、ここでの違いは何ですか? – monokrome

+3

通常、「パス名の拡張は[シェル以外のもの]の仕事ではない」と私は同意しますが、実際にはマップされていないファイルを頻繁に参照する必要があるため、バージョン管理システムは特別なケースですVCSを使用する場合の実際のファイルシステムgitではリポジトリの一部だけをワークスペースにマッピングすることはできませんが、それでも起こりますので、これはp4の場合よりもgitでは当てはまりません。例えば、ファイルをrmした場合、シェルはそのファイルをもう見ないので、 'git diff [pattern]'を使ってもそれは決して一致しません。 –

+0

私はglobstarについて知りませんでした。だから、少なくとも私が私の望むものの80%を得るために+1します。 :-) –

関連する問題