Có phải nhiều `.gitignore` cau mày?


238

Trừ khi một repo bao gồm một số dự án độc lập, có vẻ như đơn giản nhất là chỉ có một .gitignoretệp ở gốc của repo so với các dự án khác nhau trong suốt. Có một thực tiễn tốt nhất tiêu chuẩn về điều này hoặc một số phân tích trực tuyến khi một phương pháp tốt hơn phương pháp khác?

Câu trả lời:


253

Tôi có thể nghĩ về ít nhất hai tình huống mà bạn muốn có nhiều .gitignoretệp trong các thư mục (phụ) khác nhau.

  • Các thư mục khác nhau có các loại tập tin khác nhau để bỏ qua. Ví dụ, .gitignoretrong thư mục trên cùng của dự án của bạn bỏ qua các chương trình được tạo, trong khi Documentation/.gitignorebỏ qua tài liệu được tạo.

  • Bỏ qua file đưa ra chỉ trong cho thư mục (sub) (bạn có thể sử dụng /sub/footrong .gitignore, mặc dù).

Xin nhớ rằng các mẫu trong .gitignoretệp áp dụng đệ quy cho thư mục (phụ) mà tệp nằm trong và tất cả các thư mục con của nó, trừ khi mẫu có chứa '/' (ví dụ: mẫu nameáp dụng cho bất kỳ tệp nào có nametrong thư mục đã cho và tất cả các thư mục con của nó, trong khi /nameáp dụng cho tệp với tên này chỉ trong thư mục nhất định).


1
À, vì một số lý do tôi nghĩ /Documentation/*.html sẽ bao gồm điều này, nhưng tôi đoán thẻ * wild sẽ chỉ khớp với các thư mục ở một cấp độ.
Conley Owens

9
@ConleyOwens: với Git hiện đại, bạn có thể sử dụng Documentation/**/*.html(lưu ý rằng bất kỳ dấu gạch chéo nào neo mô hình; /foođược sử dụng để neo tệp trực tiếp trong thư mục)
Jakub Narębski

97

Là một lưu ý tiếp tuyến, một trường hợp khả năng có nhiều .gitignoretệp rất hữu ích là nếu bạn muốn có một thư mục bổ sung trong bản sao làm việc mà bạn không bao giờ có ý định cam kết. Chỉ cần đặt 1 byte .gitignore(chỉ chứa một dấu sao) trong thư mục đó và nó sẽ không bao giờ xuất hiện trong git statusv.v.


4
bạn cũng có thể sử dụng tệp ".git / thông tin / loại trừ" cho điều đó
Ayell

10
Chắc chắn, nếu bạn không bận tâm đến việc phải mở một tệp ở một vị trí nào đó bên ngoài kho lưu trữ, sau đó viết toàn bộ đường dẫn vào đó, và sau đó nhớ xóa sạch mục nhập nếu / khi bạn xóa thư mục. So sánh với printf \* > .gitignore(dọn dẹp là tự động khi bạn xóa thư mục). Tôi chắc chắn có những tình huống .git/info/excludelà sự lựa chọn phù hợp hơn, nhưng không nhiều.
Aristotle Pagaltzis

Có, khi bạn muốn loại trừ một tệp thay vì thư mục chẳng hạn: p
Ayell

4
Tôi đã nói rằng nếu bạn muốn có một thư mục bổ sung trong bản sao làm việc của bạn mà bạn không bao giờ có ý định cam kết trong câu trả lời của tôi.
Aristotle Pagaltzis

1
Vì nó tạo ra ít sự lộn xộn trong root .gitignore, tôi thích cách tiếp cận này rất nhiều.
David A. Gray

59

Bạn có thể có nhiều .gitignore, mỗi một khóa học trong thư mục riêng của mình.
Để kiểm tra quy tắc gitignore nào chịu trách nhiệm bỏ qua tệp, sử dụng git check-ignore: git check-ignore -v -- afile.

Và bạn có thể có phiên bản khác nhau của một .gitignoretệp cho mỗi nhánh: Tôi đã thấy loại cấu hình đó để đảm bảo một nhánh bỏ qua một tệp trong khi nhánh kia thì không: xem câu hỏi này chẳng hạn .

Nếu repo của bạn bao gồm một số dự án độc lập, tốt nhất nên tham chiếu chúng như các mô hình con .
Đó sẽ là các thực tiễn tốt nhất thực tế, cho phép mỗi dự án được sao .gitignorechép độc lập (với các tệp tương ứng của chúng ), trong khi được tham chiếu bởi một sửa đổi cụ thể trong dự án mẹ toàn cầu.
Xem bản chất thực sự của mô hình con để biết thêm.


Lưu ý rằng, kể từ git 1.8.2 (tháng 3 năm 2013), bạn có thể thực hiện git check-ignore -v -- yourfileđể xem gitignore nào chạy (từ .gitignoretệp nào) được áp dụng cho ' yourfile' và hiểu rõ hơn lý do tại sao tệp bị bỏ qua.
Xem " gitignorequy tắc được bỏ qua tập tin của tôi? "


17

Độc thân

  • Dễ tìm kiếm.

  • Việc tìm kiếm các quy tắc loại trừ có thể khá khó khăn nếu tôi có nhiều gitignore, ở một số cấp độ trong repo.

  • Với nhiều tệp, bạn cũng thường kết thúc với một chút trùng lặp.

Bội số chuyên nghiệp

  • Phạm vi "kiến thức" đến một phần của cây tập tin nơi cần thiết.

  • Vì Git chỉ theo dõi các tệp, một .gitignore trống là cách duy nhất để cam kết thư mục "trống".

    (Và trước Git 1.8, cách duy nhất để loại trừ một mẫu như my/**.examplelà tạo ra my/.gitignorevới mẫu đó **.foo. Lý do này không áp dụng ngay bây giờ, như bạn có thể làm /my/**/*.example.)


Tôi rất thích một tệp duy nhất, nơi tôi có thể tìm thấy tất cả các loại trừ. Tôi chưa bao giờ bỏ lỡ mỗi thư mục .svn và tôi cũng sẽ không bỏ lỡ mỗi thư mục .gitignore.

Điều đó nói rằng, nhiều gitignores là khá phổ biến. Nếu bạn sử dụng chúng, ít nhất hãy nhất quán trong việc sử dụng chúng để làm cho chúng hợp lý để làm việc. Ví dụ, bạn có thể đặt chúng trong các thư mục chỉ một cấp từ gốc.


"một .gitignore trống là cách duy nhất để cam kết một thư mục" trống "." Trên thực tế tôi thấy rằng việc tải lên một tệp README duy nhất (hoặc một tệp có tên emptycho vấn đề đó) là phổ biến hơn.
Marc.2377

6
.gitkeep là một cách hay để làm điều này quá ... chỉ là một quy ước khác. Tôi thích ý tưởng sử dụng tệp readme, bởi vì sau đó bạn có thể giải thích thư mục này được sử dụng để làm gì, trong đó đọc tệp cho tôi.
Gavin Pickin

8

Có rất nhiều kịch bản mà bạn muốn cam kết một thư mục để repo Git của bạn nhưng nếu không có các tập tin trong nó, ví dụ như logs, cache, uploadsdanh bạ, vv

Vì vậy, những gì tôi luôn luôn làm là thêm một .gitignoretập tin trong các thư mục có nội dung sau đây:

*
!.gitignore

Với .gitignoretệp này , Git sẽ không theo dõi bất kỳ tệp nào trong các thư mục đó mà vẫn cho phép tôi thêm .gitignoretệp và do đó chính thư mục đó vào repo.

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.