Поскольку Git отслеживает символические ссылки как символические ссылки, путь, который имеет символическую ссылку в своей ведущей части (например path/to/dir/file, где path/to/dirнаходится символическая ссылка где-то еще, будь то внутри или вне рабочего дерева), никогда не может появиться в патче, который корректно применяется Если только тот же патч сначала не удалит символическую ссылку, чтобы разрешить создание каталога там.
Обнаружить и отклонить такой патч.
Точно так же, когда вход создает символическую ссылку, path/to/dirа затем создает файл path/to/dir/file, мы должны пометить его как ошибку без фактического создания path/to/dirсимволической ссылки в файловой системе.
Вместо этого для любого патча во входных данных, который оставляет путь (т. Е. Не удаляет) в результате, мы проверяем все начальные пути по результирующему дереву, которое патч будет создавать, проверяя все патчи на входе, а затем цель патча. приложение (либо индекс, либо рабочее дерево).
Таким образом, мы:
- поймать шалость или ошибку, чтобы добавить символическую ссылку
path/to/dirи файл path/to/dir/fileодновременно,
- разрешая допустимый патч, который удаляет символ,
link path/to/dirа затем добавляет файл path/to/dir/file.