Поскольку 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
.