2014-09-08 16 views
105

Tôi nhầm lẫn về cách thức chính xác để bỏ qua nội dung của thư mục trong git.Sự khác nhau giữa Git bỏ qua thư mục và thư mục/* là gì?

Giả sử tôi có cấu trúc thư mục sau:

my_project 
    |--www 
     |--1.txt 
     |--2.txt 
    |--.gitignore 

sự khác biệt giữa đặt này là gì:

www 

Và điều này?

www/* 

Lý do tôi đặt câu hỏi này là: Trong git, nếu thư mục trống, git sẽ không bao gồm thư mục trống trong kho lưu trữ. Vì vậy, tôi đã cố gắng giải pháp đó là thêm một tập tin bổ sung .gitkeep theo thư mục để nó sẽ không có sản phẩm nào. Khi tôi đã thử giải pháp đó, nếu trong tệp .gitignore, tôi viết như sau:

www 
!*.gitkeep 

Nó không hoạt động (ý định của tôi là bỏ qua tất cả nội dung dưới www nhưng giữ thư mục). Nhưng nếu tôi thử các cách sau:

www/* 
!*.gitkeep 

Sau đó, nó hoạt động! Vì vậy, tôi nghĩ rằng nó phải có một số khác biệt giữa hai phương pháp tiếp cận.

+3

Tại sao không tích hợp nhận xét của bạn vào câu hỏi? Nó sẽ làm cho thứ hai thậm chí còn thú vị hơn ':)' – Jubobs

+1

Cảm ơn Jubobs vì gợi ý của bạn.Tôi đã tích hợp nhận xét của mình vào câu hỏi của mình. –

+0

Sự khác biệt đơn giản giữa 'bin' và' bin/'là trước đây sẽ bỏ qua các tệp hoặc thư mục, chỉ các thư mục sau. Tôi không biết sự khác biệt với 'bin/* ' –

Trả lời

192

Có sự khác biệt trong số www, www/www/*.

Về cơ bản từ documentation và thử nghiệm của riêng tôi, www tìm một trận đấu với một tập tin hoặc một thư mục, www/ chỉ phù hợp với một thư mục, trong khi www/* trận thư mục và các tập tin bên trong www.

Tôi sẽ chỉ thảo luận về sự khác biệt giữa www/www/* tại đây, vì sự khác biệt giữa wwwwww/ là hiển nhiên.

Đối với www/, git bỏ qua thư mục www chính nó, có nghĩa là git thậm chí sẽ không nhìn vào bên trong. Nhưng đối với www/*, git kiểm tra tất cả các tệp/thư mục bên trong www và bỏ qua tất cả các tệp/thư mục có mẫu *. Dường như dẫn đến kết quả tương tự vì git sẽ không theo dõi một thư mục trống www nếu tất cả các tệp/thư mục con của nó bị bỏ qua.Và quả thực kết quả sẽ không khác biệt đối với trường hợp của OP với www/ hoặc www/* độc lập. Nhưng nó tạo sự khác biệt nếu nó được kết hợp với các quy tắc khác.

Ví dụ: nếu chúng tôi muốn chỉ bao gồm www/1.txt nhưng bỏ qua tất cả những người khác bên trong www?

.gitignore sau đây sẽ không hoạt động.

www/ 
!www/1.txt 

Trong khi sau .gitignore hoạt động, tại sao?

www/* 
!www/1.txt 

Đối với cựu, git chỉ bỏ qua các thư mục www, và thậm chí sẽ không nhìn vào bên trong bao gồm www/1.txt một lần nữa. Quy tắc đầu tiên loại trừ thư mục mẹ www nhưng không phải www/1.txt và kết quả là www/1.txt không thể được "bao gồm lại".

Nhưng đối với trường hợp sau, git trước hết bỏ qua tất cả các tệp/folers theo www và sau đó bao gồm một trong số các tệp/số đó là www/1.txt.

Đối với ví dụ này, dòng follwing trong tài liệu có thể giúp:

Một tiền tố tùy chọn "!" phủ nhận mẫu; bất kỳ tệp phù hợp nào bị loại trừ bởi mẫu trước đó sẽ được bao gồm lại. Không phải là có thể bao gồm lại tệp nếu thư mục gốc của tệp đó bị loại trừ .

+2

+1 cho ví dụ thực tế ở phần cuối minh họa cách chúng khác nhau trong trường hợp mẫu phủ định. Hãy tận hưởng huy hiệu :) –

+0

Bạn không nghĩ rằng 'www/1.txt' và sau đó' www/'sẽ làm tương tự như cách tiếp cận thứ hai ... –

7

Tôi chỉ phân tích cú pháp thông qua tài liệu và theo như tôi có thể nói, chúng chỉ khác nhau ở các mẫu nâng cao hơn, ví dụ:

$ cat .gitignore 
    # exclude everything except directory foo/bar 
    /* 
    !/foo 
    /foo/* 
    !/foo/bar 

tôi đã thử nghiệm trên, và nếu bạn thay thế !/foo với !/foo/*, bạn thực sự có được một kết quả khác nhau.

Note

foo 

sẽ loại trừ bất kỳ tập tin foo, nhưng

foo/ 

sẽ chỉ loại trừ thư mục tên là foo.

3

Ngoài các câu trả lời hoàn hảo tốt mà bạn đã thu được, bạn nên lưu ý rằng bạn có thể có .gitignore ở bất kỳ nơi nào trong dự án của mình, kể cả thư mục con.

Vì vậy, nếu bạn muốn bỏ qua tất cả các file bên trong www, nhưng whant thư mục www được phiên bản, thay vì sử dụng một sản phẩm nào .gitkeep, .dummy hoặc bất cứ tên nào bạn chọn, tại sao không sử dụng một .gitignore ở đó, nói để bỏ qua tất cả các file ?

/ 
|- .gitignore (a) 
\- www 
    |- .gitignore (b) 
    |- 1.jpg 
    \- 2.jpg 

Trong rễ .gitignore (a), bạn không nói bất cứ điều gì về www thư mục hoặc nội dung của nó.

Trong www/.gitignore (b) bạn đặt như sau:

# ignore all files in this folder except this .gitignore 
* 
!.gitignore 

Bằng cách này tất cả mọi thứ trông có tổ chức hơn (với tôi ít nhất).

1

Để bỏ qua tất cả mọi thứ trong một thư mục trừ dotfiles bạn có thể sử dụng glob-mẫu sau trong .gitignore của bạn:

www/[^.]* 

Vì vậy, không cần cho thêm một .gitignore, chỉ đơn giản là thêm một tập tin .keep vào thư mục www của bạn.

Các vấn đề liên quan