Loại trừ một thư mục từ git diff


179

Tôi đang tự hỏi làm thế nào tôi có thể loại trừ toàn bộ thư mục khỏi Git diff của tôi. (Trong trường hợp này / thông số kỹ thuật). Tôi đang tạo một diff cho toàn bộ bản phát hành phần mềm của chúng tôi bằng lệnh git diff. Tuy nhiên, những thay đổi về thông số kỹ thuật không liên quan đến quy trình này và chỉ gây đau đầu. bây giờ tôi biết tôi có thể làm

git diff previous_release..current_release app/

Điều này sẽ tạo ra một khác biệt cho tất cả các thay đổi trong thư mục ứng dụng, nhưng không phải là, trong thư mục lib /. Có ai biết làm thế nào để hoàn thành nhiệm vụ này? Cảm ơn!

Chỉnh sửa: Tôi chỉ muốn rõ ràng, tôi biết tôi chỉ có thể xâu chuỗi các tham số của tất cả các thư mục của tôi ở cuối, trừ / spec. Tôi đã hy vọng có một cách để thực sự loại trừ một thư mục trong lệnh.


4
Tôi tìm thấy câu hỏi tuyệt vời này bởi vì tôi đang nhắm đến việc bỏ qua các mô hình con . Trong trường hợp này, nếu bạn ngây thơ như tôi, câu hỏi này có thể hữu ích hơn.
brandizzi

Thật kỳ lạ khi chúng ta vẫn không có công tắc Git riêng để thực hiện việc này vào tháng 9 năm 2016
Michael Z

Câu trả lời:


138

Giả sử bạn sử dụng bash và bạn đã bật globalbing ( shopt -s extglob), bạn có thể xử lý việc đó từ phía shell:

git diff previous_release current_release !(spec)

Tiết kiệm bạn phải liệt kê tất cả những thứ khác.

Hoặc, bất khả tri:

git diff previous_release current_release --name-only | grep -v '^spec/' \
    | xargs git diff previous_release current_release --

Bạn có thể gói nó trong một kịch bản shell một lớp để tiết kiệm cho mình khi phải nhập lại các đối số.


1
PS globalbing không khớp với các tệp ẩn, vì vậy nếu bạn bị ám ảnh, bạn có thể muốn giải quyết .!(.|)để khớp với mọi thứ bắt đầu bằng một .bên cạnh ....
Cascabel

Điều này dường như không hoạt động đối với các tệp hoàn toàn mới hoặc bị xóa trên các chi nhánh. Tôi nhận được lỗi dừng quá trình thực thi tập lệnh, nói rằng nó không thể chống lại nó.
Graham Christensen

2
@Graham: Tôi tin rằng --tôi vừa thêm nên sửa nó.
Cascabel

1
Câu trả lời tuyệt vời. Tôi chỉ muốn tên hiển thị (không phải là khác biệt thực tế) vì vậy tôi cũng phải thêm --name-onlyvào cuối cùng.
Tháng Tám

1
Sau khi chơi đùa với nó, chỉ muốn nói thêm rằng nếu bạn thay đổi tên của một tập tin, nó sẽ ném ra một lỗi nhưng tất cả các bạn cần làm là add -- path/of/new/filevà nó sẽ tìm nó ra :)
Tháng Tám

321

Dựa trên câu trả lời này, bạn cũng có thể sử dụng:

git diff previous_release..current_release -- . ':!spec'

Đây là một tính năng git mới cho phép loại trừ các đường dẫn nhất định. Nó đáng tin cậy hơn các oneliners vỏ khác nhau.

Tôi đang đăng bài này lên đây vì câu hỏi này vẫn là câu hỏi số 1 cho "đường dẫn loại trừ git diff".


4
Yêu câu trả lời này. Nếu thêm tùy chọn thì làm như vậy trước dấu gạch ngang kép. Ví dụ: git diff previous_release current_release --name-status -- . ':!spec'
liamvictor

Không nhận ra tôi có thể sử dụng tên chi nhánh cho current_releaseprevious_release- khiến tôi mỉm cười khi nhận ra.
truelove78

