繁体   English   中英

WSL上的Git:错误:无法解除旧链接 <file> 没有权限

[英]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中编辑该文件,也可以使用nano或将echo文本管道化到WSL(运行git命令的地方)中的终端来编辑该文件。 在WSL中,我对包含文件和文件本身的目录具有linux权限。 停止运行Web服务器的进程可以使我毫无困难地执行git命令,但是启动Web服务器需要花费很长时间,因此这就是我想找到解决办法的原因。

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

注意事项:

  • 这不是linux权限问题; 我可以从WSL内部编辑文件; 只有git命令有问题。
  • 我正在Windows中运行Web服务器进程(大概是在锁定文件),并且我试图找到一种不涉及停止该进程的解决方案。 我可以在Windows和WSL中编辑文件,而无需停止该过程; 只有git命令有问题。

如果我可以同时从WSL和Windows编辑文件,为什么git无法取消链接? 我怎么可以:

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

我的Windows完全是最新的,但我没有进入Insider环。

更新:这是运行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侧的主目录中,并使用\\\\WSL$\\路径在基于Windows的程序中访问它们; 这可能会或可能不会。

Git没有提供避免此问题的选项,因为它假定系统提供了合理的POSIX行为,并且没有强制执行操作的方法,因为该行为源于操作系统中的故意设计决策。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM