Làm thế nào để các mẫu phủ định hoạt động trong .gitignore?


93

Tôi đang cố gắng sử dụng tệp .gitignore với các mẫu phủ định (dòng bắt đầu bằng!), Nhưng nó không hoạt động theo cách tôi mong đợi.

Như một ví dụ tối thiểu, tôi có cấu trúc thư mục theo sau:

C:/gittest
 -- .gitignore
 -- aaa/
   -- bbb/
     -- file.txt
   -- ccc/
     -- otherfile.txt

và trong tệp gitignore của tôi, tôi có cái này:

aaa/
!aaa/ccc/

Sự hiểu biết của tôi (dựa trên trang doc này ) là tệp aaa / ccc / otherfile.txt không nên bị bỏ qua, nhưng trên thực tế, git đang bỏ qua mọi thứ theo aaa.

Tôi có hiểu nhầm câu này không: "Tiền tố tùy chọn! Phủ định mẫu; bất kỳ tệp phù hợp nào bị loại trừ bởi mẫu trước đó sẽ được đưa vào lại."?

BTW, đây là trên Windows với msysgit 1.7.0.2.

Câu trả lời:


159

Tôi nghĩ rằng những gì bạn thực sự muốn làm là:

aaa/*
!aaa/ccc

Bạn đang nói với nó "đừng nhìn vào aaa" vì vậy nó thậm chí không bao giờ kiểm tra đường dẫn aaa/ccc. Nếu bạn sử dụng ký tự đại diện, nó vẫn đọc nội dung của aaa, sau đó mỗi mục nhập khớp với ký tự đại diện và bị bỏ qua, ngoại trừ mục nhập aaa/cccđược đưa trở lại.


2
@iconoclast: Vậy thì có lẽ bạn đang làm điều gì đó khác biệt. Đăng câu hỏi khác (với thông tin đầy đủ) nếu bạn muốn được trợ giúp.
Cascabel

Điều này đã không làm việc cho tôi, hoặc: / apps / * / apps / MyApps / FluidTest / bin /!
Jarrod Smith

5
@Jarrod Nó hoạt động; bạn chỉ đang làm điều gì đó khác biệt. Bạn sẽ phải sử dụng phương pháp này một cách đệ quy, vì những lý do chính xác được đưa ra trong câu trả lời. ! apps / myApps, apps / myApps / *, v.v.
Cascabel

Ahh xin lỗi, giờ tôi đã hiểu. Nhưng VẬY sẽ không để tôi ủng hộ nữa.
Jarrod Smith,

Wonder lý do tại sao nó không làm việc cho aaa / ** / * aaa / ccc / eee (bỏ qua tất cả mọi thứ, ngoại trừ file cùng con đường nhất định)!
Phương Nguyễn

21

Nếu bạn muốn loại trừ mọi thứ trong aaa, nhưng bao gồm aaa/cccvà mọi thứ bên dưới nó, bạn nên sử dụng:

aaa/*
!aaa/ccc
!aaa/ccc/*

Dòng đầu tiên yêu cầu git bỏ qua mọi thứ bên dưới aaa, dòng thứ hai yêu cầu nó không bỏ qua thư mục aaa/cccthực sự "kích hoạt" dòng thứ ba sau đó nói với nó không bỏ qua mọi thứ bên dưới aaa/ccc.


1
Dòng thứ ba không có gì khác biệt đối với tôi.
James Hopkin

3
Để có thể bao gồm tất cả mọi thứ trong bất kỳ thư mục con của aaa/ccccác cấp, những gì làm việc cho tôi là !aaa/ccc/**thay vì!aaa/ccc/*
boclodoa

3

Nếu ai đó vẫn không thấy các mục mới được bỏ qua trong quá trình git statuschạy git update-indextrước thì có thể giúp git xem các thay đổi (ít nhất là trong phiên bản 1.9.x của gitbash).

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.