2014-05-25 13 views

Trả lời

15

Điều này có vẻ hơi lạ, nhưng điều này cho phép chúng tôi khớp các thư mục theo nhiều cách: tệp hoặc thư mục ở bất kỳ đâu, thư mục ở bất kỳ đâu hoặc thư mục ở cấp cao nhất. Tính linh hoạt này rất hữu ích và có thể ngăn chặn sự lộn xộn .gitignore.

(FYI, nếu bạn có Git 1.8.2+, bạn có thể sử dụng git check-ignore để giúp gỡ này.)


Nếu bạn đặt foo, nó sẽ phù hợp với tất cả các file và thư mục có tên foo.


Nếu bạn đặt foo/, nó sẽ chỉ khớp với các thư mục có tên foo.

Nếu mẫu kết thúc bằng dấu gạch chéo, mẫu sẽ bị xóa vì mục đích của mô tả sau, nhưng chỉ tìm thấy kết quả phù hợp với thư mục. Nói cách khác, foo/sẽ khớp với thư mục foo và đường dẫn bên dưới nó, nhưng sẽ không khớp với tệp thông thường hoặc liên kết tượng trưng foo (điều này phù hợp với cách thức hoạt động của Pathspec nói chung trong Git).


Nếu bạn thêm *, như trong foo/*, nó được coi là một glob file (tương đối so với .gitignore).

Nếu không, Git xử lý mẫu như hình cầu vỏ phù hợp để sử dụng bởi fnmatch (3) với cờ FNM_PATHNAME: ký tự đại diện trong mẫu sẽ không khớp với/trong tên đường dẫn. Ví dụ: "Tài liệu/*. Html" khớp với "Documentation/git.html" chứ không phải "Documentation/ppc/ppc.html" hoặc "tools/perf/Documentation/perf.html".

Vì vậy, đối với foo/*, Git sẽ bỏ qua tất cả các tệp và thư mục trong thư mục cấp cao nhất foo. Nó sẽ bỏ qua foo/dir, foo/file.txt, vv (Về mặt kỹ thuật, điều này sẽ không bỏ qua foo chính nó, nhưng nó sẽ bỏ qua con của nó. Tuy nhiên, vì Git không theo dõi các thư mục, nó có tác dụng tương tự.)

FYI, foo/** sẽ có hành vi tương tự.


Tôi đề nghị:

Nếu bạn muốn bỏ qua một thư mục foo ở cấp cao nhất, IMO rõ ràng nhất để sử dụng quy tắc này:

Một dấu gạch chéo hàng đầu phù hợp với bắt đầu của tên đường dẫn. Ví dụ: "/ *.c" khớp với "cat-file.c" nhưng không phải "mozilla-sha1/sha1.c".

Vì vậy, bạn có thể viết /foo/ và nó sẽ bỏ qua thư mục foo ở cấp cao nhất nhưng không có nơi nào khác.

+1

Tôi thực sự yêu thích giải thích trước đây của bạn rằng bạn đã chỉnh sửa: "Lý do cho điều này: Điều này cho phép người dùng kết hợp thư mục theo ba cách: tệp hoặc thư mục ở bất kỳ đâu, thư mục ở bất kỳ đâu hoặc thư mục ở cấp cao nhất". Mô tả đơn giản rất đơn giản về mục đích của tất cả :) – stackoverflowuser

+0

@stackoverflowuser, tôi đã cố chỉnh sửa ngắn gọn. Tôi đặt nó trở lại. Cảm ơn :) –

8

Các đoạn có liên quan là:

Git xử lý các mô hình như một glob vỏ phù hợp cho tiêu thụ bởi fnmatch, với:

  • '*' cho các tập tin đầu
  • ' ** 'mọi thứ bên trong, với chiều sâu vô tận

fnmatch là một hàm kiểm tra xem đối số chuỗi có khớp với đối số mẫu không, đó là mẫu ký tự đại diện shell.

Đó là hữu ích khi trừ các thư mục con từ một quy tắc bỏ qua, như tôi đã đề cập đến trong "How to INCLUDE lib files inside [/Libs/x64/Release] folder in a Git repository"

Libs/**/* 
!Libs/x64/Release/ 

Đó bỏ qua tất cả mọi thứ trừ Libs/x64/Release thư mục.

Trong mọi trường hợp, lệnh git check-ignore -v rất hữu ích để kiểm tra xem quy tắc .gitignore nào áp dụng cho bất kỳ tệp cụ thể nào.