2011-11-16 72 views
17

Tôi có hai tập tin tôi muốn bỏ qua:Tại sao gitignore không hoạt động trong trường hợp này?

  • .idea/workspace.xml
  • someapp/src/.idea/workspace.xml

Tôi nghĩ thêm quy tắc đơn này để. gitignore sẽ đủ:

.idea/workspace.xml 

Nhưng nó chỉ bắt đầu cấp .idea/workspace.xml (status git lãm someapp/src/.idea/workspace.xml như untracked).

Tôi cũng đã thử **/.idea/workspace.xml, nhưng điều này không hoạt động chút nào. Cứu giúp?

+0

Hãy thử bỏ qua 'someapp/src/.idea/workspace.xml'? – Shahbaz

+0

Có lẽ * workspace.xml sẽ làm gì? – chelmertz

+0

@Shahbaz - hoạt động, nhưng tôi không hiểu tại sao .idea/workspace.xml thì không. – ripper234

Trả lời

11
  • [...]
  • Nếu mẫu không chứa một dấu gạch chéo /, git xử lý nó như một glob mẫu vỏ và kiểm tra cho một trận đấu với những tên đường dẫn tương đối so với vị trí của file .gitignore (liên quan đến toplevel của cây công việc nếu không phải từ một tập tin .gitignore).
  • Nếu không, git sẽ xử lý mẫu như hình cầu vỏ phù hợp để tiêu thụ bởi fnmatch (3) với cờ FNM_PATHNAME: ký tự đại diện trong mẫu sẽ không khớp với/trong tên đường dẫn. […]

Ngay khi đường dẫn có dấu gạch chéo, Git sẽ không còn kiểm tra đường đi mà thay vào đó sẽ trực tiếp sử dụng hành vi glob. Như vậy, bạn không thể đối sánh với .idea/workspace.xml nhưng chỉ cho workspace.xml.

Git manual: gitignore.

+0

Không phải là kết luận của bạn đối diện với những gì hướng dẫn nói? – manojlds

+0

@manojlds Tôi hy vọng không ...:/Nếu mẫu không chứa dấu gạch chéo, nó sẽ khớp với tên đường dẫn, nhưng nếu nó chứa dấu gạch chéo, nó sẽ không còn làm điều đó nữa và sẽ trực tiếp phát ra. – poke

+0

yup đó là ngược. không có dấu gạch chéo = kết hợp toàn cục. dấu gạch chéo = không có kết hợp toàn cục. glob có nghĩa là "* có thể phù hợp với một dấu gạch chéo" –

0

Theo trang gitignore người đàn ông:

Patterns đọc từ một tập tin .gitignore trong cùng thư mục với đường dẫn, hoặc trong bất kỳ thư mục cha, với các mẫu trong các tập tin trình độ cao hơn (lên đến toplevel của cây công việc) bị ghi đè bởi những người trong các tệp cấp thấp hơn xuống thư mục chứa tệp. Các mẫu này khớp với vị trí của tệp .gitignore. Một dự án thường bao gồm các tệp .gitignore như vậy trong kho lưu trữ của nó, chứa các mẫu cho các tệp được tạo ra như là một phần của dự án xây dựng.

(tôi nhấn mạnh)

5

Xem các ví dụ trong gitignore dẫn sử dụng:

"Tài liệu/* html" trận đấu "tài liệu/git.html" nhưng không "tài liệu/ppc/ppc.html" hoặc "công cụ/perf/tài liệu/perf.html"

Vì vậy .idea/workspace.xml sẽ phù hợp với một gốc nhưng không someapp/src/.idea/workspace.xml

Nhưng tùy thuộc vào triển khai fnmatch của bạn, đây là những gì bạn cần trong.gitignore:

.idea/workspace.xml 
**/.idea/workspace.xml 
+1

Điều này trong thực tế không làm việc cho tôi. – ripper234

+0

@ ripper234 - Như tôi đã nói, phụ thuộc vào việc triển khai fnmatch. Làm việc cho tôi. – manojlds

+2

Tôi đang sử dụng Windows, có lẽ đây là lý do cho sự khác biệt. – ripper234

2

thử này

/**/.idea/workspace.xml

20

này có changed in git 1.8.4

Sử dụng nền tảng fnmatch (3) chức năng (nhiều nơi như pathspec khớp, .gitignore và .gitattributes) đã được thay thế bằng wildmatch, cho phép "foo/**/bar" khớp với "foo/bar", "foo/a/bar", v.v.

**/.idea/workspace.xml sẽ hoạt động ngay trong ví dụ này.

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