Я использую 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 не может отсоединить его? Как я могу либо:
- Принудительно git отсоединить файл
- Прервать операции 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 +++