2011-11-10 22 views
4

當我使用p4(Perforce)時,我會經常使用「...」模式,除了遍歷文件系統層次結構的級別(即:它也匹配斜槓)之外,它有點像「*」。這對於處理目錄樹中幾個級別的源文件非常方便。相當於p4的「...」模式的git是什麼?

例如:

p4 diff foo/.../*.py 

這將 「P4 DIFF」 下的所有子樹 「富」 了Python文件。

有沒有一種簡單的方法可以得到與git相同的結果?現在我必須這樣做:

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

這幾乎沒有那麼方便。

+0

偉大的問題,我想自己做這件事,並沒有找到一種方法。 :) – tkrajcar

回答

4

git通常依賴於shell提供的路徑名擴展功能 - 正確的是,因爲路徑名擴展並不完全是版本控制系統的工作。所以你應該看看你選擇的shell是否支持...路徑名擴展。如果你正在使用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

通常我會同意「路徑名稱擴展不完全是[shell以外的其他任務]」,但我認爲版本控制系統是一種特殊情況,因爲您經常需要引用實際上未映射到的文件使用VCS時的真實文件系統。這在git中比在p4中更不真實,因爲git不允許將映射的一部分映射到工作空間,但它仍然會發生。例如,如果我把一個文件拷貝到一個文件中,shell就不會再看到這個文件了,所以使用'git diff [pattern]'將永遠不會匹配它。 –

+0

這就是說,我不知道globstar,所以+1至少讓我〜我想要的80%。 :-) –