Git на WSL: ошибка: невозможно удалить старое <file>В доступе отказано - PullRequest
0 голосов
/ 09 июля 2019

Я использую 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 +++

1 Ответ

1 голос
/ 10 июля 2019

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

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

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

...