Có cách nào để bỏ qua tất cả các tệp của một loại trong một thư mục?
**
rõ ràng là vô nghĩa với git, vì vậy điều này không hoạt động:
/public/static/**/*.js
Ý tưởng là để phù hợp với các thư mục lồng nhau tùy ý.
Có cách nào để bỏ qua tất cả các tệp của một loại trong một thư mục?
**
rõ ràng là vô nghĩa với git, vì vậy điều này không hoạt động:
/public/static/**/*.js
Ý tưởng là để phù hợp với các thư mục lồng nhau tùy ý.
Câu trả lời:
Chưa bao giờ thử nó, nhưng git help ignore
gợi ý rằng nếu bạn đặt một .gitignore
với *.js
trong /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.
Có vẻ như **
cú pháp được hỗ trợ bởi git
phiên bản 1.8.2.1
theo 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.gitignore
tệ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ệ.
xxx/**
và xxx/
?
xxx/**
nhắm mục tiêu tất cả các tập tin và thư mục bên trong trong xxx
khi xxx/
nhắm mục tiêu xxx
trự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 đó.
**.js
?
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 .gitignore
tệ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 đó và 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/*.js
sẽ khớp /public/static/foo.js
nhưng không /public/static/foo/bar.js
.) Loại bỏ hàng đầu 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)./
sẽ không hoạt động, khớp các đường dẫn như public/static/foo.js
và foo/public/static/bar.js
.
Như @ptyx đã đề xuất, những gì bạn cần làm là tạo tệp <repo>/public/static/.gitignore
và 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/static
thư mục và các thư mục con của nó.
/
sẽ không hoạt động, phù hợp với các đường dẫn như public/static/foo.js
và foo/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.js
sẽ không được khớp bởi vì mẫu không chứa a /
.
Để 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.
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 .gitignore
quanh 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-
.