Làm cách nào để thêm các tệp không có dấu chấm trong đó (tất cả các tệp không có phần mở rộng) vào tệp gitignore?


111

Giống như tiêu đề cho biết, có thể thêm "tệp không có dấu chấm" vào tệp gitignore không?

Tôi tưởng tượng điều này sẽ xử lý tất cả các tệp không có phần mở rộng phiền phức đó.


2
Có một số file extensionless mà bạn không muốn bỏ qua: README, LICENSEhay COPYING, INSTALL, Makefilevv mặc dù bạn luôn có thể ép thêm họ và sau đó họ được theo dõi
Jakub Narębski

@ JakubNarębski điểm tốt. Tôi đã bao gồm nó trong câu trả lời của tôi để dễ hiển thị hơn.
VonC

Câu trả lời:


121

Bạn có thể thử kết hợp tương tự như:

*
!/**/
!*.*

gitignoreQuy tắc loại trừ đó ( mẫu phủ định ) sẽ bỏ qua tất cả các tệp, ngoại trừ những tệp có phần mở rộng.

Như đã đề cập bên dưới bởi Mad Physicist , quy tắc là:

Không thể bao gồm lại tệp nếu thư mục mẹ của tệp đó bị loại trừ. (*)
(*: trừ khi một số điều kiện được đáp ứng trong git 2.?+, hãy xem bên dưới)

Đó là lý do tại sao lại !/**/quan trọng (danh sách trắng các thư mục mẹ một cách đệ quy) nếu chúng ta muốn liệt kê các tệp trong danh sách trắng.

Tôi đã đề cập đến quy tắc tương tự trong các trường hợp tương tự như:


Như nhận xét của Jakub Narębski , bạn có thể không muốn bỏ qua tất cả các tệp không có phần mở rộng.

Lời khuyên của tôi:

  • trước tiên hãy thêm tệp không có phần mở rộng quan trọng
  • sau đó chỉnh sửa của bạn .gitignorenhư được hiển thị ở trên: các tệp đã được tạo phiên bản sẽ không bị bỏ qua (ngay cả khi chúng không có phần mở rộng). Tất cả những người khác sẽ bị bỏ qua.

Đối với bất kỳ tệp không có phần mở rộng nào trong tương lai mà bạn muốn phiên bản:

git add -f -- myFile

Lưu ý rằng với git 2.9.x / 2.10 (giữa năm 2016?), Có thể bao gồm lại tệp nếu thư mục mẹ của tệp đó bị loại trừ nếu không có ký tự đại diện trong đường dẫn được đưa lại .

Nguyễn Thái Ngọc Duy ( pclouds) đang cố gắng thêm tính năng này:

Tuy nhiên, vì một trong những quy tắc để đưa vào lại là:

Phần thư mục trong quy tắc bao gồm lại phải là chữ (nghĩa là không có ký tự đại diện)

Điều này sẽ không hoạt động ở đây dù sao.


1
Câu trả lời là hoàn toàn chính xác. Nhưng có lẽ tốt hơn .gitignoresẽ là **!**.*. Tôi biết điều này không tạo sự khác biệt nếu dấu hoa thị được đặt ở phía trước, nhưng nó là rõ ràng hơn và âm thanh với cách xử lý vỏ ký tự đại diện ...
Willem Van Onsem

7
Lưu ý: để làm việc với các quy tắc loại trừ khác, điều này sẽ cần phải được tập đầu tiên của quy tắc trong tập tin .gitignore của bạn
Erik

Bạn cũng có thể bao gồm một số tệp không có phần mở rộng nhất định, ví dụ: với !Makefile. Lưu ý rằng tôi đã gặp sự cố với giải pháp này trong Git 1.7.1 trong khi nó hoạt động tốt trong 1.9.0. Trong trường hợp của tôi, việc thêm tệp trong thư mục gốc hoạt động tốt, nhưng việc thêm tệp có phần mở rộng bên trong thư mục con được hiển thị là bị bỏ qua. Điều này có vẻ là do 1.7.1 chưa hỗ trợ **mô hình, hãy xem tại đây !
mxmlnkn

1
**đã được thêm vào Git 1.8.2. Có bất lợi khi sử dụng !*/thay vì !/**/?
mxmlnkn

@TamaMcGlinn Điều đó trông giống như một regex: gitignore không hỗ trợ regex.
VonC

50
*
!*/
!*.*

* bảo git bỏ qua mọi thứ.

!*/sau đó hủy bỏ qua bất kỳ thứ gì là một thư mục. Đây là điều tối quan trọng.

!*.* hủy bỏ qua tất cả các tệp có phần mở rộng.

Nếu không có !*/quy tắc, các thư mục không có .tên sẽ không được liệt kê và không có tệp nào trong số các tệp mong muốn của bạn sẽ được thêm bên ngoài thư mục gốc.

Để tham khảo, hãy đọc hai phần sau trong tài liệu .gitignore nổi bật:

Tiền tố tùy chọn "!" mà 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. Không thể bao gồm lại tệp nếu thư mục mẹ của tệp đó bị loại trừ. Git không liệt kê các thư mục bị loại trừ vì lý do hiệu suất, vì vậy bất kỳ mẫu nào trên các tệp được chứa đều không có hiệu lực, bất kể chúng được xác định ở đâu. Đặt dấu gạch chéo ngược ("\") trước dấu "!" Đầu tiên đối với các mẫu bắt đầu bằng chữ "!", ví dụ: "! important! .txt".

Nếu mẫu kết thúc bằng một dấu gạch chéo, nó sẽ bị xóa vì mục đích của mô tả sau, nhưng nó sẽ chỉ tìm thấy sự trùng khớp với một thư mục. Nói cách khác, foo / sẽ khớp với foo thư mục và các đường dẫn bên dưới nó, nhưng sẽ không khớp với một tệp thông thường hoặc một liên kết tượng trưng foo (điều này phù hợp với cách thức hoạt động của pathspec nói chung trong Git).


1
Nắm bắt tốt. +1. Tôi đã quên cập nhật câu trả lời của mình với quy tắc mà tôi đã sử dụng gần đây trong các câu trả lời khác của tôi. Tôi đã cập nhật câu trả lời của mình cho phù hợp.
VonC

0

Trong thư mục của tôi có rất nhiều tệp có *.c, *.h, *.txt, *.csvphần mở rộng, v.v. và tệp nhị phân không có bất kỳ phần mở rộng nào. Vì vậy, tôi cần phải bỏ qua tất cả các tệp thực thi *.c,*.h.gitignore, Vì vậy, điều này phù hợp với tôi, từ .gitignoreví dụ:

 */*         #ignore all files in each directory
 !*/*.c      #unignore .c files in each directory
 !*/*.h      #unignore .h header files in each directory
 !.gitignore #unignore .gitignore
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.