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.
Tôi có cấu trúc thư mục sau của hai tệp (foo, bar) trong kho git hoàn toàn mới (cho đến nay không có cam kết):
a/b/c/foo
a/b/c/bar
Rõ ràng, một 'trạng thái git -u' hiển thị:
# Untracked files:
...
# a/b/c/bar
# a/b/c/foo
Những gì tôi muốn làm là tạo một tệp .gitignore bỏ qua mọi thứ bên trong a / b / c nhưng không bỏ qua tệp 'foo'.
Nếu tôi tạo một .gitignore như vậy:
c/
Sau đó, một 'trạng thái git -u' hiển thị cả foo và thanh như bị bỏ qua:
# Untracked files:
...
# .gitignore
Đó là như tôi mong đợi.
Bây giờ nếu tôi thêm quy tắc loại trừ cho foo, do đó:
c/
!foo
Theo trang web của gitignore, tôi hy vọng nó sẽ hoạt động. Nhưng nó không - nó vẫn bỏ qua foo:
# Untracked files:
...
# .gitignore
Điều này cũng không hoạt động:
c/
!a/b/c/foo
Không làm đ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 bị bỏ qua, thanh cũng không được bỏ qua.
Thứ tự của các quy tắc trong .gitignore dường như cũng không quan trọng.
Điều này cũng không làm những gì tôi mong đợi:
a/b/c/
!a/b/c/foo
Cái đó bỏ qua cả foo và bar.
Một tình huống hoạt động là nếu tôi tạo tệp a / b / c / .gitignore và đặt vào đó:
*
!foo
Nhưng vấn đề với điều này là cuối cùng sẽ có các thư mục con khác theo a / b / c và tôi không muốn phải đặt một .gitignore riêng biệt cho mỗi một - tôi đã hy vọng tạo ra '.gitignore dựa trên dự án'. các tệp 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 'tiêu chuẩn'.
Điều này cũng có vẻ tương đương:
a/b/c/*
!a/b/c/foo
Đây có thể là điều gần nhất để "làm việc" mà tôi có thể đạt được, nhưng các đường dẫn tương đối đầy đủ và ngoại lệ rõ ràng cần được nêu rõ, sẽ là một nỗi đau nếu tôi có nhiều tệp tên 'foo' ở các cấp độ khác nhau của cây thư mục con.
Dù sao, tôi cũng không hiểu các quy tắc loại trừ hoạt động như thế nào hoặc chúng hoàn toàn không hoạt động khi các thư mục (chứ không phải ký tự đại diện) bị bỏ qua - bởi một quy tắc kết thúc bằng /
Bất cứ ai có thể xin vui lòng làm sáng tỏ về điều này?
Có cách nào để khiến gitignore sử dụng một cái gì đó hợp lý như các 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.