Khi nào sử dụng dấu gạch chéo đầu tiên trong gitignore


108

Tôi đang cố gắng hiểu rõ ràng hơn về .gitignorecú pháp, và cụ thể là liên quan đến https://github.com/github/gitignore gitignores.

Tôi thấy rằng dấu gạch chéo ở đầu chỉ được sử dụng để đối sánh tên đường dẫn liên quan đến vị trí của .gitignoretệp (từ http://git-scm.com/docs/gitignore ):

Dấu gạch chéo ở đầu khớp với phần đầu của tên đường dẫn. Ví dụ: "/*.c" khớp với "cat-file.c" nhưng không khớp với "mozilla-sha1 / sha1.c".

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

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

Đâ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.

Thử nghiệm đầu tiên:

# .gitignore
dir/

# git status
nothing to commit

Vì vậy, Git đang bỏ qua cả hai dirthư 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 (ngoại 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ứ phù hợp với mẫu.

Thử nghiệm thứ hai:

# .gitignore
/dir/

# git status
Untracked files:
    src/

Ở đây, Git chỉ bỏ qua dirthư mục trực tiếp bên dưới thư mục gốc, nhờ dấu gạch chéo ở đầu trong mẫu.

Thử nghiệm thứ ba:

# .gitignore
dir/*

# git status
Untracked files:
    src/

Điều này phù hợp với trường hợp số 2: mẫu có một số dấu gạch chéo bên trong, vì vậy nó được coi là 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ự. Chúng ta hãy xem xét tệp gitignore này : khi họ bỏ qua thư mục downloader/, chẳng hạn, họ không thực sự bỏ qua mọi downloaderthư mục đơn lẻ được tìm thấy trong toàn bộ cây thư mục? Đây là những gì tôi định hướng suy nghĩ kể 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 downloaderthư mục bên trong nó, nó sẽ bất ngờ bị bỏ qua 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 mang tính thực tiễn 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 .gitignoretập tin (mà tôi đang đề cập đến chỉ là một ví dụ, btw) rất nhiều các mẫu chứa dấu gạch chéo, vì vậy chúng được kết hợp một cách chính xác chống lại tên đường dẫn bắt đầu từ gốc, nhưng có một vài trường hợp, như downloader/hay errors/mà , nếu tôi không nhầm, nó có khả năng nguy hiểm và có thể nên đổi thành /downloader//errors/.

Như một câu hỏi tổng quát hơn, tôi có nên luôn sử dụng dấu gạch chéo đầu cho các mẫu không chứa dấu gạch chéo (ngoại trừ dấu gạch chéo) khi tôi muốn chọn tên đường dẫn rõ ràng bắt đầu từ gốc và không sử dụng nó cho các mẫu có chứa dấu gạch chéo hay không, hay tôi nên luôn sử dụng dấu gạch chéo ở đầu cho rõ ràng? Bạn nghĩ gì về nó?

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


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

4
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

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

Tôi muốn xem bài đăng tuyệt vời này được chia thành các phần câu hỏi và câu trả lời ...
Barett

Câu trả lời:


25

Chỉ muốn tóm tắt để có thể tham khảo nhanh trong tương lai - dấu gạch chéo hàng đầu neo kết quả phù hợp vào gốc. Vì vậy, trong ví dụ dưới đây, nếu 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ẽ lấy *và di chuyển đệ quy xuống cây. Tuy nhiên, với /*, nó loại trừ mọi thứ ngoại trừ thư mục foo và nội dung của nó:

$ cat .gitignore
/*
!/foo

24

Bạn đã trả lời câu hỏi của riêng bạn hoàn toàn. Nếu bạn xem xét kỹ hơn repo github / gitignore, bạn sẽ thấy hầu hết các tệp sử dụng các quy tắc không nhất quán 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 thèm đọc tài liệu cũng như kiểm tra mọi thứ như bạn đã làm.

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

Nếu bạn thấy sai sót trong các dự án hợp tác như thế này, đừng ngần ngại đóng góp kiến ​​thức của bạn. Thậm chí có một số tiền lệ nếu bạn cần xây dựng sự tự tin của mình hơn nữa.

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.