gitignore tất cả các tập tin mở rộng trong thư mục


Câu trả lời:


121

Chưa bao giờ thử nó, nhưng git help ignoregợi ý rằng nếu bạn đặt một .gitignorevới *.jstrong /public/static, nó sẽ làm những gì bạn muốn.

Lưu ý: đảm bảo cũng kiểm tra câu trả lời của Joeys bên dưới: nếu bạn muốn bỏ qua các tệp trong thư mục con cụ thể, thì .gitignore cục bộ là giải pháp phù hợp (địa phương là tốt). Tuy nhiên nếu bạn cần cùng một mô hình để áp dụng cho toàn bộ repo của mình, thì giải pháp ** là tốt hơn.


19
Đó không phải là giải pháp tốt nhất. Mọi người có thể sẽ cần đào qua các tệp .gitignore khác nhau để tìm lý do tại sao tệp của họ bị bỏ qua. Một số người thích có tất cả thông tin này trong một tệp .gitignore được lưu trữ tại thư mục gốc repo.
haren

1
@haren đó không phải là giải pháp duy nhất - Câu trả lời của Joey chắc chắn cũng có giá trị. Chọn bất cứ điều gì làm việc tốt nhất cho bạn. Tôi cho rằng bỏ qua các quy tắc cục bộ cho một thư mục nên có trong thư mục đó và các quy tắc toàn cầu sẽ là toàn cầu. (Ngoài ra, câu trả lời này là cổ xưa và tôi không nghĩ ** được hỗ trợ tại thời điểm đó).
ptyx

209

Có vẻ như **cú pháp được hỗ trợ bởi gitphiên bản 1.8.2.1theo tài liệu .

Hai dấu sao liên tiếp (" **") trong các mẫu khớp với tên đường dẫn đầy đủ có thể có ý nghĩa đặc biệt:

  • Một "" hàng đầu **theo sau là dấu gạch chéo có nghĩa là khớp trong tất cả các thư mục. Ví dụ: " **/foo" khớp với tệp hoặc thư mục " foo" ở bất cứ đâu, giống như mẫu " foo". " **/foo/bar" khớp với tệp hoặc thư mục " bar" bất cứ nơi nào trực tiếp trong thư mục " foo".

  • Một dấu " /**" khớp với mọi thứ bên trong. Ví dụ: " abc/**" khớp với tất cả các tệp trong thư mục " abc", liên quan đến vị trí của .gitignoretệp, với độ sâu vô hạn.

  • Một dấu gạch chéo theo sau hai dấu sao liên tiếp sau đó một dấu gạch chéo khớp với 0 hoặc nhiều thư mục. Ví dụ: " a/**/b" khớp " a/b", " a/x/b", " a/x/y/b", v.v.

  • Các dấu hoa thị liên tiếp khác được coi là không hợp lệ.


1
sự khác biệt giữa xxx/**xxx/?
thuzhf

9
xxx/**nhắm mục tiêu tất cả các tập tin và thư mục bên trong trong xxxkhi xxx/nhắm mục tiêu xxxtrực tiếp thư mục . Điều này thực sự chỉ quan trọng khi phủ định các mẫu với mục !"Không thể bao gồm lại một tệp nếu thư mục mẹ của tệp đó bị loại trừ.", Vì vậy sử dụng xxx/*hoặc xxx/**sẽ là cần thiết trong trường hợp đó.
joeyhoer

4
Tất cả các tệp có đuôi .meta nên được bỏ qua bởi git. Cái này hoạt động ra sao? **.js?
Đen

"Các dấu sao liên tiếp khác được coi là không hợp lệ." tổng hợp tất cả
imrok

68

CẬP NHẬT: Hãy xem câu trả lời của @ Joey : Git hiện hỗ trợ **cú pháp theo mẫu. Cả hai cách tiếp cận nên hoạt động tốt.


Các gitignore (5) người đàn ông bang:

Các mẫu được đọc từ tệp .gitignore trong cùng thư mục với đường dẫn hoặc trong bất kỳ thư mục mẹ nào, với các mẫu trong các tệp cấp cao hơn (lên tới toplevel của cây công việc) bị ghi đè bởi các tệp trong các tệp cấp thấp hơn vào thư mục chứa các tập tin.

Điều này có nghĩa là các mẫu trong một .gitignoretệp trong bất kỳ thư mục đã cho nào của repo của bạn sẽ ảnh hưởng đến thư mục đótất cả các thư mục con .

Mẫu bạn cung cấp

/public/static/**/*.js

không hoàn toàn đúng, trước tiên là vì (như bạn đã lưu ý chính xác) **cú pháp không được Git sử dụng. Ngoài ra, các /neo hàng đầu mô hình đó bắt đầu tên đường dẫn. (Vì vậy, /public/static/*.jssẽ khớp /public/static/foo.jsnhưng không /public/static/foo/bar.js .) Loại bỏ hàng đầu /sẽ không hoạt động, khớp các đường dẫn như public/static/foo.jsfoo/public/static/bar.js. EDIT: Chỉ cần loại bỏ dấu gạch chéo hàng đầu cũng không hoạt động - vì mẫu vẫn chứa dấu gạch chéo, nó được Git coi là một vỏ toàn cầu đơn giản, không đệ quy (cảm ơn @Joey Hoer đã chỉ ra điều này).

Như @ptyx đã đề xuất, những gì bạn cần làm là tạo tệp <repo>/public/static/.gitignorevà chỉ bao gồm mẫu này:

*.js

Không có hàng đầu /, vì vậy nó sẽ khớp với bất kỳ phần nào của đường dẫn và mẫu đó sẽ chỉ được áp dụng cho các tệp trong /public/staticthư mục và các thư mục con của nó.


2
Điều này không hoàn toàn đúng - cụ thể là phần "Loại bỏ hàng đầu /sẽ không hoạt động, phù hợp với các đường dẫn như public/static/foo.jsfoo/public/static/bar.js." là sai. Để trích dẫn tài liệu "Nếu mẫu không chứa dấu gạch chéo /, Git coi nó là mẫu toàn cầu shell và kiểm tra sự trùng khớp với tên đường dẫn liên quan đến vị trí của tệp .gitignore (liên quan đến toplevel của cây công việc nếu không phải từ tệp .gitignore). " foo/public/static/bar.jssẽ không được khớp bởi vì mẫu không chứa a /.
joeyhoer

@JoeyHoer nhờ mẹo, tôi đã cập nhật câu trả lời của mình cho phù hợp.
Adam Sharp

9

Để bỏ qua các tệp không bị theo dõi, chỉ cần truy cập .git / thông tin / loại trừ. Loại trừ là một tệp có danh sách các phần mở rộng hoặc tệp bị bỏ qua.


1
Điều này sẽ không chuyển sang các bản sao khác của kho lưu trữ như .gitignore sẽ (sau khi được cam kết, tất nhiên).
jpmc26

3

Tôi tin rằng giải pháp đơn giản nhất sẽ là sử dụng find. Tôi không muốn có nhiều người .gitignorequanh quẩn trong các thư mục con và tôi thích quản lý một cấp cao nhất, duy nhất .gitignore. Để làm như vậy, bạn có thể chỉ cần nối các tệp tìm thấy vào .gitignore. Giả sử đó /public/static/là dự án / nhà của bạn, tôi sẽ sử dụng một cái gì đó như:

find . -type f -name *.js | cut -c 3- >> .gitignore

Tôi thấy rằng việc cắt bỏ phần ./đầu thường là cần thiết để git hiểu những tập tin cần tránh. Do đó cut -c 3-.

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.