Làm thế nào để .gitignore tệp một cách đệ quy


105

Tôi đang cố gắng tránh mẫu sau trong .gitignoretệp của mình .

MyPrject/WebApp/Scripts/special/*.js
MyPrject/WebApp/Scripts/special/*/*.js
MyPrject/WebApp/Scripts/special/*/*/*.js
MyPrject/WebApp/Scripts/special/*/*/*/*.js
MyPrject/WebApp/Scripts/special/*/*/*/*/*.js
MyPrject/WebApp/Scripts/special/*/*/*/*/*/*.js
MyPrject/WebApp/Scripts/special/*/*/*/*/*/*/*.js

Chúng tôi đã cố gắng:

MyPrject/WebApp/Scripts/special/**.js
MyPrject/WebApp/Scripts/special/**/*.js

Tuy nhiên, điều này đã không hoạt động. Đây là git trên Windows. Có cách nào ngắn gọn hơn để làm điều này mà không lặp lại mọi thứ không?


Câu trả lời:


114

Kể từ git 1.8.2, điều này:

MyPrject/WebApp/Scripts/special/**/*.js

Nên làm việc theo câu trả lời này . Nó cũng hoạt động đối với tôi trong Windows 7 bằng Sourcetree 1.6.12.0 và phiên bản git mà nó cài đặt (1.8.4-preview20130916).

Để duyệt đệ quy mọi tệp và thư mục trong thư mục một cách đệ quy:

MyPrject/WebApp/Scripts/special/**

Còn trước git 1.8 thì sao?
ashes999

1
Nếu câu trả lời này không hoạt động (trên Windows), hãy thêm ký tự /vào đầu. Ví dụ:/MyProject/WebApp/Scripts/special/**/*.js
batressc

3
Tôi cảm thấy xấu hổ khi câu trả lời của mình liên tục nhận được sự tán thành khi nó thực sự là một liên kết đến một câu trả lời khác .
Sam

1
@puk: .gitignorecâu hỏi này nằm trong repo root (thư mục mẹ của /Webapp).
lucid_dreamer

1
Câu trả lời của bạn có vẻ tốt nhưng không phù hợp với tôi trên Windows 10 với git 1.9.1 vì bỏ qua tất cả các tệp ngoại trừ js trong trường hợp sau: (dòng đầu tiên) foo/bar/*/*(dòng thứ hai) !foo/bar/**/*.jsNó chỉ hoạt động với một cấp độ của thư mục con, nhưng không hoạt động đệ quy.
LLL

19

Sau trang hướng dẫn gitignore:

[...] git coi mẫu như một khối cầu phù hợp để tiêu thụ bởi fnmatch (3) với cờ FNM_PATHNAME: các ký tự đại diện trong mẫu sẽ không khớp với a / trong tên đường dẫn.

Vì vậy, điều này rõ ràng là không có cách nào để chỉ định một lượng thư mục nhất định giữa hai chuỗi, như giữa specialjs.

Tuy nhiên, bạn có thể có một .gitignoretệp trên mỗi thư mục, vì vậy có thể trong trường hợp của bạn, nội dung sau

*.js

ở địa điểm sau

MyPrject/WebApp/Scripts/special/.gitignore

sẽ là đủ?


Tôi đã từng có MyPrject/WebApp/Scripts/special*.jsvà nó phù hợp MyPrject/WebApp/Scripts/specialfile.jscũng như MyPrject/WebApp/Scripts/special/a/b/c/file.js. Tuy nhiên, vì một số lý do mà hành vi đã thay đổi và cách giải quyết hiện tại của tôi là liệt kê các thư mục riêng lẻ. Tôi đang sử dụng GitHub cho Windows.
orad

1
ví dụfind MyPrject/WebApp/Scripts/special -type d -printf 'echo "*.js" >> %h/.gitignore\n git add %h/.gitignore\n' | sh
jthill

9

Điều này làm việc cho tôi trên osx.

lib64/**/__pycache__/
lib/**/__pycache__/
*.py[cod]
.ipynb_checkpoints/
**/.ipynb_checkpoints/
.DS_Store
**/.DS_Store

0

Thử thực thi Thư mục git rm -r --cached MyPrject/WebApp/Scripts/special/ được đề cập của bạn có thể đã được lưu vào bộ nhớ cache bằng git và sẽ hiển thị trên các tệp chưa được theo dõi. Sau khi xóa bộ nhớ cache, hãy chắc chắn rằng bạn đã đề cập đến nó .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.