2
Những gì làm việc cho tôi git diff --stat dev -- . ':!/Mopy/Docs/*'. Điều gì không hiệu quả với tôi git diff dev --stat -- . ':!('Mopy/Docs/Wrye Bash General Readme.html'|'Mopy/Docs/Wrye Bash Advanced Readme.html')'và các biến thể
Mr_and_Mrs_D

Thực sự hữu ích. Đây là cú pháp để xem có tập tin nào bị thay đổi không, ngoài cơ sở dữ git diff --check -- . ':!config/database.yml'
liệu.yml

17
Cũng có thể loại trừ nhiều mục như vậy:git diff previous_release current_release -- . ':!file_a' ':!file_b'
PseudoNiri

37

Nếu bạn muốn chỉ định nhiều hơn một đường dẫn để loại trừ trong git diff, bạn chỉ cần thêm các tham số loại trừ bổ sung vào cuối, ví dụ: để loại trừ mọi thứ trong thư mục nhà cung cấpbin khỏi số liệu thống kê: -

git diff --stat previous_release..current_release -- . ':!vendor' ':!bin'

33

Bạn có thể thử và hủy đặt thuộc tính diff cho bất kỳ tệp nào trong thư mục lib.
.gitattributes:

lib/* -diff

racl101 thêm vào trong các ý kiến :

Chỉ để thêm vào điều này, đối với những người muốn giới hạn git diffđầu ra của các loại tệp cụ thể, trong một thư mục cụ thể và các thư mục con của nó, như tất cả các JavaScript được tạo bởi gói .jstệp của Webpack , chẳng hạn, bạn có thể thêm để .gitattributes:

dist/js/**/*.js -diff

Sau đó, bạn không thấy tất cả nhiễu đó trong đầu ra git diff của bạn và nó chỉ hiển thị dưới dạng: Binary files ... differhữu ích hơn.


điều này sẽ loại bỏ spec khỏi tất cả các khác biệt của tôi mặc dù. Tôi vẫn muốn thấy khác biệt của mình trong thư mục spec thông thường, nhưng không phải khi tôi đang chạy 'phát hành' này
Mysrt

2
@Mystr: Bạn có thể đặt .gitattributestệp đó trong một nhánh đặc biệt chỉ dành cho loại 'phát hành' này;) Khởi động lại nhánh đặc biệt đó trên đầu current_releasevà thực hiện khác biệt của bạn từ đó.
VonC

Điều này, dường như cũng không hoạt động đối với các tệp bị xóa trên các nhánh. Các tập tin đã bị xóa vẫn hiển thị khác hoàn toàn.
Graham Christensen

Không làm việc cho tôi. _ Đường dẫn có đặc biệt không? _site/* -diff
Marius

@MariusAndreiana Không, '_' không đặc biệt. Bạn có thể kiểm tra quy tắc gitattribution nào áp dụng cho một tệp của thư mục đó với: git-scm.com/docs/git-check-attr
VonC

22

Git diff hiện chấp nhận định dạng loại trừ tùy chỉnh: git diff -- ':(exclude)lib/*'

Hãy cẩn thận nếu bạn có nhiều tên thư mục lặp đi lặp lại ('/ app', '/ lib', v.v.), vì điều này sẽ loại trừ các tệp liên quan đến thư mục làm việc hiện tại VÀ thư mục gốc git.


1
bạn đang thiếu một dấu chấm, đúng hơn không git diff -- . ':(exclude)lib/*'?
Nicolas Dermine 17/12/17

1
@NicolasDermine Không, mặc dù những gì bạn viết là tương đương. Phần "bao gồm" của đường dẫn cũng là tùy chọn. Đó là lý do tại sao bạn chỉ có thể làm git diffmọi thứ liên quan đến con đường hiện tại của mình, thay vì yêu cầugit diff -- .
MaxPRafferty

Lưu ý: trên các máy Windows, sử dụng dấu ngoặc kép, nhưgit diff -- ":(exclude)lib/*"
cnlevy

Không biết tại sao, nhưng đối với tôi nó chỉ hoạt động với dấu chấm, như được đề xuất bởi @NicolasDermine. Tôi sử dụng Cmder trên win10.
Olivvv

3

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"

Một số đường cú pháp được áp dụng

git diff -- ":!/\$1/"

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 -- ":!/\$1/"
}

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.