Tôi đang cố gắng giải quyết vấn đề gitignore trên một cấu trúc thư mục lớn, nhưng để đơn giản hóa câu hỏi của tôi, tôi đã giảm nó xuống như sau.Quy tắc loại trừ gitignore thực sự hoạt động như thế nào?
Tôi có cấu trúc sau đây thư mục của hai tập tin (foo, bar) trong một kho git thương hiệu mới (không cam kết cho đến nay):
a/b/c/foo
a/b/c/bar
Rõ ràng, một 'git status -u' show:
# Untracked files:
...
# a/b/c/bar
# a/b/c/foo
Điều tôi muốn làm là tạo tệp .gitignore bỏ qua mọi thứ bên trong/b/c nhưng không bỏ qua tệp 'foo'.
Nếu tôi tạo ra một .gitignore như sau:
c/
Sau đó, một 'git status -u' cho thấy cả hai foo và bar như bỏ qua:
# Untracked files:
...
# .gitignore
Đó là như tôi mong đợi.
Bây giờ nếu tôi thêm một quy tắc loại trừ cho foo, như sau:
c/
!foo
Theo manpage gitignore, tôi mong đợi này để làm việc. Nhưng nó không - nó vẫn bỏ qua foo:
# Untracked files:
...
# .gitignore
này không làm việc một trong hai:
c/
!a/b/c/foo
Không thực hiện điều này:
c/*
!foo
Cung cấp:
# Untracked files:
...
# .gitignore
# a/b/c/bar
# a/b/c/foo
Trong trường hợp đó, mặc dù foo không còn là người bỏ qua ed, bar cũng không bị bỏ qua.
Thứ tự của các quy tắc trong .gitignore dường như không quan trọng.
này cũng không làm những gì tôi mong đợi:
a/b/c/
!a/b/c/foo
Đó là một bỏ qua cả hai foo và bar.
Một tình huống mà không làm việc là nếu tôi có thể tạo các tập tin a/b/c/.gitignore và đặt trong đó:
*
!foo
Nhưng vấn đề với điều này là cuối cùng sẽ có thư mục con khác dưới một/b/c và tôi không muốn phải đặt một .gitignore riêng biệt vào từng đơn lẻ - tôi đã hy vọng tạo ra các tệp'gitignore 'dựa trên dự án có thể nằm trong thư mục trên cùng của mỗi dự án và bao gồm tất cả cấu trúc thư mục con 'chuẩn'.
này cũng có vẻ là tương đương:
a/b/c/*
!a/b/c/foo
Đây có thể là điều gần gũi nhất để "làm việc" mà tôi có thể đạt được, nhưng đường dẫn tương đối đầy đủ và ngoại lệ rõ ràng cần phải được nêu rõ, đó là sẽ là một nỗi đau nếu tôi có rất nhiều tập tin của tên 'foo' ở các cấp độ khác nhau của cây thư mục con.
Dù sao, hoặc là tôi không hoàn toàn hiểu cách quy tắc loại trừ việc, hoặc họ không làm việc ở tất cả khi thư mục (chứ không phải là ký tự đại diện) sẽ được bỏ qua - bởi một quy tắc kết thúc bằng một/
Bất cứ ai có xin vui lòng làm sáng tỏ điều này?
Có cách nào để làm cho gitignore sử dụng một cái gì đó hợp lý như biểu thức thông thường thay vì cú pháp dựa trên vỏ vụng về này không?
Tôi đang sử dụng và quan sát điều này với git-1.6.6.1 trên Cygwin/bash3 và git-1.7.1 trên Ubuntu/bash3.
câu hỏi có liên quan: http://stackoverflow.com/questions/2820255/how-do-negated-patterns-work-in-gitignore/2820310#2820310 – Cascabel