PHP无法删除.git目录文件的原因及Windows环境下的解决方法
Windows下PHP删除.git目录文件提示Permission denied的原因与解决
问题场景与错误信息
在Windows 10环境中,通过exec执行git clone命令创建.git目录后,使用PHP的Filesystem组件删除该目录下文件时,出现权限拒绝错误:
unlink(C:\www\program_bulter\runtime\source\program\62fc5bba68bfd\20220818110106\source\smart_agriculture\.git\objects\pack\pack-cecd0ead167cdb95559db20cf5a039f055aa1406.idx): Permission denied
原PHP实现代码
最初使用的PHP删除代码如下:
$working_directory = App::getRuntimePath() . 'source/program/'; $local_adapter = new Local($working_directory); $file_system = new Filesystem($local_adapter); $list_content = $file_system->listContents('/'); foreach ($list_content as $content_item) { $output->writeln('删除目录:' . $content_item['path']); if ($content_item['type'] == 'dir') { $file_system->deleteDir($content_item['path']); } else { $file_system->delete($content_item['path']); } } $output->info('清空目录完成:' . $working_directory);
原因分析
- 即便创建目录和执行PHP的是同一用户,Windows下
git clone生成的部分.git文件/目录带有特殊权限属性,PHP的Filesystem组件在非管理员运行状态下,无法突破这些权限限制完成删除。 - 资源管理器能够删除是因为它调用了系统级的权限处理逻辑,而PHP进程不具备对应的权限上下文。
最终解决方法
无法以管理员权限运行PHP的情况下,直接调用系统原生命令处理删除操作,利用系统命令的权限上下文绕过限制,实现代码如下:
$run_command->run(['git', 'clone', $program->git_url, 'sourcecode', '--depth=1']); if (strpos(strtolower(PHP_OS), 'win') === 0) { $run_command->run(['rd', '/s', '/q', win_path($working_directory . '/sourcecode/.git/')], null, 'cmd'); } else { $run_command->run(['rm', '-rf', './sourcecode/.git']); }
内容的提问来源于stack exchange,提问作者惠祥宏
相关产品推荐
相关产品推荐

