Для класса операционных систем, который я использую, мне нужно было запустить Freebsd5.4. Так как я не хотел бороться с попыткой собрать git на версии bsd, выпущенной до выпуска git, я подумал, что будет полезно использовать git
Arch из Arch sshfs
.
Во всяком случае, я нашел обходной путь, который предложил мне дать sshfs
вариант -o workaround=rename
.
Кажется, это делает git
счастливым, но я не совсем понимаю, что только что произошло ...
Вся страница руководства говорит об обходном пути
fix renaming to existing file
но я совершенно сбит с толку относительно того, что это значит ...
Что именно делает этот вариант?
Ответы:
sshfs использует протокол передачи файлов SSH (SFTP). Обходное решение, которое вы включили, обходит семантику операции rename () над этим протоколом, когда «новое» имя уже существует.
Поведение POSIX для rename () в этом случае заключается в удалении существующего файла и завершении переименования.
В протоколе SFTP вы можете переименовать файл с помощью операции SSH_FXP_RENAME; однако, его поведение, когда целевое имя уже существует, зависит от версии протокола, который вы используете, и от того, какие флаги вы передаете. Страница википедии по протоколу SFTP содержит ссылки на различные проекты RFC для различных версий протокола. В черновике 00 поведение указано как:
В проекте 13 поведение указано как
Чтобы устранить возможный сбой операции rename (), когда целевое имя существует, sshfs предлагает следующий обходной путь (если он включен) :
В этом коде «from» - это существующее имя файла, который мы хотим переименовать, а «to» - это новое имя, которое мы хотим. Оставляя в стороне некоторую длину пути и учет ошибок
Это позволяет избежать конфликта «файл уже существует», но также меняет семантику операций rename (), поэтому вы не захотите делать это по умолчанию.
источник