Với Git 2.3.2+ (Q1 2015), có một trường hợp khác mà Git sẽ không theo symlink nữa: xem commit e0d201b của Junio C Hamano ( gitster
) (người duy trì Git chính)
apply
: không chạm vào tệp ngoài liên kết tượng trưng
Bởi vì Git theo dõi liên kết tượng trưng là các liên kết tượng trưng, một con đường mà có một liên kết tượng trưng trong phần đầu của nó (ví dụ path/to/dir/file
, nơi path/to/dir
là một liên kết tượng trưng đến một nơi khác, có thể là bên trong hay bên ngoài cây làm việc) không bao giờ có thể xuất hiện trong một bản vá mà hợp lệ áp dụng , trừ khi bản vá tương tự trước tiên loại bỏ liên kết tượng trưng để cho phép một thư mục được tạo ở đó.
Phát hiện và từ chối một bản vá như vậy.
Tương tự, khi một đầu vào tạo ra một liên kết tượng trưng path/to/dir
và sau đó tạo một tệp path/to/dir/file
, chúng ta cần gắn cờ nó là một lỗi mà không thực sự tạo path/to/dir
liên kết tượng trưng trong hệ thống tệp.
Thay vào đó, đối với bất kỳ bản vá nào trong đầu vào để lại một đường dẫn (nghĩa là không xóa) trong kết quả, chúng tôi kiểm tra tất cả các đường dẫn đối với cây kết quả mà bản vá sẽ tạo bằng cách kiểm tra tất cả các bản vá trong đầu vào và sau đó là mục tiêu của bản vá ứng dụng (chỉ mục hoặc cây làm việc).
Bằng cách này, chúng tôi:
- bắt một trò nghịch ngợm hoặc một sai lầm để thêm một liên kết tượng trưng
path/to/dir
và một tập tin path/to/dir/file
cùng một lúc,
- trong khi cho phép một bản vá hợp lệ loại bỏ một ký hiệu
link path/to/dir
và sau đó thêm một tệp path/to/dir/file
.
Điều đó có nghĩa là, trong trường hợp đó, thông báo lỗi sẽ không phải là một thông báo chung chung "%s: patch does not apply"
, nhưng là một thông báo cụ thể hơn:
affected file '%s' is beyond a symbolic link