Git on WSL: error: unable to unlink old <file> Permission denied

Git on WSL: error: unable to unlink old <file> Permission denied

我在 WSL 中使用 git。我一直在开发一个使用 Web 服务器的项目,我在 Windows 中的 IDE 中有一个进程 运行。当我尝试拉取、切换分支、隐藏等类似内容时,我经常收到此消息:

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

该文件始终是包含启动 Web 服务器的代码的文件。

我可以在 IDE 中编辑文件,也可以从 WSL 中的终端编辑文件(我在 运行 我的 git命令)使用 nano 或管道文本从 echo 到文件中。在 WSL 中,我对包含文件的目录和文件本身拥有 linux 权限。停止运行 Web 服务器的进程使我可以毫无问题地执行我的 git 命令,但是启动 Web 服务器需要很长时间,这就是为什么我想找到解决这个问题的方法。

发生此问题时,git checkout 命令(或其他命令)使我的本地结帐处于令人讨厌的状态,其中一些文件已更改但其他文件未更改,这比没有更糟 运行命令。

注意事项:

如果我可以从 WSL 和 Windows 编辑文件,为什么不能 git 取消链接?我怎样才能:

  1. 强制git取消链接文件
  2. 中止 git 无法取消链接文件的操作

我的 Windows 完全是最新的,但我不在 Insider ring 上。

更新: 这是 运行 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 +++

这是 Windows 的限制。 Windows,默认情况下,不允许进程删除正在使用的文件,当 Git 检出文件时,它可能会取消其中一些文件的链接。这在 Unix 上是完全正常的,它允许您删除正在使用的文件,但它会在 Windows 上引起问题。并发修改通常不是问题。

如果您需要能够通过 Git 删除正在使用的文件,您将需要使用 WSL 中 运行 的 Clojure 和 Java 版本,在那里您可以成功执行这些操作。或者,您可以尝试将您的程序存储在 WSL 端的主目录中,并使用 a \WSL$\ path 在您的 Windows-based 程序中访问它们;这可能有效也可能无效。

Git 不提供避免此问题的选项,因为它假定系统提供理智的 POSIX 行为,并且它无法强制操作,因为行为源于操作系统中的深思熟虑的设计决定。