bỏ qua ngoại lệ


326

Tôi có một tệp gitignore làm cho git bỏ qua *.dllcác tệp và đó thực sự là hành vi tôi muốn. Tuy nhiên, nếu tôi muốn một ngoại lệ (nghĩa là có thể cam kết foo.dll), làm thế nào tôi có thể đạt được điều này?


8
có thể trùng lặp ngoại lệ trong .gitignore
wallyk

fwiw, cháu của các câu trả lời trùng lặp về chủ đề này - một câu trả lời mà bạn nên xem qua - có thể là Make .gitignore bỏ qua mọi thứ trừ một vài tệp - hoạt động rất thường xuyên và một số câu trả lời hay. Tôi là một fan hâm mộ đặc biệt của câu trả lời này , có vẻ rõ ràng và kỹ lưỡng.
Kay V

Câu trả lời:


447

Sử dụng:

*.dll    #Exclude all dlls
!foo.dll #Except for foo.dll

Từ gitignore :

Một tiền tố tùy chọn! trong đó phủ nhận mô hình; bất kỳ tệp phù hợp nào được loại trừ bởi một mẫu trước đó sẽ được đưa vào lại. Nếu một mẫu phủ định phù hợp, điều này sẽ ghi đè các nguồn mẫu ưu tiên thấp hơn.


22
Xem thêm câu trả lời mẫu @Matiss Jurgelis - đó là sự bổ sung quan trọng
Dan

7
Tôi có thể thêm ngoại lệ cho gitignore dự án của tôi chứ không phải gitignore toàn cầu của tôi không? Ví dụ, nếu tôi muốn bao gồm tất cả các DLL trong một thư mục? Gitignore_global của tôi có *.dlltrong đó, và gitignore dự án của tôi có !Libs/*.dllnhưng điều đó dường như không hoạt động.
Joel Kinzel

1
@jkinz, bạn nên thử !Libs/**/*.dll.
Rosberg Linhares

@RosbergLinhares Hoặc !**/Libs/*.dll, tùy thuộc vào cấu trúc thư mục.
JAB

2
Cảm ơn, nhưng trên mac thêm nhận xét trên cùng một dòng như !foo.dllđã làm mất hiệu lực lệnh. Nếu tôi thêm nhận xét trên một hàng riêng biệt, nó hoạt động.
Giacomo

260

Git bỏ qua các thư mục nếu bạn viết:

/js

nhưng nó không thể thêm ngoại lệ nếu bạn làm: !/js/jqueryhoặc !/js/jquery/hoặc!/js/jquery/*

Bạn phải viết:

/js/* 

và chỉ sau đó bạn có thể ngoại trừ các thư mục con như thế này

!/js/jquery

43
Điều đó rất quan trọng. Cảm ơn bạn!
VisioN

3
Tuy nhiên, có vẻ như bạn không thể thêm các thư mục lồng nhau, ví dụ: !/js/jquery/xyzlibsẽ không bị bỏ qua ...
Không biết gì vào

2
Như @Ignorant nói, thư mục bạn "ngoại trừ" từ quy tắc bỏ qua, phải ở cùng vị trí với "*"
Hạt đậu đỏ

3
vì thế /js/*, !/js/jquery, /js/jquery/*, !/js/jquery/xyzlib? Cảm thấy giống như một cách khá thú vị để làm điều đó ...
Đêm vô định

bạn thực sự đã giúp tôi
Loyea

55

Bạn có thể đơn giản git add -f path/to/foo.dll.

.gitignore chỉ bỏ qua các tệp để theo dõi thông thường và những thứ như git add .


4
Chỉ để biết thêm chi tiết, -fgit nói buộc phải thêm tệp này vào repo vì nó có thể bỏ qua trước vì.gitignore
RPDeshaies

Thật tuyệt nếu bạn chỉ có một tệp, ít hữu ích hơn nếu bạn cần một mẫu
Liam


15

Chỉ cần thêm !trước một quy tắc loại trừ.

Theo trang người đàn ông gitignore :

Các mẫu có định dạng sau:

...

  • Một tiền tố tùy chọn! trong đó phủ nhận mô hình; bất kỳ tệp phù hợp nào được loại trừ bởi một mẫu trước đó sẽ được đưa vào lại. Nếu một mẫu phủ định phù hợp, điều này sẽ ghi đè các nguồn mẫu ưu tiên thấp hơn.


4

Nếu bạn đang làm việc với Visual Studio và tình huống của bạn nằm trong một binthư mục, thì bạn sẽ cần thêm một ngoại lệ cho chính thư mục bin cụ thể đó, trước khi bạn có thể thêm ngoại lệ cho tệp dll. Ví dụ

!SourceCode/Solution/Project/bin
!SourceCode/Solution/Project/bin/My.dll

Điều này là do .gitignoretệp Visual Studio mặc định bao gồm một mẫu bỏ qua cho[Bbin]/

Mẫu này đang hạ gục tất cả các thư mục bin (và do đó là nội dung của chúng), điều này khiến cho mọi nỗ lực bao gồm các nội dung đều dư thừa (vì chính thư mục đã bị bỏ qua).

Tôi đã có thể tìm thấy lý do tại sao tập tin của tôi không bị loại trừ bằng cách chạy

git check-ignore -v -- SourceCode/Solution/Project/bin/My.dll

từ cửa sổ Git Bash. Điều này trả về [Bbin]/mô hình.


2

Giải pháp phụ thuộc vào mối quan hệ giữa quy tắc bỏ qua git và quy tắc ngoại lệ:

  1. Tệp / Tệp ở cùng cấp: sử dụng giải pháp @Skilldrick .
  2. Thư mục / Thư mục con: sử dụng giải pháp @Matiss Jurgelis .
  3. Tệp / Tệp ở các cấp khác nhau hoặc Tệp / Thư mục con: bạn có thể làm điều này:

    *.suo
    *.user
    *.userosscache
    *.sln.docstates
    
    # ...
    
    # Exceptions for entire subfolders
    !SetupFiles/elasticsearch-5.0.0/**/*
    !SetupFiles/filebeat-5.0.0-windows-x86_64/**/*
    
    # Exceptions for files in different levels
    !SetupFiles/kibana-5.0.0-windows-x86/**/*.suo
    !SetupFiles/logstash-5.0.0/**/*.suo
    

1

Vì Git 2.7.0 Git sẽ đưa ngoại lệ vào tài khoản. Từ ghi chú phát hành chính thức:

  • Cho phép "! / Abc / def" sau đó ghi đè lên "/ abc" trước đó xuất hiện trong cùng một tệp .gitignore để dễ dàng thể hiện "mọi thứ trong thư mục / abc đều bị bỏ qua, ngoại trừ ...".

https://raw.githubusercontent.com/git/git/master/Documentation/RelNotes/2.7.0.txt


1
cái này có hiệu quả với ai không? dường như không làm việc cho tôi.
Ankur
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.