Git на WSL: ошибка: невозможно отменить связь со старым <файлом> Отказано в доступе

Я использую git в WSL. Я всегда разрабатываю проект, который использует веб-сервер, который я запускаю в процессе в своей среде IDE в Windows. Когда я пытаюсь вытащить, переключить ветки, спрятать и т.п., я часто получаю это сообщение:

error: unable to unlink old '<filename>': Permission denied

Этот файл всегда является файлом, содержащим код, запускающий веб-сервер.

Я могу редактировать файл в своей среде IDE, а также могу редактировать файл из терминала внутри WSL (где я запускаю свои команды git), используя nano или передавая текст из echo в файл. В WSL у меня есть права Linux на каталог, содержащий файл, и сам файл. Остановка процесса, который запускает веб-сервер, позволяет мне без проблем выполнять команды git, но запуск веб-сервера занимает много времени, поэтому я хочу найти способ обойти это.

Когда возникает эта проблема, команда git checkout (или что-то еще) оставляет мою локальную кассу в раздражающем состоянии, когда некоторые файлы были изменены, а другие нет, что хуже, чем вообще не запускать команду.

Что следует отметить:

  • Это не проблема разрешений Linux; Я могу нормально редактировать файл изнутри WSL; только команды git имеют проблему.
  • Я запускаю процесс веб-сервера в Windows, который (предположительно) блокирует файл, и я пытаюсь найти решение, которое не требует остановки этого процесса. Я могу редактировать файл как в Windows, так и в WSL, не останавливая процесс; только команды git имеют проблему.

Если я могу редактировать файл как из WSL, так и из Windows, почему git не может его отменить? Как я могу:

  1. Заставить git отменить связь с файлом
  2. Прервать операции git, когда файл не может быть отсоединен

Моя Windows полностью обновлена, но я не участвую в программе предварительной оценки.

Обновлять: вот конец вывода от запуска strace git co master:

wait4(4973, error: unable to unlink old 'signal/dev/dev.clj': Permission denied
error: unable to unlink old 'signal/src/clj/signal/lot.clj': Permission denied
error: unable to unlink old 'signal/src/clj/signal/web.clj': Permission denied
M       signal/dev/dev.clj
M       signal/src/clj/signal/lot.clj
M       signal/src/clj/signal/web.clj
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
[{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 4973
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=4973, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
exit_group(0)                           = ?
+++ exited with 0 +++

У вас есть код ошибки в выводе strace?

Biswapriyo 09.07.2019 14:59

может быть, я мог бы получить его, как бы я это сделал? позвольте мне посмотреть, если я могу понять это

Conan 09.07.2019 16:05

я не вижу ничего похожего на код ошибки, если я добавляю к своей команде git strace, но стоит отметить, что команда завершается с кодом выхода 0, переключая ветки (в случае git checkout), и оставляя меня с кучей измененных файлов (тех, которые он не мог удалить).

Conan 09.07.2019 16:15
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
1 352
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это ограничение Windows. Windows по умолчанию не позволяет процессу удалять файл, который используется, и когда Git извлекает файлы, он может отменить связь с некоторыми из них. Это совершенно нормально в Unix, что позволяет удалить используемый файл, но вызывает проблемы в Windows. Параллельные модификации обычно не являются проблемой.

Если вам нужна возможность удалять используемые файлы через Git, вам нужно использовать версии Clojure и Java, работающие в WSL, где вы сможете успешно выполнять эти операции. В качестве альтернативы вы можете попробовать сохранить свою программу в своем домашнем каталоге на стороне WSL и использовать \\WSL$\ путь для доступа к ним в ваших программах для Windows; это может или не может работать.

Git не предоставляет возможность избежать этой проблемы, поскольку предполагает, что системы обеспечивают разумное поведение POSIX, и у него нет возможности принудительно выполнить операцию, поскольку такое поведение проистекает из преднамеренного проектного решения в операционной системе.

Ах, так что модификации в порядке, но проблема с удалением, я не оценил этого. Спасибо

Conan 11.07.2019 09:48

Другие вопросы по теме