2010-07-22 21 views
142

Trừ khi một repo bao gồm một số dự án độc lập, có vẻ như nó sẽ là đơn giản nhất để chỉ có một tập tin .gitignore tại gốc của repo hơn so với những người khác trong suốt. Có một thực hành tiêu chuẩn tốt nhất về điều này hoặc một số phân tích trực tuyến khi một cách tiếp cận là tốt hơn so với khác?Có nhiều `.gitignore` cau mày không?

Trả lời

157

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

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

  • Bỏ qua các tệp đã cho chỉ trong thư mục đã cho (phụ) (bạn có thể sử dụng /sub/foo trong .gitignore, mặc dù).

Hãy nhớ rằng các mẫu trong .gitignore tập áp dụng đệ quy đến (sub) thư mục tập tin trong và tất cả các thư mục con của nó, trừ khi mẫu chứa '/' (do đó ví dụ như mô hình name áp dụng cho bất kỳ tập tin có tên name trong trao và tất cả các thư mục con của nó, trong khi /name appliest để tập tin với tên này chỉ trong thư mục nhất định).

+1

Ah, vì lý do nào đó tôi nghĩ /Documentation/*.html sẽ đề cập đến điều này, nhưng tôi đoán * thẻ hoang dã sẽ chỉ khớp với các thư mục ở một cấp. –

+6

@ConleyOwens: với Git hiện đại, bạn có thể sử dụng 'Tài liệu/**/*. Html' (lưu ý rằng bất kỳ dấu gạch chéo nào neo mẫu;'/foo' được sử dụng để neo tệp trực tiếp trong thư mục) –

35

Bạn có thể có nhiều .gitignore, mỗi khóa học trong một thư mục riêng.
Để kiểm tra quy tắc gitignore nào chịu trách nhiệm bỏ qua tệp, hãy 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 tệp .gitignore trên mỗi chi nhánh: Tôi đã thấy loại cấu hình đó để đảm bảo một chi nhánh bỏ qua tệp trong khi nhánh kia không: xem question for instance.

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 khảo chúng là submodules.
Đó sẽ là thực tiễn tốt nhất thực tế, cho phép mỗi dự án được sao chép độc lập (với các tệp .gitignore tương ứ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 true nature of submodules để biết thêm.


Lưu ý rằng, kể từ khi git 1.8.2 (tháng 3 năm 2013), bạn có thể làm một git check-ignore -v -- yourfile để xem những gitignore chạy (mà từ đó .gitignore tập tin) được áp dụng cho 'yourfile', và hiểu rõ hơn về lý do tại sao tập nói bị bỏ qua.
Xem "which gitignore rule is ignoring my file?"

+0

Tôi có phải là người duy nhất nghĩ câu đầu tiên vui không? (Bởi vì nhiều tệp cùng tên không thể nằm trong cùng một thư mục.) – TTT

+0

@TTT Tôi đồng ý. Tôi đã chỉnh sửa câu đầu tiên. Hãy cho tôi biết nếu nó có vẻ tốt hơn. – VonC

+0

Tốt hơn nhiều. : D Và bổ sung tuyệt vời của kiểm tra bỏ qua! – TTT

64

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

+0

bạn cũng có thể sử dụng ". git/info/exclude "file cho rằng – Ayell

+5

Chắc chắn, nếu bạn không quan tâm đến tính không thích hợp của việc phải mở một tệp ở một vị trí nào đó bên ngoài thư mục gốc, sau đó viết toàn bộ đường dẫn vào nó, và sau đó ghi nhớ để làm 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 tự động khi bạn xóa thư mục). Tôi chắc chắn có những tình huống mà '.git/info/exclude' là lựa chọn phù hợp hơn, nhưng không nhiều. –

+0

Có, khi bạn muốn loại trừ một tệp thay vì một thư mục ví dụ: p – Ayell

11

Pro đơn

  • Easy to find.

  • Quy tắc loại trừ tìm kiếm 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 bắt đầu với một chút trùng lặp hợp lý.

Pro nhiều

  • Scopes "kiến thức" cho một phần của cây tập tin, nơi nó là cần thiết.

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

    (Và trước khi Git 1.8, cách duy nhất để loại trừ một mô hình như my/**.example là tạo ra my/.gitignore với mô hình **.foo. Lý do này không áp dụng bây giờ, khi 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 đã không bao giờ bỏ lỡ mỗi thư mục .svn, và tôi sẽ không bỏ lỡ mỗi thư mục .gitignore hoặc.

Điều đó nói rằng, nhiều gitignores khá phổ biến. Nếu bạn sử dụng chúng, ít nhất là 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 thư mục chỉ có một cấp độ từ gốc.

+0

"rỗng .gitignore là cách duy nhất để cam kế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 là "trống rỗng" cho vấn đề đó) là phổ biến hơn. –

+0

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

4

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, uploads danh bạ, vv

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

* 
!.gitignore 

với .gitignore tập tin này, Git sẽ không theo dõi bất kỳ tập tin trong thư mục đó nhưng vẫn cho phép tôi để thêm .gitignore tập tin và do đó thư mục riêng của mình để t anh ta repo.

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