Làm cách nào để lọc git diff dựa trên phần mở rộng tập tin?


152

Có một tùy chọn để hạn chế git diffmột bộ phần mở rộng tập tin nhất định không?

Câu trả lời:


227

Có, nếu bạn đảm bảo rằng git mở rộng một quả địa cầu chứ không phải vỏ của bạn thì nó sẽ phù hợp ở mọi cấp độ vì vậy một cái gì đó như thế này (trích dẫn rất quan trọng) sẽ hoạt động tốt.

git diff -- '*.c' '*.h'

1
Ok, phiên bản git của tôi đã quá cũ. Hoạt động như quảng cáo với 1.7.8. Thông minh.
Mat

3
Của tôi đã làm việc với mở rộng cú đúp, một lagit diff -- *.{c,h,etc}
Matt Fletcher

9
dấu gạch ngang kép là quan trọng, ví dụ. git diff master HEAD -- "*filename.txt"cũng hữu ích làgit diff master HEAD --name-only
neaumusic

Các dấu ngoặc đơn ( '') cũng rất quan trọng! git diff -- src/*.jsnên làgit diff -- 'src/*.js'
Nickofthyme

1
Cũng phải làm điều này tại thư mục gốc của kho git.
John Jiang

10

Để bao gồm các tệp đệ quy (bao gồm cả thư mục hiện tại), điều này làm việc cho tôi:

git diff -- '***.py'

1
Đối với tôi đó là giải pháp tốt nhất. Bạn cũng có thể loại trừ một số tập tin / thư mục. Ví dụ:git diff -- '***.py' ':!.Trashes'
Bartosz

Các dấu sao ba làm gì (so với dấu sao đơn)?
Jann Poppinga

IIRC dấu sao đôi có nghĩa (có thể) các thư mục lồng nhau (thậm chí trống) và dấu hoa thị đơn và .py có nghĩa là tên tệp. Vì vậy, nó phải là một tệp * .py trong thư mục hiện tại hoặc bất kỳ thư mục lồng nhau nào.
Bohumir Zamecnik

8

Sử dụng sao của shell của bạn (tìm kiếm đệ quy) 1 , 2 :

shopt -s globstar 
git diff -- *.py **/*.py

hoặc sử dụng tìm:

find -name '*.py' -print0 | xargs -0 git diff --

Cả hai đều là tên đặc biệt và bằng chứng khoảng trắng. Mặc dù bạn có thể muốn lọc các thư mục có phần mở rộng .py :)


1 tôi thích làm git diff -- {.,**}/*.pythường

2 Khi Glostar được bật, git diff -- **/*.pyđã bao gồm ./*.py. Trong trang chủ của Bash: 'Nếu được theo sau bởi một /, hai * s liền kề sẽ chỉ khớp với các thư mục và thư mục con.'


4

Đối với các mẫu tệp đơn giản, điều này dường như hoạt động:

$ git ls-files -zm '*.txt' | xargs --null git diff

Khoảng trắng an toàn và bạn cũng có thể có nhiều tiện ích mở rộng:

$ git ls-files -zm '*.h|*.c|*.cpp' | xargs --null git diff

3

Đối số dòng lệnh để mở rộng.

git diff *.py

Thay vào đó, bạn có thể dẫn findvào git diff:

find . -name '*.py' -type f | git diff --

xin vui lòng làm cho câu trả lời dễ đọc hơn một chút. Bạn có thể đã đạt được git diff *.pyvà không có tiêu đề la hét
sehe

1
Các 'tiêu đề hét' là # -comments trong một kịch bản shell.
hughdbrown

Đây là giải pháp duy nhất hiệu quả với tôi, dấu ngoặc kép (v.v.) không hoạt động trên dấu nhắc lệnh của Windows.
Ed Bayiates

1

Như đã thử nghiệm trên git phiên bản 2.18.0, phần mở rộng tệp nên được trích dẫn bằng dấu ngoặc kép. Nếu bạn muốn tìm sự khác biệt cuối cùng giữa kho lưu trữ cục bộ của bạn và kho lưu trữ từ xa, sau khi kéo, bạn có thể sử dụng:

git diff YourBranchName@{1} YourBranchName --name-only "*.YourFileExtionsion"

Ví dụ:

git diff master@{1} origin/master --name-only "*.cs"

1
Nó hoạt động với tôi khi tôi cung cấp - trước phần mở rộng, như thế này,git diff master@{1} origin/master --name-only -- "*.cs"
333

0

Không có câu trả lời nào ở trên có vẻ hiệu quả với tôi dưới git bashWindows. Tôi không chắc đó là phiên bản (tôi đang sử dụng 1.8.4) hay Windows / bash thing; Ngoài ra, trong trường hợp của tôi, tôi muốn tìm khác biệt hai nhánh trong đó mỗi nhánh có các tệp bổ sung không có trong nhánh khác (do đó, các nhánh dựa trên 'find' là remiss).

Dù sao, điều này làm việc cho tôi (trong ví dụ của tôi, tìm kiếm một sự khác biệt giữa các tệp python):

git diff branch1 branch2 -- `git diff --summary branch1 branch2 | egrep '\.py$' | cut -d ' ' -f 5`

Đây stackoverflow.com/a/8554987/4233229 công trình, nhưng người ta phải sử dụng dấu ngoặc kép thay vì đơn cho Windows
lcnittl

0

git diff sẽ chỉ hiển thị sự khác biệt trong các tập tin chưa được phân loại.

Tôi tìm thấy câu hỏi này vì tôi muốn loại trừ .infocác tập tin từ git diff. Tôi đã đạt được điều này bằng cách dàn dựng nó với git add *.info, làm giảm các tập tin còn lại.


0

Tôi nghĩ ra điều này:

commit=<the_commit_hash_goes_here> && git diff --name-only $commit | grep -i Test | egrep -v '\.sql$' | xargs git diff $commit --

Điều này chỉ hiển thị khác nhau cho cam kết được chỉ định nếu tên tệp chứa từ 'test' (không phân biệt chữ hoa chữ thường) và không kết thúc bằng .sql, sửa đổi đường ống khi cần thiết cho trường hợp của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.