Lưu ý rằng bạn sẽ không cần, vì Git 2.5 (quý 2 năm 2015) ' --
' nếu đối số của bạn bao gồm ký tự đại diện ( *
)
Một heuristic để giúp git <cmd> <revs> <pathspec>
quy ước dòng lệnh "" bắt các đường dẫn bị sai là đảm bảo tất cả các tham số không quay vòng trong phần sau của dòng lệnh là tên của các tệp trong cây làm việc, nhưng điều đó có nghĩa là " git grep $str -- \*.c
" phải luôn luôn không rõ ràng với " --
", bởi vì không ai có thể tạo ra một tệp có tên theo nghĩa đen là dấu hoa thị-dot-see.
Git 2.5 mất đi sự heuristic để tuyên bố rằng với một chuỗi ký tự đại diện, người dùng có thể có nghĩa là cung cấp cho chúng ta một đường dẫn .
git checkout 'a*'
# same as
git checkout -- 'a*'
Xem cam kết 28fcc0b (02 tháng 5 năm 2015) của Duy Nguyễn ( nguyenlocduy
) .
(Được hợp nhất bởi Junio C Hamano - gitster
- trong cam kết 949d167 , ngày 19 tháng 5 năm 2015)
pathspec
: tránh sự cần thiết của " --
" khi ký tự đại diện được sử dụng
Khi " --
" thiếu từ dòng lệnh và một lệnh có thể mất cả vòng quay và đường dẫn, ý tưởng là nếu một đối số có thể được xem là cả SHA-1 mở rộng và đường dẫn, thì " --
" được yêu cầu hoặc git từ chối tiếp tục.
Nó hiện đang được thực hiện như:
- (1) nếu một đối số là rev, thì nó không được tồn tại trong worktree
- (2) khác, nó phải tồn tại trong worktree
- (3) khác, "
--
" là bắt buộc.
Các quy tắc này hoạt động cho các đường dẫn theo nghĩa đen, nhưng khi tham gia vào đường dẫn không theo nghĩa đen, hầu như luôn luôn yêu cầu người dùng thêm " --
" vì nó thất bại (2) và (1) thực sự hiếm khi gặp (lấy " *.c
", ví dụ: (1) được đáp ứng nếu có một ref có tên " *.c
").
Bản vá này sửa đổi các quy tắc một chút bằng cách xem xét bất kỳ đường dẫn *
ký tự đại diện hợp lệ ( ) "tồn tại trong worktree".
Các quy tắc trở thành:
- (1) nếu một đối số là một rev, thì nó phải tồn tại trong worktree hoặc không phải là một pathspec ký tự đại diện hợp lệ.
- (2) khác, nó tồn tại trong worktree hoặc là một pathspec ký tự đại diện
- (3) khác, "
--
" là bắt buộc.
Với các quy tắc mới, " --
" không cần thiết hầu hết thời gian khi tham gia pathspec ký tự đại diện.
Với Git 2.26 (Q1 2020), logic phân biệt để phân biệt các sửa đổi và đường dẫn đã được điều chỉnh sao cho các ký tự đặc biệt toàn cầu thoát khỏi dấu gạch chéo ngược không được tính trong quy tắc "ký tự đại diện là pathspec".
Xem cam kết 39e21c6 (ngày 25 tháng 1 năm 2020) của Jeff King ( peff
) .
(Được hợp nhất bởi Junio C Hamano - gitster
- trong cam kết 341f8a6 , ngày 12 tháng 2 năm 2020)
verify_filename()
: xử lý dấu gạch chéo ngược trong quy tắc "ký tự đại diện là pathspecs"
Báo cáo: David Burström
Đã ký: Jeff King
Cam kết 28fcc0b71a ( pathspec
: tránh sự cần thiết của " --
" khi sử dụng ký tự đại diện, 2015-05 / 02):
git rev-parse '*.c'
không có dấu gạch ngang kép.
Nhưng quy tắc mà nó sử dụng để kiểm tra các ký tự đại diện thực sự tìm kiếm bất kỳ đặc biệt toàn cầu nào.
Điều này là quá tự do, vì nó có nghĩa là một mẫu không thực sự phù hợp với bất kỳ ký tự đại diện nào, như " a\b
", sẽ được coi là một đường dẫn.
Nếu bạn có một tập tin như vậy trên đĩa, đó có lẽ là những gì bạn muốn.
Nhưng nếu bạn không, kết quả thật khó hiểu: thay vì nói " there's no such path a\b
", chúng tôi sẽ lặng lẽ chấp nhận nó như một đường dẫn mà rất có thể không khớp với điều gì (hoặc ít nhất là không như bạn dự định).
Tương tự như vậy, tìm kiếm đường dẫn " a\*b
" hoàn toàn không mở rộng tìm kiếm; nó sẽ chỉ tìm thấy một mục duy nhất, " a*b
".
Cam kết này chuyển quy tắc chỉ kích hoạt khi các nhân vật siêu nhân toàn cầu sẽ mở rộng tìm kiếm, nghĩa là cả hai trường hợp đó sẽ báo lỗi (tất nhiên bạn vẫn có thể định hướng bằng cách sử dụng " --
", tất nhiên, chúng tôi chỉ thắt chặt heuristic DWIM).
( DWIM: Làm những gì tôi muốn nói )
Lưu ý rằng chúng tôi đã không kiểm tra tính năng gốc trong 28fcc0b71a .
Vì vậy, bản vá này không chỉ kiểm tra các trường hợp góc này mà còn thêm kiểm tra hồi quy cho hành vi hiện có.