2014-06-10 12 views
66

Tôi đang cố gắng hiểu rõ hơn cú pháp .gitignore và đặc biệt là đến chừng https://github.com/github/gitignore gitignores có liên quan.Khi nào sử dụng dấu gạch chéo hàng đầu trong gitignore

Tôi thấy rằng các dấu gạch chéo hàng đầu được sử dụng để phù hợp với chỉ đường dẫn Tìm tương đối so với vị trí của file .gitignore (từ http://git-scm.com/docs/gitignore):

Một dấu gạch chéo hàng đầu phù hợp với đầu 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".

Nhưng điều gì xảy ra khi tôi xóa dấu gạch chéo hàng đầu? Theo như những gì tôi hiểu, có hai trường hợp:

  1. Nếu mẫu không có dấu gạch chéo (hoặc chỉ chứa dấu gạch chéo, có nghĩa là nó phải khớp với một thư mục), tìm kiếm được thực hiện bên trong toàn bộ cây thư mục. Ví dụ: mẫu dir/ sẽ khớp với <root>/dir, <root>/a/dir, <root>/a/b/c/.../dir, v.v., trong đó <root> là vị trí của tệp .gitignore.
  2. Nếu mẫu có dấu gạch chéo, không ở vị trí cuối (nó không phải là ký tự cuối cùng), thì nó chỉ được khớp với tên đường dẫn tương ứng với vị trí tệp .gitignore.

Đây là những ví dụ tôi đã thực hiện để kiểm tra hành vi này:

# Directory structure: 
<root> 
|- dir/ 
| |- test 
|- src/ 
| |- dir/ 
| | |- test 
test file is there only because Git does not track empty directories. 

Đầu tiên kiểm tra:

# .gitignore 
dir/ 

# git status 
nothing to commit 

Vì vậy, Git là bỏ qua cả dir thư mục. Điều này phù hợp với trường hợp số 1: mẫu không có dấu gạch chéo (trừ dấu gạch chéo), vì vậy Git đang xem toàn bộ cây thư mục, bỏ qua mọi thứ khớp với mẫu.

thử nghiệm thứ hai:

# .gitignore 
/dir/ 

# git status 
Untracked files: 
    src/ 

Ở đây, Git được bỏ qua chỉ thư mục dir trực tiếp bên dưới thư mục gốc, nhờ vào các dấu gạch chéo hàng đầu trong mô hình.

Thứ ba thử nghiệm:

# .gitignore 
dir/* 

# git status 
Untracked files: 
    src/ 

này phù hợp với trường hợp số 2: mô hình có một số dấu gạch chéo bên trong nó, vì vậy nó được coi là một tên đường dẫn bắt đầu từ thư mục gốc.

Bây giờ là lúc cho câu hỏi thực sự. Hãy xem xét this gitignore file: khi họ bỏ qua thư mục downloader/, chẳng hạn, họ có thực sự bỏ qua mọi thư mục downloader đơn được tìm thấy trong toàn bộ cây thư mục không? Đây là những gì tôi được định hướng để suy nghĩ từ những gì tôi đã thấy về hoạt động của Git trước đây.

Vì vậy, nếu tôi tình cờ có một mô-đun tùy chỉnh với một thư mục downloader bên trong nó, nó sẽ bị bỏ qua bất ngờ cũng như mô-đun thông thường trong thư mục gốc của Magento? Đây là một câu hỏi khó hiểu bởi vì nó thực sự đã xảy ra với tôi, tạo ra một lỗi thực sự khó tìm.Vì vậy, trong Magento .gitignore tập tin (mà tôi đề cập đến chỉ là một ví dụ, btw) rất nhiều các mẫu có dấu gạch chéo, do đó, chúng được kết hợp chính xác với tên đường dẫn bắt đầu từ gốc, nhưng có một vài các trường hợp, như downloader/ hoặc errors/, nếu tôi không nhầm, có khả năng gây nguy hiểm và có thể được thay đổi thành /downloader//errors/. Là một câu hỏi tổng quát hơn, tôi có nên sử dụng dấu gạch chéo hàng đầu cho các mẫu không chứa dấu gạch ngang (trừ dấu gạch chéo) khi tôi muốn chọn một tên đường dẫn bắt đầu từ gốc và không sử dụng nó cho các mẫu có dấu gạch chéo hay tôi luôn sử dụng dấu gạch chéo hàng đầu để làm rõ? Bạn nghĩ gì về nó?

Cảm ơn bạn đã đọc và xin lỗi vì bài đăng dài.

+2

Great câu hỏi và thật sự tốt đẹp giải thích, tôi cũng bị làm phiền với điều này và nghiên cứu của bạn làm cho mọi việc rõ ràng với tôi. Sau khi đọc điều này tôi sẽ nói rằng thực hành tốt là luôn luôn bắt đầu các đường dẫn với dấu gạch chéo nếu chúng bắt đầu từ gốc, nó làm cho ý định rõ ràng hơn. – Martinsos

+1

Cảm ơn :) Tôi đồng ý với lưu ý của bạn về việc sử dụng dấu gạch chéo để làm cho ý định rõ ràng hơn. – swahnee

+0

Đây phải là một phần của tài liệu .gitignore. Dễ hiểu hơn nhiều! – rmorrin

Trả lời

10

Bạn đã trả lời hoàn toàn câu hỏi của riêng mình. Nếu bạn nhìn vào github/gitignore repo chặt chẽ hơn, bạn sẽ thấy hầu hết các tệp sử dụng các quy tắc không phù hợp về cách các mẫu được viết; nó rất có thể được đóng góp bởi những người không bận tâm để đọc các tài liệu và cũng không kiểm tra những thứ như bạn đã làm.

Vì vậy, nếu điều đó giúp: Bạn nói đúng, hãy tự tin.

Nếu bạn gặp lỗi trong các dự án cộng tác như vậy, đừng ngại đóng góp kiến ​​thức của bạn. Thậm chí có some precedent nếu bạn cần xây dựng thêm sự tự tin của mình.

+0

Cảm ơn bạn rất nhiều! – swahnee

6

Chỉ muốn tóm tắt để có thể tham khảo nhanh trong tương lai - dấu gạch chéo dẫn đầu khớp với gốc. Vì vậy, trong ví dụ dưới đây, không có dấu gạch chéo, ký tự đại diện cũng sẽ loại trừ mọi thứ trong foo vì nó sẽ mất * và di chuyển đệ quy xuống cây. Tuy nhiên, với /*, nó không bao gồm tất cả mọi thứ ngoại trừ thư mục foo và nội dung của nó:

$ cat .gitignore 
/* 
!/foo 
Các vấn đề liên quan