Muốn loại trừ tập tin khỏi bản git diff


229

Tôi đang cố gắng loại trừ một tệp ( db/irrelevant.php) khỏi Git diff. Tôi đã thử đặt một tệp trong dbthư mục con được gọi .gitattributesvới dòng irrelevant.php -diff và tôi cũng đã thử tạo một tệp .git/info/attributescó tên chứa db/irrelevant.php.

Trong mọi trường hợp, db/irrelevant.phptệp được bao gồm trong diff dưới dạng bản vá nhị phân Git. Những gì tôi muốn là các thay đổi cho tập tin đó sẽ bị bỏ qua bởi lệnh diff. Tôi đang làm gì sai?

Câu trả lời:


325

Omg, trình điều khiển và awk để loại trừ một tập tin tệ hại? Kể từ git 1.9, bạn có thể:

git diff -- . ':(exclude)db/irrelevant.php' ':(exclude)db/irrelevant2.php'

Ah, thanh lịch! Xem câu trả lời được trích dẫn và để biết chi tiết câu trả lời này của @torek


4
LƯU Ý: Nếu bạn muốn loại trừ một tên tệp cụ thể, bạn phải đặt tiền tố bằng dấu hoa thị, khác với .gitignorecú pháp tệp. Ví dụ :!*shrinkwrap.yamlthay vì :!shrinkwrap.yaml.
vaughan

7
Loại trừ nhiều tệp hơn, ví dụ: tôi có các tệp * .min.css và * .min.js để tránh khỏi git diff. Vì vậy, tôi sử dụng lệnhgit diff -- . ':(exclude)*.min.js' ':(exclude)*.min.css'
maheshwaghmare

4
cú pháp cửa sổ : git diff -- . ":(exclude)db/irrelevant.php"(dấu ngoặc kép thay vì dấu ngoặc đơn)
cnlevy

4
Cảm ơn bạn! Một cú pháp bí truyền như vậy .. Tôi phải tìm kiếm nó mỗi lần.
Daniel Waltrip

1
@cnlevy hoặc không có dấu ngoặc kép! git diff -- . :(exclude)db/irrelevant.php
Matthias

62

Bạn có thể thiết lập trình điều khiển khác biệt tùy chỉnh với lệnh no op và gán nó cho các tệp cần bỏ qua.

Tạo một trình điều khiển khác biệt cho kho lưu trữ với lệnh này

git config diff.nodiff.command /bin/true

hoặc cho tất cả các repos của bạn với --global.

(Nếu /bin/truekhông tồn tại trong MacOS, các lựa chọn thay thế sẽ được sử dụng /usr/bin/truehoặc echo).

Sau đó, chỉ định trình điều khiển khác cho các tệp bạn muốn bỏ qua trong .git/info/attributestệp của mình .

irrelevant.php    diff=nodiff

Nếu trạng thái này được cho là được chia sẻ với các nhà phát triển khác, bạn có thể sử dụng .gitattributesthay vì .git/info/attributesvà chia sẻ git configlệnh với các đồng nghiệp của mình (thông qua tệp tài liệu hoặc nội dung nào đó).


2
Đây chính xác là những gì tôi đang tìm kiếm - như được mô tả trong kerneltrap.org/mailarchive/git/2008/10/17/3711254 Tôi đã chỉnh sửa ~ / .gitconfig thêm: [diff "nodiff"] `lệnh = / bin / true` và sau đó tôi đã tạo một tệp có tên .git / thông tin / thuộc tính mà tôi đã thêm: irrelevant.php diff=nodiff
Michael

12
Câu trả lời này hoạt động tốt hơn nhiều đối với tôi: stackoverflow.com/questions/1016798/ Khăn
Neil Forrester

3
Điều thú vị là phương pháp này không hiệu quả git diff --stat. Trong trường hợp đó, người ta có thể sử dụng git diff ... | diffstatnhư một cách giải quyết.
ddkilzer

