Như đã đề cập trong " git: Làm thế nào để tôi thêm đệ quy tất cả các tệp trong một thư mục con phù hợp với mẫu hình cầu? ", Nếu bạn thoát hoặc trích dẫn chính xác đường dẫn của bạn (như '*.java'
), thì có, git add'*.java'
Git 2.13 (Q2 2017) cải thiện điều đó cho add tương tác:
Xem cam kết 7288e12 (14 tháng 3 năm 2017) của Jeff King ( peff
) .
(Được hợp nhất bởi Junio C Hamano - gitster
- trong cam kết 153e0d7 , ngày 17 tháng 3 năm 2017)
add --interactive
: không mở rộng pathspecs với ls-files
Khi chúng tôi muốn lấy danh sách các tệp đã sửa đổi, trước tiên chúng tôi sẽ mở rộng bất kỳ đường dẫn nào do người dùng cung cấp với " ls-files
", sau đó cung cấp danh sách đường dẫn kết quả dưới dạng đối số thành " diff-index
" và " diff-files
".
Nếu pathspec của bạn mở rộng thành một số lượng lớn các đường dẫn, bạn có thể gặp phải một trong hai vấn đề:
HĐH có thể phàn nàn về kích thước của danh sách đối số và từ chối chạy. Ví dụ:
$ (ulimit -s 128 && git add -p drivers)
Can't exec "git": Argument list too long at .../git-add--interactive line 177.
Died at .../git-add--interactive line 177.
Đó là trên linux.git
kho lưu trữ, có khoảng 20K tệp trong thư mục "trình điều khiển" (không có tệp nào được sửa đổi trong trường hợp này). Thủ thuật " ulimit -s
" là cần thiết để hiển thị vấn đề trên Linux ngay cả đối với một bộ đường dẫn khổng lồ như vậy.
Các hệ điều hành khác có giới hạn nhỏ hơn nhiều (ví dụ: trường hợp trong thế giới thực được nhìn thấy chỉ với 5K tệp trên OS X).
Ngay cả khi nó hoạt động, nó rất chậm. Mã pathspec không được tối ưu hóa cho số lượng lớn đường dẫn. Đây là trường hợp tương tự mà không có ulimit:
$ time git add -p drivers
No changes.
real 0m16.559s
user 0m53.140s
sys 0m0.220s
Chúng ta có thể cải thiện điều này bằng cách bỏ qua " ls-files
" hoàn toàn và chỉ cung cấp các đường dẫn gốc cho các lệnh diff.
Trong lịch sử, ngôn ngữ pathspec được hỗ trợ bởi " diff-index
" yếu hơn, nhưng đó không còn là vấn đề nữa.