Я использую git в WSL. Я всегда разрабатываю проект, который использует веб-сервер, который я запускаю в процессе в своей среде IDE в Windows. Когда я пытаюсь вытащить, переключить ветки, спрятать и т.п., я часто получаю это сообщение:
error: unable to unlink old '<filename>': Permission denied
Этот файл всегда является файлом, содержащим код, запускающий веб-сервер.
Я могу редактировать файл в своей среде IDE, а также могу редактировать файл из терминала внутри WSL (где я запускаю свои команды git), используя nano
или передавая текст из echo
в файл. В WSL у меня есть права Linux на каталог, содержащий файл, и сам файл. Остановка процесса, который запускает веб-сервер, позволяет мне без проблем выполнять команды git, но запуск веб-сервера занимает много времени, поэтому я хочу найти способ обойти это.
Когда возникает эта проблема, команда git checkout
(или что-то еще) оставляет мою локальную кассу в раздражающем состоянии, когда некоторые файлы были изменены, а другие нет, что хуже, чем вообще не запускать команду.
Что следует отметить:
Если я могу редактировать файл как из WSL, так и из Windows, почему 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 +++
может быть, я мог бы получить его, как бы я это сделал? позвольте мне посмотреть, если я могу понять это
я не вижу ничего похожего на код ошибки, если я добавляю к своей команде git strace
, но стоит отметить, что команда завершается с кодом выхода 0, переключая ветки (в случае git checkout
), и оставляя меня с кучей измененных файлов (тех, которые он не мог удалить).
Это ограничение Windows. Windows по умолчанию не позволяет процессу удалять файл, который используется, и когда Git извлекает файлы, он может отменить связь с некоторыми из них. Это совершенно нормально в Unix, что позволяет удалить используемый файл, но вызывает проблемы в Windows. Параллельные модификации обычно не являются проблемой.
Если вам нужна возможность удалять используемые файлы через Git, вам нужно использовать версии Clojure и Java, работающие в WSL, где вы сможете успешно выполнять эти операции. В качестве альтернативы вы можете попробовать сохранить свою программу в своем домашнем каталоге на стороне WSL и использовать \\WSL$\
путь для доступа к ним в ваших программах для Windows; это может или не может работать.
Git не предоставляет возможность избежать этой проблемы, поскольку предполагает, что системы обеспечивают разумное поведение POSIX, и у него нет возможности принудительно выполнить операцию, поскольку такое поведение проистекает из преднамеренного проектного решения в операционной системе.
Ах, так что модификации в порядке, но проблема с удалением, я не оценил этого. Спасибо
У вас есть код ошибки в выводе strace?