@Michael liên kết đó dường như bị borked, có khác không?
DickieBoy 16/07/2015

3
chỉ là một bổ sung: nếu bạn muốn buộc git diff hiển thị nó bằng mọi giá, hãy sử dụng--no-ext-diff
Florian Klein

35

Bạn cũng có thể sử dụng chương trình lọc của bộ sưu tập chương trình patchutils để loại trừ một số phần của khác biệt. Ví dụ:

git diff | filterdiff -p 1 -x db/irrelevant.php

4
Lưu ý rằng -p, từ manpage (1), là "-pn, --strip-match = n Khi khớp, bỏ qua n thành phần đầu tiên của tên đường dẫn." Phải mất một thời gian tôi mới bắt -p 1được dbphần đó khỏi đường dẫn của OP. Nếu bạn chỉ muốn chỉ định một tên tệp và bỏ qua tất cả các khả năng đường dẫn / thư mục, bạn có thể sử dụng -p 99.
Tyler Collier

32

Phương pháp này ngắn hơn các câu trả lời được chấp nhận.

git diff 987200fbfb 878cee40ba --stat -- ':!*.cs'

Để biết thêm thông tin về các khả năng bao gồm / loại trừ khác nhau, hãy đọc bài đăng khác này


Xin lưu ý rằng bộ lọc chỉ áp dụng cho tất cả các tệp bên dưới thư mục hiện tại của bạn.
Chiel ten Brinke

Đây là câu trả lời tốt nhất. Tôi đã có thể đơn giản hóa nó hơn một chút: stackoverflow.com/a/58845608/3886183
dlsso

2
Tôi sẽ loại bỏ phần --stat, hoặc ít nhất là giải thích những gì nó làm, vì không có câu trả lời nào khác bao gồm nó.
mix3d

Cờ stat hiển thị cho bạn các tệp và tổng số khác của chúng, cho phép bạn kiểm tra dễ dàng nếu bộ lọc hoạt động theo cách bạn dự định.
Chiel ten Brinke

17

Giải pháp một dòng này không yêu cầu các tiện ích / tải xuống khác:

git diff `git status -s |grep -v ^\ D |grep -v file/to/exclude.txt |cut -b4-`

Tất nhiên file/to/exclude.txt, tên của tệp bạn muốn loại trừ ở đâu.

Chỉnh sửa: tín dụng ksenzee để sửa các tệp bị xóa phá vỡ khác biệt.


Tôi đang cố gắng điều chỉnh một lớp lót của bạn để git diff --stat masterkhông có nhiều thành công - bạn có thể giúp gì không?
Mr_and_Mrs_D

13

Câu trả lời thực sự tốt từ KurzingMetal cho những gì tôi cần làm, đó là khả năng thấy rằng tệp đã thay đổi, nhưng không tạo ra khác biệt, trong trường hợp của tôi.

Nhưng một đồng nghiệp của tôi đã đề xuất cách tiếp cận thậm chí còn đơn giản hơn và hiệu quả với tôi:

thêm .gitattributestệp trong thư mục nơi tệp bị bỏ qua bằng cách git diffcư trú với nội dung sau:

file-not-to-diff.bin -diff

Điều đó vẫn cho phép git status"xem" nếu tập tin thay đổi. git diffcũng sẽ "thấy" rằng tập tin đã thay đổi, nhưng nó sẽ không tạo ra diff.

Đó là .binphần mở rộng cho các tập tin trong ví dụ này là có chủ ý. Tôi nhận ra rằng đây là hành vi mặc định của git cho các tệp nhị phân và nó không yêu cầu xử lý đặc biệt với .gitattributes. Nhưng trong trường hợp của tôi, các tệp này đã được công nhận là tệp văn bản bởi tiện ích git và "tệp" và điều này đã tạo ra mánh khóe.


11

Câu trả lời đơn giản nhất

