我正在构建跨平台实用程序,可以安装来自各种来源的东西,包括git。有一次,我需要消除git存储库 - 通过同一个cmd会话中的同一个PHP应用程序创建 - 并获得权限错误:
[Symfony\Component\Filesystem\Exception\IOException]
Failed to remove file "c:\users\ieuser\appdata\local\openserver\.cache\ama-team\vagranted\resource-sets\54b90db6\artifact\.git\objects\f5\e1818e5467665f1f597fb7e044b3f78eabd55e": unlink(c:\users\ieuser\appdata\local\openserver\.cache\ama-team\vagranted\resource-sets\54b90db6\artifact\.git\objects\f5\e1818e5467665f1f597fb7e044b3f78eabd55e): Permission denied.
文件就位(并且它不是目录),它不是通过fopen或类似的东西打开的,php getenv()
调用返回拥有该文件的同一个IEUser,icacls告诉我这个用户没有完全控制指定的文件(输出中的F),我可以从资源管理器中手动删除此文件。所以在顶层似乎一切都是正确的 - 什么可能阻止我从所有者用户下运行的PHP脚本中删除文件?
答案 0 :(得分:2)
答案结果非常简单。 Windows(事实上,它的NTFS,我猜)有一个只读文件属性,git似乎为它的所有内部文件(提交中的blob)提供了这个属性。递归清除该属性允许我按照我想要的方式擦除存储库。