git diff ':!db/irrelevant.php'

Nó chỉ ':!<path to file>'sau lệnh diff của bạn. Lệnh diff có thể phức tạp như bạn muốn và bạn có thể sử dụng các ký tự đại diện như *.min.jshoặc thêm nhiều loại trừ (không gian tách các khối được trích dẫn) nếu bạn muốn.


5

Liên quan đến thư mục gốc git

git diff chấp nhận loại trừ tùy chọn

git diff -- ":(exclude)thingToExclude"

Bạn có thể muốn thêm một số thẻ hoang dã

git diff -- ":(exclude)*/thingToExclude/*"

Nhắm mục tiêu các loại tệp cụ thể

git diff -- ":(exclude)*/$1/*.png"

Hoặc thả một tập lệnh nhỏ cho dotfiles của bạn

Chẳng hạn như .bash_profilehay.zshrc

gde() {
    # git diff exclude files or folders 
    # usage: 
    # gde fileOrFolderNameToExclude
    git diff -- ":(exclude)*/$1/*"
}

Điều này chỉ không phù hợp với tôi, tôi không nhận được sự khác biệt nào cả, với cả hai cú pháp, sử dụng (loại trừ) hoặc !. Tôi có git 2.21.0
Olivvv

Bạn có thể git diff hoặc các tập tin không được dàn dựng hoặc dàn dựng. Nếu bạn có git thêm chúng, chúng trở thành dàn dựng. Nếu họ được dàn dựng bạn có thể làm git diff --stagedHy vọng điều này sẽ giúp bạn.
jasonleonhard

Cú pháp, đại tràng đang làm gì?
Giô-na

2

Rất đơn giản, bạn có thể loại trừ những gì bạn muốn bằng cách sử dụng các lệnh unix tiêu chuẩn, các lệnh đó có sẵn trong git bash ngay cả trong môi trường windows. Ví dụ bên dưới cho thấy cách loại trừ diff cho các tệp pom.xml, trước tiên, hãy kiểm tra diff chỉ thành chủ cho tên tệp, sau đó sử dụng 'grep -v' loại trừ các tệp mà bạn không muốn và sau đó chạy lại diff để làm chủ với danh sách được thêm vào trước:

git diff master `git diff --name-only master | grep -v pom.xml`

1

tương tự như giải pháp của Ben Roux , nhưng dù sao cũng chia sẻ:

git status --porcelain | grep -v $PATTERN_TO_EXCLUDE | awk '{print $2}' | xargs git diff

hoặc, nếu các thay đổi đã được cam kết tại địa phương:

git diff --name-only origin/master | grep -v $PATTERN_TO_EXCLUDE | xargs git diff origin/master

Ví dụ:

git status --porcelain | grep -v docs | awk '{print $2}' | xargs git diff origin/master

git diff --name-only origin/master | grep -v docs | xargs git diff origin/master

1

Tôi làm như sau:

git add *pattern_to_exclude*
git diff
git reset HEAD .

Tôi biết đó không phải là một giải pháp tao nhã và đôi khi nó không được sử dụng (ví dụ: nếu bạn đã có công cụ dàn dựng), nhưng nó thực hiện thủ thuật mà không cần phải gõ một lệnh phức tạp


0

Nếu bạn muốn làm điều này chỉ để kiểm tra trực quan diff, một công cụ tìm khác biệt trực quan (như Meld ) sẽ cho phép bạn làm điều đó với một lệnh ngắn dễ nhớ.

Đầu tiên, hãy thiết lập một công cụ tìm khác biệt nếu bạn chưa có.

$ git config --global diff.tool = meld

Sau đó, bạn có thể chạy một thư mục khác.

$ git difftool --dir-diff

Bạn sẽ có thể duyệt tìm khác biệt (theo tệp) trong Meld (hoặc công cụ bạn chọn). Đơn giản là đừng mở tập tin bạn muốn bỏ qua.

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.